• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロ 複数条件について質問です)

エクセルのマクロ 複数条件について質問です

tsubu-yukiの回答

  • ベストアンサー
回答No.2

えーと・・ お望みの処理を「マクロを使わず」にあえて手作業で行う場合、 あなたならどうしますか? 「複数条件で検索」しか思いつかず、答えに近づけないなら、 おそらく、VBA以前に基本機能の復習をオススメします。 「検索」機能は複数の条件を受け付けないので、 お望みの処理には不向きです。 思いつく方法は、例えば (1)全行に対し、C・D・E列を3行目と照らし合わせ、    全部合致していたら塗りつぶす。 (2)C列で検索をかけ、当たった行のD・E列を照らし合わせ、    合致していたら塗りつぶす。 (3)C・D・E列をキーにフィルタをかけ、    抽出されたものを塗りつぶし、フィルタを解除する。 他にもありますが、おそらくこのどれか、でしょう。 「普通」という言葉を押し付けるのは好みではないのですが、 複数の条件で対象を絞り込みたいなら、普通はフィルタ機能、 つまり(3)を選択するような気がします。 ちなみにフィルタは   With 対象範囲     .AutoFilter     .AutoFilter Field:=1, Criteria1:=抽出条件1     .AutoFilter Field:=2, Criteria2:=抽出条件2         ・         ・   End With こんな感じで使えます。 ま、「マクロの記録」してみればわかりやすいですね。 > C3、D3、E3の3つ全てのセルに入力されたらマクロが実行 Worksheet_Changeイベントに、指定してやれば良いですね。 理解しやすいやり方を挙げるとすると   If Application.CountA(Range("C3:E3")) = 3 Then     ~処理~   End If でしょうか。 そんなわけで、今日は大サービスな私なら Private Sub Worksheet_Change(ByVal Target As Range)   ' 入力したセルが3行目で、C~Eがすべて埋まっていたら実行   If Target.Row = 3 And Application.CountA(Range("C3:E3")) = 3 Then     Application.ScreenUpdating = False     ' 既にフィルタがかかっていたら解除     Set MF = ActiveSheet.AutoFilter     If Not MF Is Nothing Then Range("C10").AutoFilter     ' C列のデータがある範囲の最終行を調べる     MR = Cells(Rows.Count, 3).End(xlUp).Row     ' C列の塗りつぶしを一度解除     Columns("C:C").Interior.Pattern = xlNone     ' C~E列にフィルタ処理、それぞれ3行目を基にフィルタ     With Range("C10:E" & MR)       .AutoFilter       .AutoFilter Field:=1, Criteria1:=Range("C3")       .AutoFilter Field:=2, Criteria1:=Range("D3")       .AutoFilter Field:=3, Criteria1:=Range("E3")     End With     ' 抽出された行のC列に塗りつぶし(赤)     With Range(Range("C11"), Range("C11").End(xlDown)).Interior       .Pattern = xlSolid       .ColorIndex = 3     End With     ' フィルタを解除     Range("C10").AutoFilter   End If   Application.ScreenUpdating = True End Sub くらいかなぁ、と思いますよ。 パソコンと表のサイズに依りますが1000行程度なら一瞬ですよ。

