- ベストアンサー
For~Nextについて
VBA勉強中です。 For~Nextについて、いまいちわからないので、教えてほしいのですが、 下記の表を作り、テーブルと言う名前を付けました。 C列に上からA.Bの値を入れようと思います。 | A | B |C 1| AA| 11| 2| AB| 12| Sub Macro1() Dim AA As Range, BB As Range, AB As Variant Dim myTbl As Range, myFld As Integer, i As Integer Set AA = Range("A1") 'AAの箱にA1の値を Set BB = Range("B1") 'BBの箱にB1の値を Set myTbl = Range("テーブル") 'myTblの箱にテーブルを myFld = 3 'myFldの箱に3列目 AB = AA & "." & BB 'A1とB1の値を入れる For i = 1 To myTbl.Rows.Count 'iはテーブルの1行目から最後の行まで If myTbl.Cells(i, myFld).Value = AB Then 'テーブルの1行目のCのセルにA1とB1の値を入れる Exit Sub End If Next End Sub と思うのですが、やはり動きません。 アドバイスをお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Set AA = Range("A1") 'AAの箱にA1の値を でなく ここではAAの箱にA1の箱を指定しただけです。 AAの箱(変数)にA1の値を なら Dim AA As Variant AA = Range("A1").Value For Next で テーブルの処理行に応じて 'iはテーブルの1行目から最後の行まで 対象を変化させて 実行すべきところ 処理すべき AAの箱 BBの箱が For Next の外にあり 固定で Setでオブジェクト指定する効果なく固定になっています。 If Then End If Exit Sub はここでは使わない。 条件判定と 出力実行処理 が混乱しているかも・・ ・・とりあえずそのまま直す Sub Macro1() Dim AAの箱 As Range, BBの箱 As Range Dim AB As Variant Dim myTbl As Range, 出力列 As Integer Dim テーブル処理行 As Integer Set myTblの箱 = Range("テーブル") 'myTblの箱にテーブルを 出力列 = 3 '出力列にmyFldの箱の3列目 For テーブルの処理行 = 1 To myTblの箱.Rows.Count Set AAの箱 = Range("A" & テーブルの処理行) Set BBの箱 = Range("B" & テーブルの処理行) AB = AAの箱.Value & "." & BBの箱.Value 'A1とB1の値を入れる myTblの箱.Cells(テーブルの処理行, 出力列).Value = AB 'テーブルのテーブルの処理行目のCのセルにA1.B1の値を入れる Next End Sub '整理すると "テーブル"と言う範囲の中での処理を意図しているようなので 'Set AA = Range("A1") で進めても テーブルの移動に追従しない(上のはテーブル=Range("A1:C3")固定)ので '#2に沿って Sub テーブルのAAとBB⇒CC() 出力列 = 3 Set 処理範囲 = Range("テーブル") With 処理範囲 For テーブルの処理行 = 1 To .Rows.Count A列の値 = .Cells(テーブルの処理行, 1).Value B列の値 = .Cells(テーブルの処理行, 2).Value 出力の値 = A列の値 & "." & B列の値 .Cells(テーブルの処理行, 出力列).Value = 出力の値 Next End With End Sub
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 > これは If文です。 > 条件が合わないので Exit Sub に入り、そのまま何もしないで終了です。 すみません、勘違いでした。 何も起きない理由は「条件が合わない場合の記述がない」ためです。 If を使うなら If myTbl.Cells(i, myFld).Value = AB Then Exit Sub Else myTbl.Cells(i, myFld).Value = AB End If のように Else で条件が一致しない場合の処理をいれるか、 If myTbl.Cells(i, myFld).Value <> AB Then myTbl.Cells(i, myFld).Value = AB End If のように条件が一致しない場合に処理するようにするかです。
- Wendy02
- ベストアンサー率57% (3570/6232)
たぶん、こういうことでは? なお、テーブルと設定されたのでしたら、そのまま使えばよいと思います。 Sub TestMacro2() Dim i As Long Const myFld As Integer = 3 With Range("テーブル") For i = 1 To .Rows.Count .Cells(i, myFld).Value = .Cells(i, 1).Value & "." & .Cells(i, 2).Value Next i End With
- papayuka
- ベストアンサー率45% (1388/3066)
この行の意味は解って書いてますか? If myTbl.Cells(i, myFld).Value = AB Then Exit Sub End If これは If文です。 条件が合わないので Exit Sub に入り、そのまま何もしないで終了です。 代入したいなら上記3行を下記に置き換える myTbl.Cells(i, myFld).Value = AB 但し、この指定は全部に同じ値を入れるようになってます。 それで良いの? 本当は myTbl.Cells(i, myFld).Value = Range("A" & i) & "." & Range("B" & i) のようにしたいのでは?
お礼
丁寧に解説を書いていただき、有難うございました。 For~Nextの意味はわかるのですが、処理の記述の仕方がわからなかったんです。解りやすくて、勉強になりました。