『複数行選択し転記したい』(はとむぎ)
シート1のセル値を一覧シートに転記したいと考えています。
下記のVBAではシート1の1つのセルを選択し、その行にある値を一覧シートの
指定した場所に転記が出来ます。
教えていただきたいのは、シート1のセルを選択するときに複数行を
選択して転記する方法になります。
複数選択は最大で15にしたいと考えています。
1)シート1のG10〜13を選択しボタン押下
2)一覧シートのBの最下段にシート1のA10の値
一覧シートのDの最下段にシート1のC10の値
3)一覧シートのBの最下段にシート1のA11の値
一覧シートのDの最下段にシート1のC11の値
4)続けてA12、C12、A13、C13と転記したい
ご教示の程、宜しくお願い致します。
Sub 一覧シートに転記()
With Sheets("一覧")
If ActiveCell.Row < 3 Then
MsgBox "転記対象範囲外です", vbExclamation, "(´・ω・`)"
Else
MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
.Cells(MaxRow, 2) = Cells(ActiveCell.Row, 1)
.Cells(MaxRow, 4) = Cells(ActiveCell.Row, 3)
End If
End With
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows11 >
そのうえで例えば、
1. シート1のA10〜A11、C10〜C11をユーザーに指定させる
(ctrlキーを押しながら選択することで複数セルを選択できます。)
2.上記のセルを一覧シートのB列最終行の1行下に貼付けする
ということであれば、次のようなコードで表現できます。
Sub さんぷる1()
Dim MyRNG As Range
Set MyRNG = Application.InputBox(prompt:="コピー元?", Type:=8)
MyRNG.Copy
Worksheets("一覧").Cells(Rows.Count, "B").End(xlUp).Offset(1).PasteSpecial Paste:=xlAll
Application.CutCopyMode = False
End Sub
■2
ただし、上記のコードだと誤ってB列込で指定されたらそのまま貼り付けられますし、A列の行とC列の行がずれていたりするとエラーになります。
したがって、安全を期すなら↓のようにしたほうがよいです。
Sub さんぷる2()
Dim MyRNG As Range, tmpRNG As Range
Set MyRNG = Application.InputBox(prompt:="コピー元?", Type:=8)
Set tmpRNG = Intersect(MyRNG.EntireRow, MyRNG.EntireColumn, ActiveSheet.Range("A:A,C:C"))
If MyRNG.Address = tmpRNG.Address Then
MyRNG.Copy
Worksheets("一覧").Cells(Rows.Count, "B").End(xlUp).Offset(1).PasteSpecial Paste:=xlAll
Application.CutCopyMode = False
Else
MsgBox "指定範囲が不適切なので処理できませんでした"
End If
End Sub
■3
そういう話でないということならば、行列を踏まえたレイアウトで
処理前と処理後の状況を説明いただくとアドバイスできることがあるかもしれません。
(もこな2) 2026/01/29(木) 13:21:50
有難う御座います。
まず、ご教示いただいたものが理解できていないので、しっかり理解して
改めて質問させていただく事にします。
(はとむぎ) 2026/01/29(木) 13:51:39
(1) なぜコピーしたいA列やC列ではなく、G列を使うのでしょうか。 A列を使って選択されたものを基準にしていると、 なにかの作業中に、その選択状態が変化してしまうのではという懸念から、 そうしているのでしょうか。それは取り越し苦労です。
(2) ご自分だけが使うマクロでご自分で承知しているのであれば良いと思いますが、 選択されたセルを基準にするのは、出来るだけ避けたほうがよいでしょう。 既に指摘がありましたが、Inputメソッド(Input関数とは違うので区別して下さい)で 指定するのが間違いがありません。
念のためコードを挙げておきます。
Sub 一覧シートに転記()
Dim rng As Range
Dim targetRow As Long
Set rng = Application.InputBox(prompt:="A列の対象範囲を選択", Type:=8)
With Sheets("一覧")
targetRow = .Cells(Rows.Count, "B").End(xlUp).Row + 1
rng.Copy .Cells(targetRow, "B")
rng.Offset(0, 2).Copy .Cells(targetRow, "D")
End With
End Sub
(3)
なお、もし式が入っているが、値だけ必要な場合は、下記のような書き方になります。先刻ご承知でしょうけど。
rng.Copy
.Cells(targetRow, "B").PasteSpecial Paste:=xlPasteValues
rng.Offset(0, 2).Copy
.Cells(targetRow, "D").PasteSpecial Paste:=xlPasteValues
ああ、D列の最終行がB列のそれと違うのなら、別々に求めます。
(xyz) 2026/01/29(木) 17:09:31
質問内容とは無関係ですのでお急ぎの方はスキップしてください。
回答作成中にバグらしき動作に遭遇しましたので、情報共有します。 (既に有名な事象かもしれませんが、私は聞いたことがなく、驚きました。)
Sub test()
Sheet1.Range("A1:B3").Copy Sheet2.Range("D11")
End Sub
これを実行すると、
・コピーはされて結果オーライなのですが、
・処理後に、
コピー元であるSheet1(Sheet2ではなくSheet1です)の
D11:E13 が選択状態になります。
不思議でしょう?
【備考】 ただし、 ・シートタブをクリックして、いったんSheet2を表示してから、再度Sheet1に戻ると、 シート中のセルを一切触らなくても、間違った選択状態は修正されています。 ・Sheet1の D11:E13 が選択状態になっている状態で、 VBEのイミディエイトで ?Selection.Address を実行すると$D$11:$E$13 ではなく 別セルなので、 単に、選択状態の表示だけが間違っているようです。 これはExcelのバグなんでしょうか。 こんな基本的な動作で誤動作が起きてしまうのに、放置されている神経が分かりません。
(xyz) 2026/01/30(金) 13:08:26
xyzさん
>・処理後に、
コピー元であるSheet1(Sheet2ではなくSheet1です)の
D11:E13 が選択状態になります。
名前ボックスでも本来のセル(Sheet1の元々のActivecell) が表示されているし、 そのままEnterキーを押すと本来のセルの下にActivecellが移動するので、 本当に表示(見た目)だけのバグなんでしょうね。 (純丸) 2026/01/30(金) 18:08:26
コメント感謝します。 たしかに表示だけとはわかりつつも、コピーというのは誰もが使うものなので気になりました。 質問者さん、本題に戻って下さい。interlude終了です。 (xyz) 2026/01/30(金) 20:11:58
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.