• 締切済み

VBAにて複数選択したセルの値に選択した値の追加

いつもこちらではお世話になっております。 現在VBAにて機能実現において、つまずいております。 複数選択したセルの値の後ろに、プルダウンから選択した値を追加したいと考えております。 値は追加できるのですが、選択を開始したセルの値が他のセルにも反映されてしまうという状況です。 それぞれのセルの値にプルダウンから選んだ値を追加しようと思えば、どのような方法で行えばよいでしょうか? よろしければご教授お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim a As Integer If Target.Address = "$B$1" Then Application.EnableEvents = False a = Cells(1, 2).Value Selection.Value = Selection.Value & a Cells(1, 2).Value = "" Application.EnableEvents = True End If End Sub 以下の画像は、実現したい画面のイメージと現在の状態です。

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

単純に添付図のようにしたいだけなら、 処理したいタイミングで Dim TCell As Range   For Each TCell In Selection     TCell.Value = TCell.Value & Range("B1").Value   Next これだけで出来そうな気がしますよ。 ただ、少々不思議に思ったのですが・・ Worksheet_Changeのタイミングで、これは正常に動きますか? A列を範囲指定しても、B1セルの値を変えにいくと当然のように範囲指定は解除され、 フォーカス(Target)はB1に移りますよね? 私の環境(2003・2010)では 「A列を選択したままで、B1の値を変える」 と言う行為がどう頑張っても出来なかったのですが・・・ 何かコツがあるのであれば、逆にお教えくださいませ。 例えば、Ctrl+左クリックで最終的にB1を選択する手段はありますが、 コレも残念ながら上手い方法とは思えません。 ちなみに私は、 B1セル変更→A列範囲選択→(図には入っていませんが)ボタンでマクロ起動 で処理しました。 つまり、 Sub ボタン_Click() Dim TCell As Range   For Each TCell In Selection     TCell.Value = TCell.Value & Range("B1").Value   Next   Range("B1").Value = "" End Sub こう言う感じです。

すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

>Selection.Value = Selection.Value & a  ⇒複数セル範囲を選択でこのコードは実行エラーになりませんか。     一例です。    Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, r As Range With Target If .Address = "$B$1" Then Application.EnableEvents = False For i = 1 To Selection.Areas.Count For Each r In Selection.Areas(i) If r.Address <> "$B$1" Then r.Value = r.Value & .Value Next: Next .Value = "" Application.EnableEvents = True End If End With End Sub

すると、全ての回答が全文表示されます。
  • akito0417
  • ベストアンサー率20% (55/266)
回答No.1

先ず、何故全部同じ値になるかですが、 >a = Cells(1, 2).Value の結果、aには5と入ります。(この例だと) >Selection.Value & a の結果、選択されている一番上の値になります。(この例だと岡田5) >Selection.Value = Selection.Value & a の結果、選択されている範囲全てが同一の値になります。(この例だと岡田5) 次に改善点(あくまで、A列のみ対象とします。) Selection.Rows.Countで選択している列数を取得します(この例だと4) このSelection.Rows.Countで取得した値分ループで回します。 Cells(行, 列)を使い、1行ずつ値の取得・上書きをします。 つまり For i = 0 to Selection.Rows.Count Cells(0, i).Value = Cells(0, i).Value & a Next i こういう風になります。 補足 やり方なんて何通りもあるんだし、これのみが正解ってことはないです。 むしろ他にもっといい方法があるかもしれません。 実行環境が今ないため、このまま動くか不明です。

すると、全ての回答が全文表示されます。

関連するQ&A