マクロ条件分岐について:エクセルVBAで複数の条件に基づいて処理を分岐する方法

このQ&Aのポイント
  • エクセルVBAを使って、複数の条件に基づいて処理を分岐する方法を解説します。
  • セル範囲内の行に対して条件を検索し、該当する条件に基づいて処理を分岐させる方法を紹介します。
  • 具体的な例を挙げながら、処理の内容や各条件に対する分岐の方法を詳しく説明します。
回答を見る
  • ベストアンサー

マクロの条件別分岐について

集計表のマクロを作成しています。 その際に条件によって、使用するマクロを使い分けたいと思っていますが上手くいきません。 次のように、E列に倉庫コード・G列に数量が表示されている書式を使用しています。 (例)  (E列)(G列) 1  22B  0 2  31A  1 3  54A  0 4  456  40 5  65C  41 6  32B  60 7  33A  40 ※1行目から300行目まで文字が投入される可能性があります。 そして、次の条件によって、使用するマクロを分岐したいと思っています。 「1」.E列で文字列"B"が含まれている   かつ その行のG列の数量が1以上 の組み合わせがある 「2」.E列で文字列"B"が含まれていない かつ その行のG列の数量が1以上 の組み合わせがある 「1」「2」2つの条件に当てはまる場合は「a」の処理 「1」の条件にのみ当てはまる場合は「b」の処理 「2」の条件にのみ当てはまる場合は「c」の処理 (「1」「2」のどちらにも当てはまらない場合は無いので省略) ちなみに処理の内容は次のとおり 「a」:A・B2つのピボットテーブルを作成する 「b」:Bの1つのピボットテーブルを作成する 「c」:Aの1つのピボットテーブルを作成する 例の場合の処理は次のようになります。 ●1行目はセル(E1)は"B"が含まれているが、セル(G1)の数量が 1以上ではないので、「1」にも「2」にも当てはまらない。 ●2・4・5・7行目はE列に"B"が含まれていなくて、G列が 1以上なので「2」の条件 ●3行目はE列に"B"が含まれていないものの、G列の数量が 0なので「1」にも「2」にも当てはまらない。 ●6行目はE列に"B"が含まれていてセル(G6)の数量が1以上 なので「1」の条件 よって「1」「2」のそれぞれにあてはまる行があるので「a」の処理を行う。 セル範囲(E1:G300)の全ての行に関して上記の「1」「2」の条件に当てはまるか検索して、それぞれ当てはまった条件によって「a」「b」「c」の処理を行うようにしたいです。 (例)の場合だったら 6行目まで検索した時点で「a」の処理が決定します。 Select Case のマクロを使用したら良いと思ったが、どのようにマクロを記述したらよいのか解らないので教えていただけると助かります。 イメージとしては Select Case (1から300行目で「1」と「2」の条件に当てはまる行がある場合) 処理「a」を行う。 Select Case (1から300行目で「1」の条件に当てはまる行はあるが「2」の条件にあてはまる行はない場合) 処理「b」を行う。 Select Case (1から300行目で「2」の条件に当てはまる行はあるが「1」の条件にあてはまる行はない場合) 処理「c」を行う。 というところまではわかりますが、括弧の中の記述方法が分かりません。あるいは別の処理があれば教えていただけると助かります。

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

  • ベストアンサー
  • gt-t
  • ベストアンサー率41% (7/17)
回答No.4

#3です。 >E列に倉庫コード・G列に数量 を見逃していました。 1列空くので、条件チェックしている部分を次のように変更してみてください。 ----変更前----  If Rng(i, 2) >= 1 And Not (InStr(Rng(i).Value, "B") = 0) Then Bol1 = True  If Rng(i, 2) >= 1 And InStr(Rng(i).Value, "B") = 0 Then Bol2 = True ----変更後----  If Rng(i, 3) >= 1 And Not (InStr(Rng(i).Value, "B") = 0) Then Bol1 = True  If Rng(i, 3) >= 1 And InStr(Rng(i).Value, "B") = 0 Then Bol2 = True また、判定後の処理の「B」と「C」が反対になっていたので、その点も確認しながら処理してみてください。 Case Bol1 = True '「処理B」 → 「処理C」  MsgBox ("B") → MsgBox ("C")  Case Bol2 = True '「処理C」 → 「処理B」 MsgBox ("C") → MsgBox ("B")

その他の回答 (3)

  • gt-t
  • ベストアンサー率41% (7/17)
回答No.3