関連するQ&A

  • エクセルのマクロについて

    エクセル2003を使用しています。もしよかったら教えてください。 【例】 エクセルシートを2つ使うことを前提として、 Sheet1にはA1:F50の6列範囲セルに対して1~60の範囲内の数字が決められた背景色とフォント色に従い元々ランダムに入っております。 次に新たにSheet2を作り、そのE1:J50の6列範囲セルに値を他からコピーしてきた数字がランダムに入っています。 上記Sheet1セル範囲とSheet2セル範囲を比較して、それぞれのセル範囲内の数字がそれぞれ一致した場合、Sheet2のセル群をSheet1のセルの背景色とフォントカラーを同一に変更するマクロがわかりませんでした。 また1~60範囲外数値であれば処理しません。 調べても、数値入力した時点で他のセルの背景・フォント色を同一に変更する方法しか無かったので、For Eachを使い、試してみたのが下記のマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim v, c As Range '//変更されたセル範囲・値をチェックして、関係なければ処理をしない If Target.Count > 1 Then Exit Sub If Intersect(Range("E1:J50"), Target) Is Nothing Then Exit Sub v = Target.Value If Not IsNumeric(v) Or v < 1 Or v > 60 Then Exit Sub '//参照するシートの範囲について順にチェック '//値が同じだったら、フォントカラーと背景色を同じにして終了 For Each c In Worksheets("sheet1").Range("A1:F50") If c.Value = v Then Target.Interior.ColorIndex = c.Interior.ColorIndex Target.Font.ColorIndex = c.Font.ColorIndex Exit For End If Next c End Sub これで実行するとSheet2に数値を新たに入力してうまくいきます。 ただ、Sheet2へ他からコピーしてきた数値のセル背景・フォント色を変更することができないです。 上記の作業を次から次へと新規で対応しなければならず、数値の入力に疲れてきております。 うまくいくマクロありますでしょうか?

  • エクセルのマクロについて

    エクセルのマクロについて エクセル2007を使用しています。もしよかったら教えてください。 現在Sheet1のA1:F500の範囲内で1~31範囲の数字がランダムに入力されています。 この数字群の入ったセルをルール化しているセル背景色塗りを自動で処理したいためマクロを作成しております。 その仕様として、もうひとつシート(Sheet2)を作成して(※シート名は”配色表”にしています)、B3:H7範囲に1~31までの数字が入っており、それぞれ数字に背景配色しています。このシート(Sheet2)内の数字とSheet1内と数字が一致したら配色表のセルそのものの書式も運んでくれるルール設計になっています。 (※Sheet1の上記記載している範囲に直接入力及びコピーをして数字がSheet2内と一致したら、色が変わる仕組みになっています。) そのマクロ(※Sheet1内に作成しています)が下記なのですが、拝見頂いて仕様がすぐお分かりになると思います。 Private Sub Worksheet_Change(ByVal Target As Range) Dim v As Variant, c As Range, s As Range Dim rng As Range Set rng = Intersect(Target, Range("A1:F500")) If rng Is Nothing Then Exit Sub Application.ScreenUpdating = False For Each c In rng.Cells For Each s In Worksheets("配色表").Range("B3:H7") v = c.Value If Not IsNumeric(v) Or v < 1 Or v > 31 Then Exit For '色を一旦戻す c.Interior.ColorIndex = xlColorIndexNone c.Font.ColorIndex = xlColorIndexAutomatic If s.Value = v Then c.Interior.ColorIndex = s.Interior.ColorIndex c.Font.ColorIndex = s.Font.ColorIndex Exit For End If Next s Next c Application.ScreenUpdating = True Set rng = Nothing End Sub ここで今回の質問の本題なのですが、このマクロを少し仕様変更して、現在のSheet2の配色表を、A配色表・B配色表・C配色表...というようにJ配色表まで合計10シートまで増やして(※A~Jは全部別々の色に設定する)、更にSheet1に一つH1の場所のセルにA~J迄の英字を入力するためのセルを設けて、例えばそのセルにCを入力すればC配色表を見に行くという条件付きのマクロにしたいと思っております。 これが簡単そうでなかなかうまく行かず困っています。 上記のマクロを使ってどういう風に変更したらベストであるかご伝授頂ければ幸いです。 どうぞよろしくお願い申し上げます。

  • エクセルのマクロについて

    エクセルのマクロについて エクセル2007を使用しています。もしよかったら教えて頂きたいと思っております。 現在利用しているメインシート(Sheet16で認識)のD5:I500の範囲内で1~31範囲の数字がランダムに入力されています。 この数字群の入ったセルをルール化しているセル背景色塗りを自動で処理したいためマクロを作成しております。 その仕様として、10個のシート(シート名:Aセット配色~Jセット配色)を作成して、各シートのB3:H7範囲に1~31までの数字が入っており、それぞれ数字に背景配色しています。Sheet16内と数字と条件によって該当する10個のシート内(シート名:Aセット配色~Jセット配色)の中から1つのシートとが一致したらそのセット配色シートのセルそのものの書式も運んでくれるルール設計になっています。 (※Sheet16の上記記載している範囲に直接入力及びコピーをして数字が一致したら、色が変わる仕組みになっています。) 更に、Sheet16内のJ3セルにA~J迄の半角英字を入力規制セットしており、例えばそのセルにCを入力すればCセット配色(シート名)、A入力であればAセット配色(シート名)を見に行き、該当処理をして行くという仕様になっております。 そのマクロ(※げNSheet16内に作成しています)が下記なのですが、拝見頂いて仕様がすぐお分かりになると思いますが、、 Private Sub Worksheet_Change(ByVal Target As Range) Dim v As Variant, c As Range, s As Range, myStr As String Dim rng As Range Set rng = Intersect(Target, Range("D5:I500")) If rng Is Nothing Then Exit Sub If Range("J3").Value = "" Then MsgBox "セット配色が未設定です。", vbCritical, "セットエラー " Exit Sub End If myStr = Range("J3").Value & "セット配色" Application.ScreenUpdating = False For Each c In rng.Cells For Each s In Worksheets(myStr).Range("B3:H7") v = c.Value If Not IsNumeric(v) Or v < 1 Or v > 31 Then Exit For c.Interior.ColorIndex = xlColorIndexNone c.Font.ColorIndex = xlColorIndexAutomatic If s.Value = v Then c.Interior.ColorIndex = s.Interior.ColorIndex c.Font.ColorIndex = s.Font.ColorIndex Exit For End If Next s Next c Application.ScreenUpdating = True Set rng = Nothing End Sub 今回の質問内容は、このマクロを少し仕様変更して、 C4:C500範囲でデータ書換えがあった場合にその瞬間、現行のJ3セルにその入力した英字と同じ値を表示させ次の処理に移行する方法にて上手くいかないかなと思っております。 上記のマクロを使用して追加組み込みをする前提で考えると、どういうコードを追加すれば実現出来ますでしょうか? どうかご伝授頂けますと幸いです。 よろしくお願い申しあげます。

  • Excelのマクロで質問です

    セルに関数で文字が入った時にマクロを実行させる方法を教えて下さい。 今回行いたいのは、C9~C19セルにNGと表示された場合にメッセ―ジを表示したいです。 Private Sub Worksheet_Change(ByVal Target As Range) '変化のあったセルがA1セルか? If Intersect(Target, Range("C9:C19")) Is Nothing Then Exit Sub '条件判定:A1セルの値は 1 か? If Target.Value = "NG" Then MsgBox "NGです" End If End Sub このような場合C9~C19セルにNGと打ち込めばメッセ―ジが表示されるのですが あらかじめ、関数で =IF(M9="","",IF(Q9<M9,"OK","NG")) というような式がそれぞれのC9、C10、C11・・・・セルに入ってしまっています。 これだと、例えばC9セルにNGと表示されてもマクロは起動せず、メッセージが表示されません。 関数をマクロに盛り込むか、このままでもマクロが起動できるような書き方があるか 教えてください。 すみません。補足でQ9セルには =IF(I9="","",I9+"07:01")のような関数が 入力されています。

  • エクセルのマクロ

    Sub test() Dim x As Range  For Each x In Selection    If x.Value <> "●" And Selection.Font.ColorIndex = 0 Then    x.Value = "○"  End If Next End Sub 上記は、選択されているセルのフォントが黒でかつ"●"が入力されていない場合は"○"を入力する、というマクロですがうまく動作しません。どうすれば正常に動作するようになるでしょうか?

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • エクセル2003 シートを保護するとマクロエラー

    sub macro1()  worksheets("Sheet2").copy before:=worksheets(1)  with worksheets(1)   .range("D4:BH14").interior.colorindex = xlnone   .range("D16:BH21").interior.colorindex = xlnone   .printout  end with  application.displayalerts = false  worksheets(1).delete  application.displayalerts = true end sub 以前に、こちらの質問で回答をいただきました。 会社のプリンターは古すぎなのですが、 見事!なんとか、会社のプリンターでできました。 入力されたくないセルもあり、シートを保護しました。 すると、マクロにエラーがかかりました。 なるべく、触られたくないセルがあったり、データを入力してほしいデータもあり… セルの保護をかけながら、マクロを有効に動かしたく思います。 よろしくお願いします。

  • エクセルのマクロについて

    エクセルのマクロ実行についてですが、 例えば、 E1セルの値が1ならばこうする(マクロ名 E1セル1) E2セルの値が2ならばこうする(マクロ名 E1セル2) E3セルの値が3ならばこうする(マクロ名 E1セル3) というマクロを別々に作りました。 これをボタンで実行する時に、 If Range("E1").Value = 1 Then ElseIf Range("E1").Value = 2 Then 2行目には作ったマクロを全部貼り付けないといけないのでしょうか? それとも簡単にこの場合は、マクロ名E1セル1を実行するという命令することができるのでしょうか? できるのであれば、入力方法を教えてください。 質問が分かりにくいと思いますが、よろしくお願いします。

  • Excelのマクロに関して

    Excelのマクロで特定のセルに特定の数値が入力されている場合、違うセルにある文字列を入力させる場合 すいません。 説明がものすごく悪くて申し訳ないのですが。 A列(行は100くらいまで)に「100」の数値が入力されている場合に、同じ行のE列に文字列「○○」を返す場合は どのようなマクロを使ったらよろしいですか。 会社の人が Sub TimeIntervalPaint() Dim x As Integer, op As Integer Dim TI As Range Application.ScreenUpdating = False Cells.Interior.ColorIndex = xlNone op = Range("B3").End(xlDown).Row Range("E3:BF" & op).ClearContents Call WorkTime For x = 3 To 150 If Range("A" & x).Value = "101" Then If TI Is Nothing Then Set TI = Union(Range("L" & x), Range("AD" & x), Range("T" & x, "W" & x)) Else Set TI = Union(TI, Range("L" & x), Range("AD" & x), Range("T" & x, "W" & x)) End If こういったマクロを登録しているのですが、新たにE列に文字列を入力できるように改良したいのです。 既に退職していて聞くことすら出来ません。 説明がものすごく悪いのは分かっていますが、どなたかご教授ください。

  • エクセル イベントマクロ

    マクロ初心者です。よろしくお願いします。 セル範囲(A1:F20)に何も入力されていなければ塗りつぶしされ、 何か(文字、数字などなんでも)入力されていれば、塗りつぶしがなくなる。 というマクロをあえて、条件付き書式を使わずに行いたいとやってみました。(以下) Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Range For Each a In Range("A1:F20") If a.SpecialCells(xlCellTypeVisible) Then a.Interior.ColorIndex = xlNone Else a.Interior.ColorIndex = 7 End If Next a End Sub ところが、半角数字(0以外)では動作するのですが 文字を入力するとエラーとなり「型が一致しません」と表示されます。 どう直したらよいのでしょうか? 最近マクロをやってみようと始めたので、基本的なことがわかっていないのかも。 どなたか、具体的なご指導お願いします。