Excel VBAで選択されたセルに値を追加する方法

このQ&Aのポイント
  • Excelの仕事の効率化のために、VBAを学んでいます。しかし、現在、選択されたセルに値を追加する機能でつまずいています。具体的には、選択された位置から離れた複数のセルに、リストから参照した値を追加したいと考えています。しかし、最初に選択したセルの内容が、後続のセルにも反映されてしまいます。この問題を解決する方法を教えていただけると幸いです。
  • 現在、ExcelのVBAを学習しているのですが、選択されたセルに値を追加する処理で問題が発生しています。具体的には、Ctrlキーを押しながら複数のセルを選択し、リストから参照した値を選択されたセルの内容に追加したいと考えています。しかし、最初に選択したセルの内容が、後続のセルにも反映されてしまいます。この問題を解決する方法を教えていただけないでしょうか?
  • ExcelでVBAを使って、選択されたセルに値を追加する方法について教えてください。具体的には、Ctrlキーを押しながら複数のセルを選択し、リストから参照した値を選択されたセルの内容に追加したいと思っています。ただし、最初に選択したセルの内容が、後続のセルにも反映されてしまうという問題があります。この問題を解決する方法を教えていただけますか?
回答を見る
  • ベストアンサー

Excel、VBA、選択されているセルに値の追加

最近仕事の事務作業を軽減させるためVBAの勉強を始めました。 現在VBAにて機能実現においてつまずいております。 ご教授いただけると幸いです。 実現したい機能といたしましては、Ctrlとクリックで選択された位置の離れている複数のセルに対し、 リストから参照した値を、選択されているセルの内容に追加したいと考えております。 現在最初に選択したセルの内容が、以降選択したセルに反映されてしまう形になってしまっています。 それぞれのセルに最初に選択したセルの内容を反映させず、リストから選んだ内容を追加しようとすればどのような方法があるでしょうか? ご回答の方、どうぞよろしくお願いいたします。 以下は現在のソースと、実現したい画面イメージになります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim k As String '1,3のセルの内容が変更されたら開始 If Target.Address = "$C$1" Then Application.EnableEvents = False 'セル1,3の内容をkに代入 k = Cells(1, 3).Value '選択されているセルにkの内容を追加 Selection.Value = Selection.Value & k Application.EnableEvents = True End If End Sub

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

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

つい昨日、似たような質問に回答しましたが、 http://qanda.rakuten.ne.jp/qa7915458.html こちらが参考になりますかどうか(笑)。

YukikoAmagi
質問者

お礼

ありがとうございます。 回答者様の方法で難なく実現できることができました。 ありがとうございました。

その他の回答 (3)

回答No.4

Target と Selection の両立って、初め言ってる意味がよく分からなかったんですが、連続してないセルの同時選択ってことね。器用なことをされますね(笑)確かに、不可能ということはない。 けれど、マクロ入れたボタンを押したら Selection に対して書換えって感じにでもしておけば、間違えないように操作しなきゃとか、そんな気苦労もしないで済むのでは、と思いました。ショートカットキーで実行でもいいし。

YukikoAmagi
質問者

お礼

ありがとうございます。 もっとVBAに関して色々なことを勉強していきたいと思います。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

こんなカンジですかね。 private sub worksheet_change(byval Target as excel.range)  dim res  dim h as range  on error goto errhandle  res = target.cells(1).validation.type  application.enableevents = false  for each h in selection   if h.address <> target.cells(1).address then    h = h & target.cells(1)   end if  next  application.enableevents = true errhandle: end sub #入力規則のセル番地が固定で1個だけと絶対保証できるなら,もうちょっと単純化できるかもですね。  必要に応じて応用して,工夫してみて下さい。

YukikoAmagi
質問者

お礼

ありがとうございます。 回答者様に教えていただいた方法でも実現ができました。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

Selection.Value = Selection.Value & k ↑ ここを ↓ For Each c In Selection c.Value = c.Value & k Next この形に変更

YukikoAmagi
質問者

お礼

ありがとうございます。 とても参考になりました。

