- ベストアンサー
エクセルVBAのif文で同じ処理をまとめる方法
- エクセルVBAのif文で異なる値に対して同じ処理を行いたい場合、効率的にまとめる方法はありますか?
- エクセルVBAのif文で複数の値に対して同じ処理を行いたい場合、効果的なコーディング方法を教えてください。
- エクセルVBAのif文を使って異なる値に対して同じ処理をまとめる方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Case文を使うと条件が併記できます。 If .Range(K1).Value = "" Then Select Case .Range(J1).Value Case "1302","2117","4101" .Range(K1).Value = "0000" End Select End If ばらしても同じ If .Range(K1).Value = "" Then Select Case .Range(J1).Value Case "1302" .Range(K1).Value = "0000" Case "2117","4101" .Range(K1).Value = "0000" End Select End If
その他の回答 (5)
- mt2015
- ベストアンサー率49% (258/524)
せっかくExcelを使うんですからシート上に対応リストを持ってはいかがでしょう。 添付の図の例ではM列を対応リストとして使用しています。 Sub Sample() 'K1が空白でなければ終了 If Range("K1") <> "" Then End 'M列に該当するものがあればK1=0000 nCount = WorksheetFunction.CountIf(Range("M:M"), Range("J1")) If nCount = 1 Then Range("K1") = "0000" End Sub
お礼
わざわざ画像までご用意していただきありがとうございました。 あらかじめリストを作成しておくのが当方のケースではちょっと難しかったのですが、今後の参考にさせていただきます。 ありがとうございました。
- bunjii
- ベストアンサー率43% (3589/8249)
>同じ形のプログラムを羅列していく以外の書き方はありますでしょうか? 回答No.4と凡そ同じですが次のようなコードで良いと思います。 Sub test() Dim m Dim d, i, k, n d = Range("J1").Value k = "K1" n = 0 m = Array(1302, 2117, 4101, 3320, 5313, 6354, 7682, 8812, 9231, 10332) For i = 0 To UBound(m) If d = m(i) Then If Range(k).Value = "" Then Range(k).Value = "0000" i = UBound(m) End If Next i End Sub 比較対象が複数のとき配列変数へ代入してForループでチェックし、一致する条件が見付かったときループから抜け出す方法になります。
お礼
配列をすっかり忘れており、Arrayで対応することに思い至りませんでした。こちらのやり方も見やすくわかりやすいですね。 教えていただきありがとうございました。
- tsubu-yuki
- ベストアンサー率46% (179/386)
私も、フレキシブルに対応でき、可読性を疎かにしない策として Select Case を推します。 例えば(K列は数値を文字列で表示しているとして) Sub sample() If Range("K1").Value = "" Then Select Case Range("J1").Value Case "1302" Range("K1") = "0000" Case "2117" Range("K1") = "0000" Case "4101" Range("K1") = "0000" 'Case Else ' Range("K1") = "" End Select End If End Sub こんな感じで色々対応できます。 ただし、条件が多くなってくると If より少し遅くなってしまいますので、 その辺はうまいこと調整してやってください。 んで、今回の例示だとK1セルが空白であることが前提ですから、 実はココ(最初の If )は無視してもあまり変わらないのかもしれませんね。 つまり、 Sub sample2() Select Case Range("K1").Value & Range("J1").Value Case "1302": Range("K1") = "0000" ' (略) End Select End Sub まぁ、大きく変わりませんが、こうですね。 ↑こんな意味で、そこそこフレキシブルに対応できるヤツですので、 覚えておいて損はないと思いますよ。
お礼
ベストアンサーの方と同様のアプローチで分かりやすくご提示いただいてありがとうございました。 このやり方は今後も使うシチュエーションが多いと思いますのでしっかり覚えておきます。
- imogasi
- ベストアンサー率27% (4737/17069)
下記のようなことではないか。 VBAをやり始めると、すぐ起こる必要な手法ではないか。事前に事例集を読んで備えよ。 配列に10数個の値を作っておいて、配列の要素をi とするとして、 iを0からUBoundまで、 繰り回して聞けば、仕舞いのことではないか? Sub test01() Range("K1").Clear d = Array(1, 3, 8, 13, 12, 45, 23) MsgBox UBound(d) '上例では0-6の6が表示される For i = 0 To UBound(d) If Range("A1") = d(i) And Range("K1").Value = "" Then Range("K1") = "'" & "0000" End If Next i End Sub それよりも、小生最近使わないせいで、"'" & "0000"の部分の方が手間取った。
お礼
いままで配列を使うことが全然なかったためArrayの存在をすっかり忘れていました。ご提示いただきありがとうございました。
- _backyarD
- ベストアンサー率34% (199/580)
とりあえず2通りの方法を。 ■IF文の条件をORでつないで複数記述する。 Public Sub test() 'カッコで囲ったORで条件を繋げて、カッコの外でAND条件も書く If (Range("J1").Value = "1302" Or Range("J1").Value = "2117" Or Range("J1").Value = "4101") And Range("K1").Value = "" Then Range("K1").Value = "0000" End If End Sub ■あらかじめ比較対象の文字列複数個を入れたDictionaryというものを使う Public Sub test2() 'こちらは、If文の数式の前に、事前に条件となる文字列を複数個入れたDictionaryというものを用意しておき、 'If文の中では直接イコールで比較するのではなく、Dictionaryが持つ機能で「対象の文字が入ってる?」という '確認を行います。 'Dictionary「jouken」を作る Dim jouken As Object Set jouken = CreateObject("scripting.dictionary") '条件を入れるときは、実際の文字列と、索引になる文字列の2情報が必要。ここではどちらも同じものを設定します '必要に応じてここの処理をふやせば10個でも20個でも大丈夫ですし、 'なんなら事前にExcelシートのどこかに条件を書いておいて、ループでDictionaryに入れてもよいですね。 jouken.Add "1302", "1302" jouken.Add "2117", "2117" jouken.Add "4101", "4101" 'Dictionaryに対象の文字列が入っているかどうかは「Exists」という命令で判断できます。 '入っていたらTrueになりますので、以下のように記述できます。 If jouken.exists(Range("J1").Value) And Range("K1").Value = "" Then Range("K1").Value = "1111" End If End Sub
お礼
dictionaryというオブジェクトを知りませんでしたので ご説明を読ませていただき他サイトも見てみましたが、このような使い方ができるオブジェクトがあるのですね。勉強になりました。 ありがとうございました。
お礼
読みやすく、条件が増えた際にも対応が容易でしたのでこちらの上の形を使わせていただきました。 4桁の異なる値を基準に考えるのではなく、空欄を基準にselect caseで作っていけばよかったのですね。大変勉強になりました。 質問では省きましたがこの処理は10000行ほどに対して行うので、プログラム修正前と修正後でかかる時間が半分に短縮されました。 本当にありがとうございました。