次のようにフラグを2つ使い判定すればいいかと思います。 ---参考コード--- Sub test() Dim Rng As Range Dim Bol1 As Boolean Dim Bol2 As Boolean Dim i As Integer Bol1 = False Bol2 = False Set Rng = Worksheets("sheet1").Range("a1") For i = 1 To 300  If Rng(i, 2) >= 1 And Not (InStr(Rng(i).Value, "B") = 0) Then Bol1 = True  If Rng(i, 2) >= 1 And InStr(Rng(i).Value, "B") = 0 Then Bol2 = True  If flg1 And flg2 Then Exit For Next Select Case True Case Bol1 = True And Bol2 = True '「処理A」  MsgBox ("A") Case Bol1 = True '「処理B」  MsgBox ("B") Case Bol2 = True '「処理C」 MsgBox ("C") Case Else  MsgBox ("発生しない条件です。") End Select Set Rng = Nothing End Sub

donald1982
質問者

補足

「貼り付け」というシート名なので、Worksheets("貼り付け")として、 倉庫コードはE列から始まるので Range("e1")としました。 その結果、質問の「2」の条件に合わないにも関わらず「a」の処理に 進むマクロへと進んでしまいます。 解答のマクロは正しいか、もう一度見ていただけると助かります。 条件分岐から処理「a」までのVBAは以下のように記述しました。 Dim Rng As Range Dim Bol1 As Boolean Dim Bol2 As Boolean Dim i As Integer Bol1 = False Bol2 = False Set Rng = Worksheets("貼り付け").Range("e1") For i = 3 To 300 If Rng(i, 2) >= 1 And Not (InStr(Rng(i).Value, "B") = 0) Then Bol1 = True If Rng(i, 2) >= 1 And InStr(Rng(i).Value, "B") = 0 Then Bol2 = True If flg1 And flg2 Then Exit For Next Select Case True Case Bol1 = True And Bol2 = True 処理「a」

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.2

いろいろ有ると思いますが、こんなのはどうでしょう 図で G列とH列を作業用に使います G1 =IF(E1="","",(F1>0)*2-(RIGHT(E1,1)="B")*1) とし、下にコピー H1 =COUNTIF(G$1:G$300,1) H2 =COUNTIF(G$1:G$300,2) H3 =IF(H2>0,IF(H1>0,"a","c"),"b") とします あとは、VBAでH3セルを読んで、判断します ----------------------------------- Select Case Cells(3, "H") Case "a"    処理「a」 Case "b"    処理「b」 Case "c"    処理「c」 End Select

  • chuchuo
  • ベストアンサー率45% (99/217)
回答No.1

シートのrow方向の数が浮動するのかによってスクリプトが 若干かわりますが コラムE列の文字情報を一文字ずつ評価する必要がありますね。 倉庫のコードが3桁固定なのかそうでないのかでも スクリプトが変わります。 先頭の番号もセルですか?

donald1982
質問者

補足

先頭の番号はセルではありません。 BDEFG列にデータが投入されていて、その中の EとGから条件を判断しようと思っています。

