- ベストアンサー
エクセルVBA 変数定義とループ条件
エクセル2003を使用しています。 普段は他の人が書いたソースを見て修正して使用する程度なのですが、今回 初めて一から作成しようとしております。以下のような動きです。 ○条件 sheet1~sheet3までの3シート。各シートの一番上は項目行。 sheet1とsheet2のみデータがあり、sheet3は項目行のみ。 ○動作 ・sheet1のC2とsheet2のC2を比較し、同じだったらsheet3の2行目にsheet1のA2,B2,C2を挿入。 続けて、その右側にsheet2のA2,B2を代入。(sheet3のA2~E2までが埋まることになります) ・比較した値が間違っていたらsheet3はいじらない。 ・次に、sheet1のC2とsheet2のC3を比較し、同じであれば値をsheet3のひとつ下の行に代入していく。(今度はA3~E3) ・Sheet1のC列とSheet2のC列の全ての組み合わせで比較をしていく。 このような動作をするため、 If Sheet2.cells(2,2) = sheet1.cells(2,2) then Sheet3.cells(2,1).value = sheet1.cells(2,1) Sheet3.cells(2,2).value = sheet1.cells(2,2) Sheet3.cells(2,3).value = sheet1.cells(2,3) Sheet3.cells(2,4).value = sheet1.cells(2,1) Sheet3.cells(2,5).value = sheet1.cells(2,2) End If まずこのような形を作って動かしたら、一番最初の行については比較、値の代入ができました。 ここで、これをループさせて上記条件の動作をさせたいのですがどれを変数にし、どのようにループさせたらいいかが見当がつきません。 分かりづらいかもしれませんがご回答いただければ幸いです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
下記を試してください。 Dim i As Long Dim j As Long For i = 0 To 10 If Sheet1.Cells(2 + i, 3).Value = Sheet2.Cells(2 + i, 3).Value Then Sheet3.Range("A2:C2").Offset(j, 0).Value = Sheet1.Range("A2:C2").Offset(i, 0).Value Sheet3.Range("D2:E2").Offset(j, 0).Value = Sheet2.Range("A2:B2").Offset(i, 0).Value j = j + 1 End If Next i
その他の回答 (2)
- mu2011
- ベストアンサー率38% (1910/4994)
一例です。 変数は行番号(シート1=a,シート2=b,シート3=c)とし、比較範囲はC2:C100としています。 サンプルコード Sub シート1とシート2比較して結果をシート3() c = 0 For Each a In Sheet1.Range("C2:C100") If a.Value = "" Then Exit Sub For Each b In Sheet2.Range("C2:C100") If b = "" Then Exit For If a.Value = b.Value Then Sheet3.Range("A2:C2").Offset(c).Value = Sheet1.Range("A2:C2").Offset(a.Row - 2).Value Sheet3.Range("D2:E2").Offset(c).Value = Sheet2.Range("A2:B2").Offset(b.Row - 2).Value c = c + 1 End If Next Next End Sub
- KURUMITO
- ベストアンサー率42% (1835/4283)
お示しのコードは文章の内容と一致していませんね。C列ですから列番号は3になりますね。 ところでループにするにはFor To Nextを使うとよいでしょう。 例えば次のようになります。 Sub データ抽出() Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Set WS3 = Worksheets("Sheet3") Dim RowPos1 As Integer Dim RowPos2 As Integer Dim RowPos3 As Integer RowPos3 = 1 For RowPos1 = 2 To WS1.Cells(65536, 3).End(xlUp).Row For RowPos2 = 2 To WS2.Cells(65536, 3).End(xlUp).Row If WS1.Cells(RowPos1, 3) = WS2.Cells(RowPos2, 3) Then RowPos3 = RowPos3 + 1 WS3.Cells(RowPos3, 1).Value = WS1.Cells(RowPos1, 1) WS3.Cells(RowPos3, 2).Value = WS1.Cells(RowPos1, 2) WS3.Cells(RowPos3, 3).Value = WS1.Cells(RowPos1, 3) WS3.Cells(RowPos3, 4).Value = WS2.Cells(RowPos2, 1) WS3.Cells(RowPos3, 5).Value = WS2.Cells(RowPos2, 2) End If Next Next End Sub
お礼
ありがとうございました。 ご回答いただいたソースを元に、自分のやりたい結果を求めることができました。offsetって便利ですね!! ちなみに、ご回答いただいたやつそのままではうまくいかなかったので、 for iの前にもうひとつfor k を作ってkをsheet1、iをsheet2用の変数に しました。