エクセルVBAのAutoFilter操作において、特定のセルのみを対象にする方法

このQ&Aのポイント
  • Excel2000のマクロでAutoFilterを使用して特定のセルを含むROWを操作対象にする方法を解説します。
  • 特定のセルを一つだけ選択して実行すると全ての対象が選択されてしまう問題について、解決策を提案します。
  • コード内で使用する特定のセルの値を取得し、そのセルの色を変えて目印にする処理も紹介します。
回答を見る
  • ベストアンサー

エクセルVBAの質問ですがここでよかったでしょうか?

エクセルVBAの質問ですがここでよかったでしょうか? Excel2000のマクロを組んでいます。 AutoFilterを使って選んだセルのうち、更にマウスで選択したセルを含むROWを 操作対象にしたいのですが、困っています。 ここにあるコードで概ね動くのですが、セルを一つだけ選択して実行すると 表示されている全てのセルが対象になってしまうようです。 複数選ぶと期待通りの動作になります。 .SpecialCells(xlVisible)を削除すると、この問題は解消するのですが、 AutoFilterで非表示にしたセルまで選択されてしまいます。 なにか良い解決法はないでしょうか? Private Sub ボタン1_Click() Dim CodeNumber As String Dim PartNumber As String Dim activeCells Dim activeRow As Long For Each activeCells In Selection.SpecialCells(xlVisible) activeRow = activeCells.Row If activeRow > 1 Then 'タイトルROWは選んでも無視する CodeNumber = Cells(activeRow, 2).Value PartNumber = Cells(activeRow, 3).Value '色を変えて目印にする Cells(activeRow, 2).Interior.ColorIndex = 34 Call ちょっとした処理(CodeNumber, CodeName) End If Next activeCells End Sub

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.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 などに変えてください。

sukosi_vba
質問者

お礼

ありがとうございます。 細かに手をいれて頂きError処理まで面倒みて頂いてありがたいです。 また宜しくお願いします。

その他の回答 (3)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

追記: activeRow=~~~ も Selection.Count が 1 かどうかで処理を変えます。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.2

Selection.Count が 1 かどうかを調べて、処理を変えてはどうでしょうか? 私なら、 CodeNumber=~~~ PartNumber=~~~ の部分を、Selection.Count が 1 かどうかで処理を変えて、 Next の手前で、Selection.Count が 1 だったら、Exit For で強制的に Forループを抜けるようにします。

sukosi_vba
質問者

お礼

とても早い回答ありがとうございます。 これは、考えたのですが、只でさえスパゲッティボールのプログラムなので 老化の始まった私のあたまでこれ以上複雑にするとBUGの元と敬遠してました。 また、よろしくお願いします。 m(_ _)m

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

(条件) 表の開始セル: 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は宣言されてないですね。 以上です。  

sukosi_vba
質問者

お礼

