Excel VBA: カーソルのある行と同じデータを持つ行群にマーク?
お世話になります。
以前、現在選択されているセルを含む行の特定の列にマークを打つという問題がありまして、こちらで回答をいただきました。
http://okwave.jp/qa4787458.html
さて、似た問題でまた詰まってしまいました。
「現在カーソルがある行の、ある列の値と、同じ列の値が同じ行のみ、別の列にマークを打つ」というものです。
5行5列のシートがあり、2列目が注目しているデータだとします。
マークは5列目に打ちたいです。
カーソル(アクティブセル)を▽であらわします。
(例題1)
\ABCDE
1□□米□□
2□□国□□
3▽□国□□
4□□国□□
5□□米□□
いま、A3がアクティブセルです。
C2、C3、C5に「国」というデータがあります。
C列の他の行には違うデータ(「米」)があります。
カーソルのある3行目のC列の「国」に注目し、同じC列に「国」が入っている3つの行のE列にマーク(*)を打ちます。
処理後はこうしたいです。
\ABCDE
1□□米□□
2□□国□*
3▽□国□*
4□□国□*
5□□米□□
以下、処理前、処理後でやりたい処理を示します。
(例題2)
\ABCDE
1□□国▽□
2□□英□□
3□□国□□
4□□米□□
5□□国□□
=>
\ABCDE
1□□国▽*
2□□英□□
3□□国□*
4□□米□□
5□□国□*
(例題3)
\ABCDE
1□□英□□
2□□国□□
3□□米□□
4□□国□□
5□□国▽□
=>
\ABCDE
1□□英□□
2□□国□*
3□□米□□
4□□国□*
5□□国▽*
実際にはシートはもっと大きく、注目する列がC以外に2列あるパターンもあるのですが、さしあたり上の例について解決したいと思います。
最初は例によって1行1行見ていました。
Sub test()
Dim myRow as long
Dim myCol as long
For myRow = 1 to 65536
For myCol = 1 to 3
If Cells(myRow, myCol).Value = "国" Then
Cells(myRow, 5).Value = "*"
Exit For
End If
Next myCol
Next myRow
End Sub
しかしこれだとシートが広いので遅くなります。
あるキーを押すと処理が走って、処理中はずっとオペレーターが待っているというフローなので、一瞬でも早くしたいところです。
次に、オートフィルターを使って3列目に「国」がある行を表示にし、上の回答で教えていただいた Intersect 関数を使ってうまくいったのですが、処理前にすでにオペレーターがフィルター設定している場合があり、そのフィルター設定が壊れると作業に支障があるのであきらめました。
処理前のオートフィルターを記憶して、処理後に復元するというのもやってみたのですが、プログラムが複雑になるので避けたい感じです。
なお、Excel 2007 と書きましたが、オペレーターによっては Excel 2003 を使い続けている人がいることが最近判明しました。
今は Excel 2003 形式の XLS にマクロをアタッチして XLSTART に入れさせています。
FileSearch のような 2007 で廃止された機能を使わない限り、2003 のマクロは 2007 で動くようです。
以上です。
よろしくお願いします。