関連するQ&A

  • マクロの複数条件での分岐を教えて下さい

    初心者です。 下記のような条件の場合、どのように記述すればよいか教えていただけますでしょうか。 もし、セルA2が"A"、且つ、セルB2が"☆"のとき、セルC3に"1" もし、セルA2が"A"、且つ、セルB2が"☆☆"のとき、セルC3に"2" もし、セルA2が"A"、且つ、セルB2が"☆☆☆"のとき、セルC3に"3" もし、セルA2が"B"、且つ、セルB2が"☆"のとき、セルC3に"4" もし、セルA2が"B"、且つ、セルB2が"☆☆"のとき、セルC3に"5" もし、セルA2が"B"、且つ、セルB2が"☆☆☆"のとき、セルC3に"6" それ以外は「エラー」 をセットしたい場合、マクロではどのような記述になるでしょうか。 どなたかご教授願います。

  • エクセルのマクロVBA条件分岐の仕方

    適切な方法を知りたいと思っています。よろしくお願いします。 エクセルA列に     A列    B列    C列 1行 E-000-1    2  2000-0001    3  00300000   4  34598291 5  R-000-1  6  99333345  7  00300 8  2009-0013 9  47539859 10 0192 1・5行目のようにアルファベットで始まり"-"が2番目にある文字列("a"とします)、2・8行目のように"-"が5番目にある文字列("b"とします)、その他1~8桁の文字列("c"とします)が合計で5千件近く入っています。(abcは重複することもあります。) cより上にあるaとbはcの属性です。エクセル上で、 abcをそれぞれのCBA列に分けて行ごとにcの属性を出そうとしています。 並び順は、c(複数)の上に必ず、abがあるはずですが、不規則にbが無くて、acの時があります。そのときはb情報はないので、B列をNにしたいのです。 マクロで以下のような表にまで加工しました。 ここで、データがacの順に並んでいる時だけ(6・7行目)、cの入っている方の行(7行目)B列に"N"を入れたい感じです。     A列    B列    C列 1行 E-000-1        E-000-1     2  2000-0001 2000-0001      3  00300000   4  34598291 5  R-000-1        R-000-1  6  99333345 (N) 7  00300 8  2009-0013 9  47539859 2009-0013 10 0192 よろしくお願いいたします。

  • データ抜き出し・別シートへ貼付マクロ

    WinXP、Office2003を使用しています。 Sheet1に入力されている情報から、下記条件を抜き出し、あらかじめ用意 してある別シートに書き出したいをしたいと思っております。 業務が多く恥ずかしながら手が回らず、少しでも負荷を軽くしたいのですが ご存知の方がいらっしゃいましたらマクロを教えていただけませんでしょうか? なお、1行目にはタイトルが入っており、2行目以降に情報が入っています。 【実施したい処理】 ・B2セルに「/愛知」と入っていたら、A2・B2・C2セルの値を あらかじめ作成してある "/愛知"シートへ書き出す。 ・B2セルに「/東京」と入っていたら、A2・B2・C2セルの値を あらかじめ作成してある "/東京"シートへ書き出す。 ・B2セルに「/大阪」と入っていたら、A2・B2・C2セルの値を あらかじめ作成してある "/大阪"シートへ書き出す。 ※2000行ぐらい情報が入っています。 【イメージ(処理前)】        A列          B列         C列 1行目  A列タイトル      B列のタイトル     C列のタイトル 2行目 あああ/1234/111  あああ/1234/111/愛知   56789 3行目 ててて/2222/987  ててて/2222/987/東京   11122 4行目 くくく/5467/232  くくく/5467/232/愛知   65656 5行目 ままま/5555/741  ままま/5555/741/大阪   33444 【イメージ(処理後)】 愛知シート        A列          B列         C列 1行目  A列タイトル      B列のタイトル     C列のタイトル 2行目 あああ/1234/111  あああ/1234/111/愛知   56789 3行目 くくく/5467/232  くくく/5467/232/愛知   65656 東京シート        A列          B列         C列 1行目  A列タイトル      B列のタイトル     C列のタイトル 2行目 ててて/2222/987  ててて/2222/987/東京   11122 大阪シート        A列          B列         C列 1行目  A列タイトル      B列のタイトル     C列のタイトル 2行目 ままま/5555/741  ままま/5555/741/大阪   33444 わかりにくくて申し訳ございませんが、よろしくお願い致します。

  • エクセル2010 繰り返しマクロ

    (1)g列の空白の最上行に =SUMPRODUCT(min((a:a>=f2)*(a:a<f2+730)*e:e)) と入力。 そのセルをコピーし、同じセルに値を上書き貼り付け ↓ (2)a列に(1)のセルの左隣のセル以下の数値がある行の、b列を削除 (画像の場合、(1)のセルがg1の場合、b2,b3を削除する) というのを、f列に数値がある行だけ繰り返すマクロの構文を教えてください。 大変お手数おかけいたしますが、どうぞよろしくお願いします。

  • EXCELのマクロで。。。

    シートAのセルC2の値(数字)を シートBのE、F、Gの各列のうち空いている一番左のセルで、かつ、D列に何か書いてある一番下の行のセル に転記したいです。 たとえば、シートBが図のような場合にはF28です。これが毎回、変化します。 マクロの記述を教えて下さい。よろしくお願い致します。

  • COUNTBLANKのような役割を持つマクロ

    COUNTBLANKとはちょっと違うのですが、 行 ↓ A B C D ←列 1  AB AC AD AA 2 BB 3 C CC 4 DD 上記のようなデータがあります。 2,4行目みたいにA列とB列とC列が空白だったら、E2、E4セルに ○っていのを表示させるようなマクロってできないでしょうか。 また、Dのセルに値がある限り、その行数分上記の処理を繰り返す 方法があったら教えてください

  • Excel 2007のマクロ記述について

    Excel 2007で、B4セルからI最終行までの整数のみを小数点以下1桁にする処理をマクロで実行したいのですが、どのように記述したらよいか教えてください。 最終行とはI列にセルの値がある最後の行です。 下記の例のマクロ実行結果は、1→1.0、2→2.0となります。 (例)      列      A  B    C    D    E   F  G   H  I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2   2  2   CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6   1   1  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1   1  1.5  1.5  CIRCLE  CIRCLE マクロ実行結果      列      A  B    C    D    E   F  G   H   I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2  2.0  2.0  CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE

  • エクセル条件付き書式をマクロにしたいです

    Excel2007使用しています。 類似質問が見つかりましたが、VBA勉強中でそこからの応用ができないので 教えていただけると助かります。 条件付き書式を毎回作成するのが大変なので、マクロで自動設定したいと考えています。 条件付き書式で設定していたのは「C4に指定文字があったら、B4・C5・D4・E4のセルを指定した色に塗りつぶす」を5パターン使用していました。 色を変えるかどうか判断する文字が含まれているのはC列にあります。 C4に「ああ」の文字があればB4・C5・D4・E4のセルを赤色に塗りつぶす C4に「いい」の文字があればB4・C5・D4・E4セルをアクア色に塗りつぶす C4に「うう」の文字があればB4・C5・D4・E4セルを黄色に塗りつぶす C4に「ええ」の文字があればB4・C5・D4・E4セルをオリーブ色に塗りつぶす C4に「おお」の文字があればB4・C5・D4・E4セルを紫色に塗りつぶす これを、C4から文字がある行まで(200行~15,000行まで対象行数が変動)処理して欲しい イメージで伝えて申し訳ありません、 情報足りなければご指摘いただければと思います。 どうぞ宜しくお願い申し上げます。

  • マクロの条件を追加したいのですが

    いつもお世話になります、MEGUMIと申します。 既存のマクロに更に条件を追加したいという質問をさせてください。 現在、フォルダの中にある全てのエクセルファイルを下記のような処理をしています。 ●エクセルファイルの中の全てのSheetの1行目以降のA,B,C,G,H列をコピーしてマクロを動作させるエクセルファイルのSheet1に順次(A,B,C,D,E列)ペースト  ※マクロは下記の内容( Sub 今日のわたし()以降です )です。 これに下記のような条件を追加したいのですがどのようにすればいいでしょうか? ○I列に”元気”という文字が存在していた場合に限って、その列のA,B,C,G,H,I列をコピーしてマクロを動作させるエクセルファイルのSheet1に順次(A,B,C,D,E,F列)ペースト お忙しいところ大変恐れ入りますがもしご存知の方がいらっしゃりましたらご指導のほど何卒宜しくお願いいたします。 Sub 今日のわたし() Dim XlFile As String Dim MotoDataLastRow As Long Dim CopySakiLastRow As Long ThisWorkbook.Activate Worksheets(1).Select Cells.Clear XlFile = Dir(ThisWorkbook.Path & "\*.xls?") Do While XlFile <> "" If XlFile <> ThisWorkbook.Name Then Workbooks.Open ThisWorkbook.Path & "\" & XlFile, ReadOnly:=True Worksheets(1).Select MotoDataLastRow = Workbooks(XlFile).Worksheets(1).[A65536:H65536].End(xlUp).Row '元データファイルの最終行を取得 CopySakiLastRow = ThisWorkbook.Worksheets(1).[A65536:E65536].End(xlUp).Row 'インポート先の最終行を取得 If MotoDataLastRow > 1 Then Range([A2], Cells(MotoDataLastRow, "C")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "A") Range([G2], Cells(MotoDataLastRow, "H")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "D") End If Workbooks(XlFile).Close False End If XlFile = Dir() Loop End Sub

  • マクロ 列ごとの条件付き書式

    マクロで列ごとの条件付き書式を作成したいです 条件としては ・列ごとに上限値が1行目に下限値が2行目に入力されている ・3行目以降に測定値が入力される ・その3行目位以降の測定値のセルの書式を上下限値から外れた値は色を変えたい ・50列ほどデータがある (例) A1 10 A2 5 A3~A100 数字 条件をA3~A100に設定 A1(10)より大きいもの、A2(5)より小さいものはセルの色を黄色 B1 15 B2 7  B3~B100 数字 条件をB3~B100に設定 B1(15)より大きいもの、B2(7)より小さいものはセルの色を黄色 こんな感じで列ごとにデータと規格値が入っているものが50列あります。 どうかよろしくお願い致します。

専門家に質問してみよう