- ベストアンサー
エクセルVBAのAutoFilter操作において、特定のセルのみを対象にする方法
- Excel2000のマクロでAutoFilterを使用して特定のセルを含むROWを操作対象にする方法を解説します。
- 特定のセルを一つだけ選択して実行すると全ての対象が選択されてしまう問題について、解決策を提案します。
- コード内で使用する特定のセルの値を取得し、そのセルの色を変えて目印にする処理も紹介します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Intersectメソッドを使って、Loop対象範囲を最初にSetしてしまえば良いと思います。 ついでに見出し行も除く事ができます。 Dim CodeNumber As String Dim PartNumber As String Dim activeCells As Range Dim activeRow As Long Dim targetRng As Range '追加 On Error Resume Next With Me.AutoFilter.Range Set targetRng = Intersect(Selection, .SpecialCells(xlVisible), .Offset(1)) End With On Error GoTo 0 If Not targetRng Is Nothing Then With Me For Each activeCells In targetRng activeRow = activeCells.Row CodeNumber = .Cells(activeRow, 2).Value PartNumber = .Cells(activeRow, 3).Value '色を変えて目印にする .Cells(activeRow, 2).Interior.ColorIndex = 34 Call ちょっとした処理(CodeNumber, CodeName) Next activeCells End With End If Set targetRng = Nothing On Error制御は、SelectionがRangeでなかった場合とAutoFilterかかってなかった場合の為。 シートモジュールに書かれている事前提に Me を使ってますが、 標準モジュールの場合は ActiveSheet などに変えてください。
その他の回答 (3)
- nattocurry
- ベストアンサー率31% (587/1853)
追記: activeRow=~~~ も Selection.Count が 1 かどうかで処理を変えます。
- nattocurry
- ベストアンサー率31% (587/1853)
Selection.Count が 1 かどうかを調べて、処理を変えてはどうでしょうか? 私なら、 CodeNumber=~~~ PartNumber=~~~ の部分を、Selection.Count が 1 かどうかで処理を変えて、 Next の手前で、Selection.Count が 1 だったら、Exit For で強制的に Forループを抜けるようにします。
お礼
とても早い回答ありがとうございます。 これは、考えたのですが、只でさえスパゲッティボールのプログラムなので 老化の始まった私のあたまでこれ以上複雑にするとBUGの元と敬遠してました。 また、よろしくお願いします。 m(_ _)m
- myRange
- ベストアンサー率71% (339/472)
(条件) 表の開始セル: A1 見出し行__: 1行目 データ行__: 2行目以降~ '----------------------------------------------- Private Sub ボタン1_Click() Dim CodeNumber As String Dim PartNumber As String Dim ActiveRow As Long 'フィルターで抽出された範囲の取得 Dim myRange As Range Set myRange = Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible) 'フィルターで抽出された範囲外は無視 If Intersect(ActiveCell, myRange) Is Nothing Then Exit Sub '1行目の見出し行は無視 If ActiveCell.Row = 1 Then Exit Sub ActiveRow = ActiveCell.Row CodeNumber = Cells(ActiveRow, 2).Value PartNumber = Cells(ActiveRow, 3).Value Cells(ActiveRow, 2).Interior.ColorIndex = 34 Call ちょっとした処理(CodeNumber, ●CodeName) End Sub '---------------------------------------------- 今回の件とは関係ないですが、 最後の、"ちょっとした処理"の引数●CodeNameは宣言されてないですね。 以上です。
お礼
明快な回答ありがとうございました。 ついでのDEBUGまでして頂いて(^^;;;ありがとうございます。 m(_ _)m
補足
Intersectを使って希望のプログラムとなりました。 For Each ループを使ってこれでばっちりでした。 Private Sub ボタン1_Click() Dim CodeNumber As String Dim PartNumber As String Dim activeCells Dim activeRow As Long Dim myRange As Range Set myRange = Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible) For Each activeCells In Intersect(Selection, myRange) activeRow = activeCells.Row If activeRow > 1 Then ' タイトル行は除外 CodeNumber = Cells(activeRow, 2).Value PartNumber = Cells(activeRow, 3).Value '色を変える Cells(activeRow, 2).Interior.ColorIndex = 34 Call ちょっとした処理(CodeNumber, PartNumber) End If Next activeCells End Sub
お礼
ありがとうございます。 細かに手をいれて頂きError処理まで面倒みて頂いてありがたいです。 また宜しくお願いします。