プロが教える店舗&オフィスのセキュリティ対策術

エクセル VBA Select case の繰り返し処理がうまくいきません。

セルB5に条件となる文字列(AAA、BBB、CCC...)があり、
セルC5にAAAなら10、BBBなら20、CCCなら30といった具合に出力し、
セルB6⇒C6、B7⇒C8と順々にセルB50⇒C50まで続けて処理したいのですがどのように対処すればよろしいでしょうか?

For~Nextを使って繰り返し処理したいのですが、お分かりの方がいればご教授のほどよろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答くださいましてありがとうございます。
やりたいことを完璧に再現してくださいました!!

あとは、
セルB5が空白又は条件候補以外の文字列が入力されているときに
セルC5に???を出力させる方法と
セルB5が50まで固定の処理ではなくて、B列に入力されている分
(例えばセルB30までならセルC30まで出力、B40までならC40まで出力)
だけ処理する方法を探していきます。

お礼日時:2008/10/13 10:53

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関数の身代わりとして下さい。。。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

提示していただいたマクロですが、当方のスキル不足により
十分に活用することが出来ず大変申し訳なく思っています。

今回質問させていただいた疑問点は、他の方の回答により
無事解決することが出来ました。

今後、私自身のスキルアップを図り、別の機会にて活用させて
いただきたく思います。

丁寧にご指導いただきまして誠にありがとうございました。

お礼日時:2008/10/14 12:42

こういう問題は、IF文的発想でやることを、経験をつんで、早く脱却しないと進歩は無い。


IF
CASE(IFの亜種)
VLOOKUPやMATCH(VBAでの関数利用)
表引き
Findメソッド
レコードの検索構造化(本質問には関係ないが、レコードの探索)
SQL(本質問には関係ないが)
などを思いつく。
ーー
VLOOKUPの例
例データ E1:F3
AAA10
BBB20
CCC30
ーー
B5:C11
AAA10
CCC30
BBB20
AAA10
BBB20
AAA10
CCC30
コード
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
のようなもの。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

提示していただいたマクロですが、当方のスキル不足により
十分に活用することが出来ず大変申し訳なく思っています。

今回質問させていただいた疑問点は、他の方の回答により
無事解決することが出来ました。

今後、私自身のスキルアップを図り、別の機会にて活用させて
いただきたく思います。

丁寧にご指導いただきまして誠にありがとうございました。

お礼日時:2008/10/14 12:47

ANo.1です。



ちなみにVLOOKUP関数案は、表を作成しておけばデータの変更はコードではなくシート上の表でできるので、
多いのなら楽かと思いまして。
数式を入れるのが何でしたらVBAで表を参照すれば宜しいかと。

未熟者の浅知恵程度として下さい。
    • good
    • 0

>条件となる文字列(AAA、BBB、CCC...)があり、


条件は3つなのですか、それとも多くて固定?or変動?

多いのなら表を作成してVLOOKUP関数でやるとか。
    • good
    • 0
この回答へのお礼

条件は500以上あり、WEBから表を読み込んで自動で表作成しています。
作成した表にはAAA,BBB,CCCと明記されておらず、
VLOOKUP関数では表から値をうまく抽出できないと思い、
今回は Select Caseで表から値を抽出する方法を採りました。
VLOOKUP関数でも代用可能でしたら、別の方法も試してみたいと思います。

ありがとうございました。

お礼日時:2008/10/13 21:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!