• ベストアンサー

エクセル 網掛けしてあるセルの行を残してそれ以外の行を削除するVBA

windows-xp、エクセル2003を使っています。 エクセルデータがA列からU列まであります。 (1000件程かな、時々AA列まである時もあります) G列には、網掛けしてあるセルがあります。 そこで!! 網掛けしてあるセルの行だけを残して、網掛けがされていない行のデータを一気に削除する!というマクロ(VBA)を作りたいのですが、どうすればよいでしょうか? VBAまだ、よくわかっていないので、初心者レベルでわかりやすく教えてくださると助かります。 宜しくお願い致しますm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

一応、作ってみました。その前のマクロの処理の続きに動かすのか、それとは別のタイミングで処理するのかわからなかったので、単独のプロシージャとしています。 もしその前のマクロの中の処理に組み込みたいときは、最後に Call 水色の網掛け を追加すればいいです。(プロシージャ名は適当なので変更可能です。実際の業務にあわせて処理内容がわかる名前にすることをお勧めします) Sub 水色の網掛け()  Dim Title As Variant, T As Variant  Dim R As Range    '検索するタイトル行の配列を作成  Title = Array("品目テキスト", "明細")    'Titleの全ての要素Tについての処理を繰り返す  For Each T In Title   'タイトル行(2行目)から特定のタイトルを検索(完全一致)   Set R = Rows(2).Find(What:=T, LookAt:=xlWhole)   If R Is Nothing Then    'タイトルが見つからない場合、エラー画面を出す。    MsgBox ("タイトル行に「" & T & "」がありません")   Else    '見つかったタイトルセルから最後の行までに網掛け設定    With R.Resize(Cells(Rows.Count, R.Column).End(xlUp).Row - 1).Interior     .ColorIndex = 34 '薄い水色     .Pattern = xlDown '右下がり斜線 縞    End With   End If  Next End Sub

mipomipo
質問者

お礼

お礼と締め切りが遅くなり申し訳ありませんm(_ _)m わかりやすい回答だったので、大変勉強になり助かりました!! また、教えていただけたら・・・・と思いました。 ありがとうございました。

mipomipo
質問者

補足

たびたびすみません!! 別件ですが、今これおわかりますか?! ↓ http://oshiete1.goo.ne.jp/qa2953056.html 今すぐしりたいのですが・・・ ルールにそらず申し訳ありませんが!! 今どうしても急な回答がほしくて・・・ よろしくお願いいたします!!

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

> 2行目のセルには、いろいろな項目があるのですが、 > 「品目テキスト」「明細」だけに水色で網掛けをしたいのです。 > そういうときのVBAはどうなりますか? ご質問の回答をする前に、何点か確認させてください。 プログラムを書くときには、厳密に「何がしたいか」が わかっていないと、正確に書けないので。 ・「品目テキスト」「明細」の列は決まっていて、その列名を指定して水色にするのでしょうか。それとも、シート構成が変わる可能性があって、2列目から「品目テキスト」「明細」の文字列を検索して特定して、水色にするのでしょうか。(この場合、行タイトルが変わるとマクロは正常に動かなくなります) ・水色の網掛けをするのは、該当する列の2行目から最後の行まで、ということでしょうか。それともデータ行だけ、あるいはタイトル行だけでしょうか。 ・「水色」というのは、セルの書式設定で「パターン」を設定するときに出てくる色のうち、下から2番目、右から4番目の色でよろしいでしょうか。 ・「網掛け」は同じくセルの書式設定の「パターン」ボタンを押したときに出てくるパターン一覧のうち、どれでしょうか。パターンのサンプルの上にマウスを乗せると、「75%灰色」とか「50%灰色」とか出てきます。このうちのどれかを教えてください。 以上、補足をお願いします。

mipomipo
質問者

補足

お手数おかけしています。 補足します。 (1)「品目テキスト」「明細」の列は決まっていません。 シート構成が変わる可能性があります。 「2行目に項目名が入っている」ということと、「その項目名は変わらない」ということは確かなのです。 が、A列に「品目テキスト」がくる場合もあるし、A列に「明細」の文字列がくる場合もあるのです。 前述しましたが、項目名は変わらないので、項目で検索して特定させて、水色にするというようにしたいのです。 (2)水色の網掛けをするのは、該当する列の2行目から最後の行まででお願いします。 (3)「水色」というのは、セルの書式設定で「パターン」を設定するときに出てくる色のうち、下から1番目、右から4番目の色でお願いします。というわけで、正式には「薄い水色」でした。すみません!! (4)「網掛け」と言っていたのは、下から2番目の左から3番目です。 本当にいろいろ教えていただいており、大変恐縮です。 何卒、宜しくお願い致しますm(_ _)m

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