関連するQ&A

  • 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 以下の画像は、実現したい画面のイメージと現在の状態です。

  • EXCEL VBAについて教えてください

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これをたとえば同一シートのA1~E10のセルとA12~E22にも同じよう別々に処理できるように設定したいのですが、どのようにすればいいのでしょうか?ちなみにA11~E11とA23~E23は合計を表示するセルにしたいです。 Excelのバージョンは2003です。 よろしくお願い致します

  • Excel VBA のセル内の選択テキストの読み書きは?

    Excel VBAで、選択されたセルではなくセル内の選択された部分のテキストの読み書きはできるのでしょうか? つまり、選択されたセルのテキストは Selection.Value を使って OldText = Selection.Value Selection.Value = "NewText" と読み書きができますが、セル内で選択されたテキストについてのインターフェイスはあるんでしょうか?

  • Excel VBA セルの内容をTextBoxに

    ExcelのVBAで質問があります。 複数のシートの表に入力した値の合計を出したいのですが、 その後の処理もあり、ユーザーフォームのテキストボックスに反映させたいと考えています。 Windows7のExcel2010で作っています。 試しにセルB1の値が変わった時、 テキストボックスに反映させるつもりで作ったコードは以下の通りですが、 上手くいきません。 Sub Z_test() UserForm2.Show vbModeless End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(False, False) = "B1" Then UserForm2.TextBox1.Value = Range("B1").Value '←※ End If End Sub ※の行には他にも UserForm2.Controls("TextBox1").Value = Range("B1").Value と調べたコードを試してみたのですが、 セルの内容が全く反映されません。 セルB1には数式の「=SUM(C2:C1000)」 が入っており、表のC列に入力された値の合計を求めています。 どなたかお知恵を拝借できれば大変助かります。 宜しくお願い致します。 長文失礼しました。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • エクセルVBAについて

    エクセルVBAについて 下にある、1行目に入力された数値の、選択したセルの数値を、B5セルに表示させるマクロなのですが、1行目が結合していると、うまくB5セルに表示できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub    '●複数セル選択は無視  If Target.Row <> 1 Then Exit Sub    '●1行目以外の選択は無視  If Target.Column > 6 Then Exit Sub   '●F列目以降の選択は無視  If Target.Value = "" Then Exit Sub   '●選択セルが未入力なら無視    Range("B5").Value = Target.Value End Sub このマクロで、結合しているセルをB5に表示させることはできますでしょうか? 1行目で選択するセルは、すべて2つのセルが結合しています。 よろしくお願いいたします。

  • Excel 2000です。VBAを改造していただきたいのですが

    入荷品のチェックシートです。B列に受領数を入力するとA列に年月日が記録されるVBAを作っていただき必要なブックのシートごとにコピーして使っていました。全品入荷完了後 別のロットにシートタブの名目を書き換えて再利用します。  ('複数セルが選択された場合、動作をキャンセル  がなぜ必要かも理解できないVBAの勉強を挫折の高齢者です) B列のセル一個づつ選択削除でないとB列が空白になるだけでA列には日付が残ります。複数のセル選択で一気に日付を削除したいのです。 お助けください。 Private Sub Worksheet_Change(ByVal Target As Range) '複数セルが選択された場合、動作をキャンセル If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B5:B1000")) Is Nothing Then Exit Sub 'B5:B1000"の範囲外は除外 Application.EnableEvents = False If Target.Value <> "" Then If IsDate(Target.Offset(, -1).Value) Then GoTo EXIT_LABEL '日付が記入済の場合は実行しない Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") Else 'セルを空白にした場合、日付を削除 Target.Offset(, -1).Value = "" End If EXIT_LABEL: Application.EnableEvents = True End Sub

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • このEXCELVBAを複数のセルにも別々に同じ処理をしたい

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、 教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これを同一シートの複数のセルにも同じよう別々に処理できるように設定したいのですが、 どのようにすればいいのでしょうか? VBAは最近始めたばかりなのでわからない事だらけです。 Excelのバージョンは2003です。 よろしくお願い致します。

  • VBAの時間入力について

    先日、時間を文字列で、HH:mmのフォーマット入力するPGを教えて頂き、 内容理解をしているのですがわからない部分があります。 ★の部分の条件で、00:00も入力したいです。 ご存知か方がおられましたら教えてください。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から 'Intersect:http://officetanaka.net/excel/vba/tips/tips118.htm 'Is Nothing:nullではない 'Selection.Count <> 1:選択数が1以下ではない(<> :等しくない) ' Not IsNumeric(Target):数値ではない If Intersect(Target, Columns(12)) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub ' 'Target:セルの値は24:00以下 '2つの数値の除算を行いし,その剰余を返す 'Mod:2つの数値の除算を行いし,その剰余を返す '★ここで00:00時も入力したい。 If Target <= 2400 And Target Mod 100 < 60 Then ' Application.EnableEvents = False ' With Target ' If Len(Target) = 3 Then .Value = 0 & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then .Value = Left(Target, 1) & ":" & Right(Target, 2) Else .Value = Left(Target, 2) & ":" & Right(Target, 2) End If .NumberFormatLocal = "hh:mm" ' End With ' Application.EnableEvents = True ' Else MsgBox "入力値が不正です。" ' With Target ' .Value = "" .Select End With Exit Sub ' End If End Sub 'この行まで

専門家に質問してみよう