- ベストアンサー
エクセル VBA Select case の繰り返し処理
エクセル VBA Select case の繰り返し処理がうまくいきません。 セルB5に条件となる文字列(AAA、BBB、CCC...)があり、 セルC5にAAAなら10、BBBなら20、CCCなら30といった具合に出力し、 セルB6⇒C6、B7⇒C8と順々にセルB50⇒C50まで続けて処理したいのですがどのように対処すればよろしいでしょうか? For~Nextを使って繰り返し処理したいのですが、お分かりの方がいればご教授のほどよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか? Sub testセレクトケース() Dim val As Variant Dim r As Range For Each r In Range("B5:B50") Select Case r.Value Case "AAA": val = 10 Case "BBB": val = 20 Case "CCC": val = 30 End Select r.Offset(, 1).Value = val Next End Sub
その他の回答 (4)
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 検索条件とその値がE列・F列の1行目からあるとします。 Sub test() Dim Dic As Object Dim r As Range Dim i As Long Dim v As Variant, vv As Variant Set Dic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") v = .Range(.Range("E1"), .Cells(Rows.Count, 6).End(xlUp)).Value For i = 1 To UBound(v, 1) Dic(v(i, 1)) = v(i, 2) Next For Each r In .Range("B5", .Cells(Rows.Count, 2).End(xlUp)) If Dic.Exists(r.Value) Then vv = Dic(r.Value) Else vv = "???" End If r.Offset(, 1).Value = vv Next End With Set Dic = Nothing Erase v End Sub VLOOKUP関数の身代わりとして下さい。。。
お礼
ご回答ありがとうございます。 提示していただいたマクロですが、当方のスキル不足により 十分に活用することが出来ず大変申し訳なく思っています。 今回質問させていただいた疑問点は、他の方の回答により 無事解決することが出来ました。 今後、私自身のスキルアップを図り、別の機会にて活用させて いただきたく思います。 丁寧にご指導いただきまして誠にありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
こういう問題は、IF文的発想でやることを、経験をつんで、早く脱却しないと進歩は無い。 IF CASE(IFの亜種) VLOOKUPやMATCH(VBAでの関数利用) 表引き Findメソッド レコードの検索構造化(本質問には関係ないが、レコードの探索) SQL(本質問には関係ないが) などを思いつく。 ーー VLOOKUPの例 例データ E1:F3 AAA 10 BBB 20 CCC 30 ーー B5:C11 AAA 10 CCC 30 BBB 20 AAA 10 BBB 20 AAA 10 CCC 30 コード Sub test01() d = Range("B65536").End(xlUp).Row For i = 5 To d Cells(i, "C") = WorksheetFunction.VLookup(Cells(i, "B"), Range("E1:F3"), 2, False) Next i End Sub MATCH関数の場合、上記のWorksheetFunction.VLookupの行が x = WorksheetFunction.Match(Cells(i, "B"), Range("E1:E3"), 0) Cells(i, "C") = Cells(x, "F") ーー 表引きは Sub test02() d = Range("B65536").End(xlUp).Row For i = 5 To d For j = 1 To 3 If Cells(i, "B") = Cells(j, "E") Then Cells(i, "C") = Cells(j, "F") GoTo p1 End If Next j Cells(i, "C") = "Not Found" p1: Next i End Sub のようなもの。
お礼
ご回答ありがとうございます。 提示していただいたマクロですが、当方のスキル不足により 十分に活用することが出来ず大変申し訳なく思っています。 今回質問させていただいた疑問点は、他の方の回答により 無事解決することが出来ました。 今後、私自身のスキルアップを図り、別の機会にて活用させて いただきたく思います。 丁寧にご指導いただきまして誠にありがとうございました。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 ちなみにVLOOKUP関数案は、表を作成しておけばデータの変更はコードではなくシート上の表でできるので、 多いのなら楽かと思いまして。 数式を入れるのが何でしたらVBAで表を参照すれば宜しいかと。 未熟者の浅知恵程度として下さい。
- n-jun
- ベストアンサー率33% (959/2873)
>条件となる文字列(AAA、BBB、CCC...)があり、 条件は3つなのですか、それとも多くて固定?or変動? 多いのなら表を作成してVLOOKUP関数でやるとか。
お礼
条件は500以上あり、WEBから表を読み込んで自動で表作成しています。 作成した表にはAAA,BBB,CCCと明記されておらず、 VLOOKUP関数では表から値をうまく抽出できないと思い、 今回は Select Caseで表から値を抽出する方法を採りました。 VLOOKUP関数でも代用可能でしたら、別の方法も試してみたいと思います。 ありがとうございました。
お礼
ご回答くださいましてありがとうございます。 やりたいことを完璧に再現してくださいました!! あとは、 セルB5が空白又は条件候補以外の文字列が入力されているときに セルC5に???を出力させる方法と セルB5が50まで固定の処理ではなくて、B列に入力されている分 (例えばセルB30までならセルC30まで出力、B40までならC40まで出力) だけ処理する方法を探していきます。