エクセルマクロ・VBA達人養成塾 小川です。
2月19日の発展コースを受講されたとある方から、一昨日のお昼ごろ、こんなメール相談を受けました。
今実務でマクロを書いておりまして、うまくいかなかった点について質問させてください。
<やりたいこと>
特定のエクセルブックのすべてのシートについて、グレーの行については非表示としたい
<作成結果>
まず、1シートずつに対してのマクロは以下の通りできました。
Sub kakushi()
Dim cnt
Dim mn As String
mn = Range(“B65536”).End(xlUp).Row
For cnt = 3 To mn
If Range(“B” & cnt).Interior.ColorIndex = 16 Or Range(“B” & cnt).Interior.ColorIndex = 48 Or Range(“B” & cnt).Interior.ColorIndex = 54 Then
Rows(cnt).EntireRow.Hidden = True
End If
Next
End Sub
次に、ブック内の全シートに展開するマクロを作成しようとしたところ、こちらがうまくいきませんでした。。
例えば、For Each構文でできるのかな?と思い、以下のようなマクロを書いてみたのですが、うまくいきませんでした。
Sub kakushizenbu()
Dim ichiran As Worksheet
For Each ichiran In Worksheets
Dim cnt
Dim mn As String
mn = Range(“B65536”).End(xlUp).Row
For cnt = 3 To mn
If Range(“B” & cnt).Interior.ColorIndex = 16 Or Range(“B” & cnt).Interior.ColorIndex = 48 Or Range(“B” & cnt).Interior.ColorIndex = 54 Then
Rows(cnt).EntireRow.Hidden = True
End If
Next
Next
End Sub
ブック内シート串刺しで、各シートに処理をかけるにはどのように書けばよいのでしょうか?
ご教示いただけると助かります。
ということ。
彼は、この課題の、「すべてのシートについて」という部分でひっかかっていたらしい。
For Each構文で複数シートを処理する構文を作るとき、よくやる失敗。
僕も、今でも、マクロを書く過程で、こういうミスはしょっちゅうやる。ただ、違いは、見た瞬間「またやっちまった。まー、すぐなおすか ヾ(´ー`)ノ」で済むか、慣れが足りなくて、すぐには気づかないか。
以下、添削例。
まずは、他がゴチャゴチャしていて肝心の話題にフォーカスしにくいので、「すべてのシートについて」、確実にくり返し処理をできるようにするマクロを作ってみよう。
さらに参考になるよう、NG例も示す。
ということで、以下の3つのマクロを作成した。
シートが10枚くらいあるエクセルファイルを用意して、順番に実行してみて欲しい。
結果は…。以下のようになったはず。
という感じ。
いただいたマクロでは、hoge1のようになっていた。対処法としては、hoge2かhoge3のようにすればよい、というわけ。
というわけで。
前提はともかく、以下、いただいたマクロを添削。
まず、If 文がゴチャゴチャと長いのが問題。このおかげで、可読性が低くなっている。
なので、Select Caseで書き直してみた。
ついでに、灰色でない場合は表示するよう、明示的に書きなおしてみた。
End Sub
これで、準備完了。
以下、hoge2, hoge3 のやり方になるよう、書き直してみよう。
ということで、ちょうど僕がPCの前で仕事をしていたタイミングだったということもあり、一時間もしないうちに、無事に返信できた。
もともと勘のいい人だということは分かっていたので、上記の3つのサンプルを書いたテキストファイルを作り、「これを参考にしてください!」と書き添えて送っただけ。
(ソース中でコメントは入れましたが)
夕方になって、返信があった。
いただいた内容で理解できました。
ありがとうございました。助かりました。
とのことでした。
確実にスキルがある、と思しき人への対応は、そっけなくていい加減な手抜きで済む簡潔でも、的を抑えればいいので楽ですね ヾ(´ー`)ノ
今回のポイントは…。
という感じでしょうか。
人のお役に立てると、気分がよいですね。ではでは☆