• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBA 不規則な条件に合致する場合)

エクセルVBAで不規則な条件に合致する場合のコードの記述方法

このQ&Aのポイント
  • エクセル2002 VBAで、A列に不規則な値が存在し、その値に合致する場合にB列の処理をしたい場合、どのようにコードを記述するかを教えてください。
  • 質問者は、If文の中でorを用いて全ての条件を記述するか、またはElseIfでつなぐ方法しか思いつかないと述べています。
  • 現実には50個ほどの条件を検出したいため、どのようにコードを記述すれば効率的かをアドバイスしてください。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.4

作成例: sub Excelに出来ることはExcelにやらせる()  dim a as variant  dim i as long  a = array(105, 108, 113, 114, 121, 531, 553, 2160)  range("1:1").insert  range("A1").resize(1, ubound(a)+1) = a  with range("B2:B" & range("A65536").end(xlup).row)   .formula = "=IF(COUNTIF($1:$1,A2),""○"","""")"   .value = .value  end with  range("1:1").delete shift:=xlshiftup end sub 作成例: sub マクロの中でゴリゴリやらせる()  dim a as variant  dim i as long  dim j as long  a = array(105, 108, 113, 114, 121, 531, 553, 2160)  for i = 1 to range("A65536").end(xlup).row   for j = 0 to ubound(a)    if cells(i, 1) = a(j) then     cells(i, 2) = "○"     exit for    end if   next j  next i end sub

Sinogi
質問者

お礼

ご回答ありがとうございます。 二つも例示していただき感激です。 特に Excelに出来ることはExcelにやらせる()での ワークエリアとして行挿入&削除 や .value = .value のような一見しただけでは何をしているのかわからないコードの意味を読めたときは感動してしまいました。 ゴリゴリやるのはループの入子で、まさにゴリゴリを感じてしまいます(^^)

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

>B列の処理をしたい場合 の処理とは何?プログラムのコードの中ではないのだから、処理とは、同行のB列値を取るのではないのか? あいまい。 値を取るならエクセルの常識関数VLOOKUPが使えるのでは。VBAでも使えるよ。 Sub test02() Dim x As Integer x = InputBox("コード") MsgBox x With ActiveSheet y = Application.WorksheetFunction.VLookup(x, .Range("A1:B3"), 2, False) MsgBox y End With End Sub ーーーーーーーーー モジュールのルーチン名(文字列)を得て、そのルーチンを実行するのは出来るかな?無理?

Sinogi
質問者

お礼

ご回答ありがとうございます。 >B列の処理をしたい場合 の処理とはデータクリア(セルを空白セルにする)したいのですが、今後は演算処理が要求されそうでもあります。 今後もご教示をお願いします

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 色々やり方はあると思いますが、 IF・・・ OR IF・・・ と続けても大変ですので、 一例です。 Sheet2のA列に合致(検索)データを入力しておきます。 その上で↓のコードのような感じではどうでしょうか? Sub test() Dim i As Long Dim ws As Worksheet Set ws = Worksheets(2) Application.ScreenUpdating = False For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If WorksheetFunction.CountIf(ws.Columns(1), Cells(i, 1)) Then Cells(i, 2) =「B列の処理」 End If Next i Application.ScreenUpdating = True End Sub 参考になりますかね?m(_ _)m

Sinogi
質問者

お礼

ご回答ありがとうございます。 ワークシート関数の Countif で一致確認をするのは、案外すっきりしたコマンドですね。 WorksheetFunction. って冗長な気がしていたのですが実例を教えていただくと活用する気になってきます。

  • 11zep
  • ベストアンサー率36% (48/133)
回答No.2

私なら合致の結果を返すFunctionを作成します。 そして照合する値を配列に格納してFor Next文で配列の数分 ループさせる方法をとります。可読性が良くなるのが好きなので。 以下のサンプルは、Excel2007で作成しています。 呼び出し元: If ValExist(Cells(myRow,1) Then   一致した処理 Else   一致する値がない場合の処理 End If Private Function ValExist(Atai As String) As Boolean   Dim MyValue() As String   Dim Cnt As Integer   MyValue = Split("105,110,120,125", ",")   For Cnt = 0 To UBound(MyValue)     If Atai = MyValue(Cnt) Then      ValExist = True      Exit For     End If   Next Cnt End Function

Sinogi
質問者

お礼

ご回答ありがとうございます。 UBoundのコマンドは知らなかったので勉強になります。 Splitで配列にして、その要素数をUBoundで取得するのですね。 その配列に一致すればFunctionがTrueを返す。 応用できるようにがんばります(^^) 

  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

Select Caseを使う手もあると思います。 Select Case Range("A" & MyRow) Case 113 To 118, 150 To 200 B列の処理 End Select とか Select Case Range("A" & MyRow) Case Is > 150 B列の処理 End Select などのように。

Sinogi
質問者

お礼

ご回答ありがとうございます。 or を , にするだけでもずいぶんすっきりしますね