- ベストアンサー
【EXCEL VBA】2つのシートで一致するセルに値を代入する方法
- Excel VBAを使用して、2つのシートで一致するセルに値を代入したい場合の方法について質問です。具体的には、1つ目のシートでコントロール1を選択し、コントロール2の実行ボタンを押すと、2つ目のシートの特定のセルに該当する値を代入したいと考えています。
- 1つ目のシートでコントロール1を「C」に設定し、コントロール2の実行ボタンを押すと、2つ目のシートのグループと一致する「No」と「グループ」のセルに、1つ目のシートの該当する「内容」を代入することが目的です。
- また、「A」を選択した場合は、グループの値に関係なく、1つ目のシートの該当する「No」のセルに「内容」を代入します。Excel VBAを使用してこれを実現する方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 提示されたコードを読んでも解らない部分があり、意味が違うかも知れません。 こちらで試したテスト環境を書きますので、試す場合は同様の環境で試して見て下さい。 1)シート名 Sheet1 の A1:B4 に下記リストがあり、1行目はタイトル行とする。 No 内容 1 おはよう 2 こんにちわ 3 こんばんわ 2)シート名 Sheet2 の A1:C7 に下記リストがあり、1行目はタイトル行とする。 No グループ 内容 1 B 2 B 3 B 1 C 2 C 3 C 3)シート名 Sheet1 には コントロールツールボックスの CommandButton が1つと OptionButton が3つある。 CommandButton1 の Click イベントを下記のようにする。 Private Sub CommandButton1_Click() Dim op As String, r As Range, fr 'OptionButton は GroupName が同じとする If Me.OptionButton1.Value Then op = "A" If Me.OptionButton2.Value Then op = "B" If Me.OptionButton3.Value Then op = "C" With Worksheets("Sheet2") '取り合えず実行するたびに C列 をクリアする .Range("C2", .Range("A65536").End(xlUp).Offset(0, 2)).Clear 'Sheet2をA2からループ For Each r In .Range("A2", .Range("A65536").End(xlUp)) 'Sheet1(Me)のA列に完全に一致する値があるかを検索 Set fr = Me.Columns("A").Find(what:=r.Value, lookat:=xlWhole) If Not fr Is Nothing Then '見つかった場合、op の状態によって転記方法を分ける Select Case op Case "A" '同じなら全部転記 r.Offset(0, 2).Value = fr.Offset(0, 1).Value Case "B", "C" '条件に合う場合のみ転記 If r.Offset(0, 1).Value = op Then r.Offset(0, 2).Value = fr.Offset(0, 1).Value End If End Select End If Next r End With End Sub
その他の回答 (1)
- papayuka
- ベストアンサー率45% (1388/3066)
シート上に置けるオプションボタンやコマンドボタンは2種類あり(コントロールツールボックスとフォーム)それぞれコードの扱い等が違います。 「Aは ALL扱いでグループを無視」って事は、例の通りだとBもCもNoが同じなので下記のような感じで全てのグループに同じ値が入るのでしょうか? 2シート目(更新後) No グループ 内容 1 B おはよう 2 B こんにちわ 3 B こんばんわ 1 C おはよう 2 C こんにちわ 3 C こんばんわ > 苦戦しています。 まる投げっぽく見えちゃいますので、ソースコードを提示してどの辺が上手く行かないかを聞かれた方が良いかも。
補足
ご返信遅くなりすみません。回答します。 コントロールツールボックスを使用しています。 AのALL扱いというのは、BもCもで認識あっており、 (例)に挙げていただいた通りでOKです。 チャレンジしているソースコードを添付します。 まずは値が一致した箇所に代入する。という部分をいろいろ研究しています。 Private Sub CommandButton1_Click() y = 0 Set d1 = Sheets1 Set d2 = Sheets2 R = d2.Cells(65536, "B").End(xlUp).Row For i = 1 To R Set X = d1.Columns("B").Find(What:=d2.Cells(i, "B"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) If Not X Is Nothing Then d2.Cells(i, "C") = X.Offset(y, 1) End If y = y + 1 Next i End Sub これだと、シート1でBと指定した場合、 シート2の結果として、最初にヒットしたBの3レコードみが更新される状態になってしまいます。どこかでカウンタアップさせないとダメみたいです。
お礼
こんばんわ。papayukaさま。お世話になります。 教えて頂いたコードで無事に完成しました。 ありがとうございました。本当に助かりました。 実はシート2の「No」と「グループ」が逆で、 しばらくうまくできなかったのですが、 Offsetで-1したらできました。 また機会がありましたら宜しくお願いします。