明快な回答ありがとうございました。 ついでのDEBUGまでして頂いて(^^;;;ありがとうございます。 m(_ _)m

sukosi_vba
質問者

補足

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

関連するQ&A

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • エクセルVBAを教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() Dim d1 As Long Dim d2 As Long Dim ret As Variant Dim FindValue As String Dim TotalAddress As String If Range("E1").Value = "" Or Range("F1").Value = "" Then MsgBox "該当する場所にデータが入っていません。", vbCritical Exit Sub End If d1 = Range("A65536").End(xlUp).Offset(1).Row d2 = Range("B65536").End(xlUp).Offset(1).Row FindValue = """" & Range("E1").Value & Range("F1").Value & """" TotalAddress = Range("A1").Resize(d1).Address & "&" & Range("B1").Resize(d1).Address ret = Evaluate("MATCH(" & FindValue & "," & TotalAddress & ",0)") If IsError(ret) Then Cells(d1, 1) = Range("E1").Value Cells(d2, 2) = Range("F1").Value Else MsgBox "既に同じ組み合せがあります。", vbInformation End If End Sub というものを作ったのですが、E1=18、F1=1及びコマンドボタンを別シートに作成し、上記の表への登録をできるようにしたいのですが、なにかいい方法はありませんか?

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • Excel VBA ・・・教えてください

    何度も質問させて頂いてます。すみません、 下記のプログラムはこの場で教えて頂いたプログラムで、 実行すると●の後を▲や■が追いかける動きをします。 下記のプログラムをある程度使用して 1~20の数字が順々で追いかけっこする プログラムを作成するにはどのようにすればいいのでしょうか… できればプログラムは長めにならず 20の数字から簡単に増やすことのできるような そんなプログラムが作成したいです… どなたかアドバイスお持ちの方 教えて下さいお願いします... Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim X1 As Integer, Y1 As Integer Dim X2 As Integer, Y2 As Integer Dim maru As String, yoko As String, tate As String Dim sankaku As String, shikaku As String Sub 描画() Cells(Y2, X2).Value = shikaku Cells(Y1, X1).Value = sankaku Cells(Y, X).Value = maru End Sub Sub 削除() Cells(Y2, X2).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() X2 = X1 Y2 = Y1 X1 = X Y1 = Y If yoko = "右" Then X = X + 1 Else X = X - 1 End If If X = 30 Then yoko = "左" ElseIf X = 1 Then yoko = "右" End If If tate = "上" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 20 Then tate = "下" ElseIf Y = 1 Then tate = "上" End If End Sub Sub main() maru = "●" sankaku = "▲" shikaku = "■" X = 1 Y = 1 X1 = 1 Y1 = 1 X2 = 1 Y2 = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • エクセルのVBAについて教えてください。

    以前に下記のような内容のプログラムを作成したいと投稿致しましたら dim row as Integer for row = 1 to 65535 if (selectSheet.Cells(1, row) = "") then selectSheet.Cells(1, row) = "#####" EndIf をアレンジしたいのです。 上記のプログラムが構築されているコマンドボタンと同じuserformにオプションボタンを5個、コンボボックスを一つ作りました。 オプションボタン1を選択するとコンボボックスにはあ行が。 オプションボタン2を選択するとコンボボックスにはか行が。 オプションボタン3を選択するとコンボボックスにはさ行が。 オプションボタン4を選択するとコンボボックスにはた行が。 オプションボタン5を選択するとコンボボックスにはな行が。 選択できるようにしたいのです。 次に選んだオプションボタンと同名前のシートに上記の#####が入力されるようにしたいのですが、どのようにすればいいのですか? このように教えて頂きました。 Public myop As Integer 'オプション選択保持用 Private Sub CommandButton1_Click() Dim row As Integer Dim mykey As String '比較キー '選択したオプションボタンにより '比較キーと選択保持用変数に各値を代入 Select Case True Case OptionButton1: mykey = "[あ-お]*": myop = 1 Case OptionButton2: mykey = "[か-こ]*": myop = 2 Case OptionButton3: mykey = "[さ-そ]*": myop = 3 Case OptionButton4: mykey = "[た-と]*": myop = 4 Case OptionButton5: mykey = "[な-ほ]*": myop = 5 Case Else: myop = 0 End Select If myop = 0 Then Exit Sub For row = 1 To 65535 If ActiveSheet.Cells(1, row).Value Like mykey Then ActiveSheet.Cells(1, row) = "#####" End If Next row End Sub これを流用して自分でいじりたいのですが、私が未熟ですので、コードの意味、役割がさっぱりわかりません。 わがままな質問ではございますが、どなたか上記のコードの意味を教えて頂けませんか? よろしくお願い致します。

  • VBA のコードについて

    すみません、以前にも同じようなご質問をさせて頂いたのですが、どうしても以下のマクロがうまく機能しません。 新しいブックは作成されるのですが、End If以降の検索結果が反映(コビー)されません。 コードに問題があるかアドバイス頂けますと幸いです。 どうぞ宜しくお願いいたします。 Sub sort() Dim i As Long Dim grp As String Dim newBookName As String Dim newBookPath As String Dim newBook As Workbook For i = 2 To 4 LOB = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) newBookName = Workbooks("test").Worksheets("grpリスト").Cells(i, 2) & ".xlsx" newBookPath = ThisWorkbook.Path & "\" & newBookName '指定したパスにファイルが作成済でないかを確認。 If Dir(newBookPath) = "" Then '新しいファイルを作成 Set newBook = Workbooks.Add '新しいファイルをVBAを実行したファイルと同じフォルダ保存 newBook.SaveAs newBookPath Else '既に同名のファイルが存在する場合はメッセージを表示 MsgBox "既に" & newBookName & "というファイルは存在します。" End If With Workbooks("test").Worksheets("マスタ0701").AutoFilterMode = False With .Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).copy Workbooks(grp).Worksheets("Sheet1").Range("A1") '.AutoFilter End With End With Next i End Sub

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

  • エクセルVBAとmsg関数

    こんばんは。 エクセルVAB初心者です。 現在、エクセル2003で以下の画像のような 表を作成しました。 上段が請求書データ(シート1)で、 下段が請求書の印刷フォーム(シート2)です。 VBAで実行する処理は、請求書データNOをそれぞれ 任意でクリックし、選択しているNOの行データをシート2にそれぞれ 転記していき、一括で印刷するものです。 以下のように、コードを作りました。 Sub 発行() Dim i As Range Dim m As Integer Dim W1 As String With Selection W1 = Cells(.Row, 1).Value & " ~ " & _ Cells(.Rows.Count + .Cells(1, 1).Row - 1, 1).Value & vbCrLf & _ " の請求書を発行しますか?" m = MsgBox(W1, vbYesNoCancel) If m <> vbYes Then Exit Sub For Each i In .Resize(, 1) With Sheets("Sheet2") .Range("b1").Value = Cells(i.Row, 1).Value .Range("e1").Value = Cells(i.Row, 2).Value .Range("c5").Value = Cells(i.Row, 3).Value .Range("b3").Value = Cells(i.Row, 4).Value .Range("c6").Value = Cells(i.Row, 5).Value .PrintOut End With Next End With End Sub ここで質問なのですが、"の請求書を発行しますか?" の後に、選択している行の数を(合計O枚)のように 表示したいのですが、どのようなコードを入れればいいのでしょうか。 また、メッセージボックスのウインドウの中の文字が 小さいので、もう少し大きくしたいのです。 以上の2点ですが、お願いします。

  • ▲ExcelのVBA▼困っています

    何度もVBAで質問させてもらい助けてもらっています。 懲りずにまた質問ですが… 下のプログラムは"●"が跳ね返るものなのですが… ●の後を■と▲が追うようなプログラムにするには なにを追加すればいいのでしょうか…?; どなたか教えて下さい;;お願いします;; Dim time1 As Integer, time As Integer Dim X As Integer, Y As Integer Dim maru As String, yoko As String, tate As String Sub 描画() Cells(X, Y).Value = maru End Sub Sub 削除() Cells(X, Y).Value = "" End Sub Sub 待機() For time1 = 0 To 1000 For time2 = 0 To 1000 Next Next End Sub Sub 座標移動() If yoko = "右" Then Y = Y + 1 Else Y = Y - 1 End If If Y = 30 Then yoko = "左" ElseIf Y = 1 Then yoko = "右" End If If tate = "上" Then X = X + 1 Else X = X - 1 End If If X = 20 Then tate = "下" ElseIf X = 1 Then tate = "上" End If End Sub Sub main() maru = "●" X = 1 Y = 1 yoko = "右" tate = "上" Do 描画 待機 削除 待機 座標移動 Loop End Sub

  • エクセルVBAでPDFを1枚目のみ印刷したい

    下記のVBAに複数PDFが重なっている場合は、一枚目のみ印刷する文面を 挿入したいのですがうまくいきません Sub Test() Dim z As Object Dim i As Long Dim f, p As String Application.ScreenUpdating = False Set z = CreateObject("WScript.Shell") p = Application.ActivePrinter For i = 1 To Range("A1").End(xlDown).Row f = "h:\hozei\" & Cells(i, 1).Value & ".pdf" If Dir(f) <> "" Then z.Run ("AcroRd32.exe /t " & f) Else Cells(i, 2).Value = Cells(i, 1).Value Cells(i, 1).Value = "" End If Next i Set z = Nothing End Sub お忙しいところ申し訳ございません どなたかご教示願います。

専門家に質問してみよう