ご希望にお応えしてマクロを拡張してみました。 ・日付のフォーマットが書かれてないので、とりあえず「4月14日」という形式にしています。 ・網掛けされたセル(G列)の数を取得するのに、網掛け以外の行を削除した後、G列の一番最後にデータが入っている行を割り出して、3行目からカウントということなのでその数から-2を引いて算出しています。もしG列にデータが入ってなく空の場合がある、というのであれば、この方法では誤った値が表示されてしまう可能性があるので、その場合は別の方式に修正するので補足をお願いします。 Sub 網掛けのない行を削除()  Dim i As Integer  Dim B As Integer  'G列が網掛けでない行を削除  For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1   If Cells(i, "G").Interior.Pattern = xlNone Then    Rows(i).Delete   End If  Next    '先頭に1行挿入  Rows(1).Insert    'G1セルに2週間後の日付を設定  '日付の指定は 「4月1日」 の形式。  '「2007/4/1」の様にする場合は "yyyy/m/d"  '「4/1」のようにするときは、"m/d" に変更してください。  Range("G1").NumberFormatLocal = "m月d日"  Range("G1").Value = Date + 14    'H1セル設定  Range("H1").Value = "←次回進捗日"    'I1セル設定。G列の最後にデータが入っている行からデータ数を算出  Range("I1").Value = Cells(Rows.Count - 1, "G").End(xlUp).Row - 2    'L1セル設定  Range("L1").Value = "/"    'N1に外枠罫線設定  For B = 1 To 4   With Range("N1").Borders(B)    .LineStyle = xlContinuous    '次の行はN1セルの外枠の罫線の太さ。中(xlMedium)を指定しているが、    '細い線の場合は xlThin、太い線の場合は xlThick に変更してください。    .Weight = xlMedium    .ColorIndex = xlAutomatic   End With  Next    'Q1セル設定  Range("Q1").Value = "←未引当" End Sub

mipomipo
質問者

補足

お礼が遅くなりすみません。 G列の解説、かなりわかりやすく、納得しました。 その他の解説もどういう意味なのかがわかって大変勉強になっています。 そうやってVBAを組み立てていくのですね。 ありがとうございますm(_ _)m また補足ではないのですが、教えてください。 2行目のセルには、いろいろな項目があるのですが、 「品目テキスト」「明細」だけに水色で網掛けをしたいのです。 そういうときのVBAはどうなりますか? 質問が一回で済まなくて申し訳ありませんが、宜しくお願い致しますm(_ _)m

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

Alt+F11でVBAの画面を開き、左側のツリーからブック名を選択し、右クリックから「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。 Sub 網掛けのない行を削除()  Dim i As Integer  For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1   If Cells(i, "G").Interior.Pattern = xlNone Then    Rows(i).Delete   End If  Next End Sub その画面でF5キーを押すか、Alt+F11でExcelの画面に戻ってAlt+F8からマクロを実行してみてください。 エラーが出たり、希望の動作と違ったら補足をお願いします。なお、マクロは実行したら元に戻せないので、ファイルのバックアップをとっておいた方がよいでしょう。

mipomipo
質問者

補足

大変わかりやすい回答で、一発で出来てしまいました!!! ありがとうございました!!!!! VBAに詳しい方だと察します。 お願いついでにもう少しマクロを教えてください。 上記のマクロを走らせてから、 ⇒「列1」に1行挿入させて、 ⇒セル「G1」に、マクロを走らせた日から2週間後の日付が出てくるようにして、 ⇒セル「H1」に、『←次回進捗日』という言葉をいれて、 ⇒セル「I1」に、網掛けされたセルの個数を表示させたい。  但し、網掛けされたセルの数え始めは、3行目から数えること。  なぜかというと、1行目は、空欄になっており、前述したことが書かれてあるはずだから。2行目は「各項目の名称」が入っているので。 ⇒そして、セル「L1」に『/』という記号をいれて、 ⇒セル「N1」に罫線(外枠)をつけて、 ⇒セル「Q1」に『←未引当』という言葉をいれたい。 補足欄で、このボリュームの質問はどうかとも思いますが、VBAを大変熟知してされている方と察し、もし、お答え頂けるようでしたらお願いしたいと思います。 本当に厚かましくて申し訳ありませんが、何卒宜しくお願い致します。

関連するQ&A