• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:★EXCEL VBA★2つのシートで一致しているセルに値を代入したい)

【EXCEL VBA】2つのシートで一致するセルに値を代入する方法

このQ&Aのポイント
  • Excel VBAを使用して、2つのシートで一致するセルに値を代入したい場合の方法について質問です。具体的には、1つ目のシートでコントロール1を選択し、コントロール2の実行ボタンを押すと、2つ目のシートの特定のセルに該当する値を代入したいと考えています。
  • 1つ目のシートでコントロール1を「C」に設定し、コントロール2の実行ボタンを押すと、2つ目のシートのグループと一致する「No」と「グループ」のセルに、1つ目のシートの該当する「内容」を代入することが目的です。
  • また、「A」を選択した場合は、グループの値に関係なく、1つ目のシートの該当する「No」のセルに「内容」を代入します。Excel VBAを使用してこれを実現する方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.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

yopppy
質問者

お礼

こんばんわ。papayukaさま。お世話になります。 教えて頂いたコードで無事に完成しました。 ありがとうございました。本当に助かりました。 実はシート2の「No」と「グループ」が逆で、 しばらくうまくできなかったのですが、 Offsetで-1したらできました。 また機会がありましたら宜しくお願いします。

その他の回答 (1)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

シート上に置けるオプションボタンやコマンドボタンは2種類あり(コントロールツールボックスとフォーム)それぞれコードの扱い等が違います。 「Aは ALL扱いでグループを無視」って事は、例の通りだとBもCもNoが同じなので下記のような感じで全てのグループに同じ値が入るのでしょうか? 2シート目(更新後) No グループ 内容 1 B   おはよう 2 B   こんにちわ 3 B   こんばんわ 1 C   おはよう 2 C   こんにちわ 3 C   こんばんわ > 苦戦しています。 まる投げっぽく見えちゃいますので、ソースコードを提示してどの辺が上手く行かないかを聞かれた方が良いかも。

yopppy
質問者

補足

ご返信遅くなりすみません。回答します。 コントロールツールボックスを使用しています。 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レコードみが更新される状態になってしまいます。どこかでカウンタアップさせないとダメみたいです。

関連するQ&A

専門家に質問してみよう