[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数行の選択の仕方』(わさび)
一行をコピーするマクロは作成することができました。
sub sample()
dim rw as long
dim rc as vbmsgboxresult
rw=activecell.row
rc=msgbox(cell(rw,4)&"の行をコピーしますか?",vbYesNo)
if rc=vbYes then
range(cell(rw,"B"),cell(rw,"AO")).copy
end if
end sub
複数行(例えばH10〜H15)を選択しているときは、その行の全体(B10〜AO15)を選ぶことはできますか。
この場合の、6行分のD列の情報がメッセージボックスに出て、コピーしますか?と聞いてくれたらよいですが、面倒であれば、「6行分コピーしました」というメッセージボックスでもよいです。
よろしくお願いします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
>複数行(例えばH10〜H15)を選択しているときは、その行の全体(B10〜AO15)を選ぶことはできますか。
出来ます。
>この場合の、6行分のD列の情報がメッセージボックスに出て、・・・
ロジックを考えて欲しい、ということですか? コードを改造して欲しい、ということですか?
(tkit) 2022/02/15(火) 11:31
ありがとうございます。
ロジックだけでは自力で作成できないかもしれないため、ロジックもコードも教えていただきたいです。
申し訳ありません。
(わさび) 2022/02/15(火) 11:43
If Selection.Areas.Count = 1 Then Selection.EntireRow.Select MsgBox Selection.Rows.Count & "行" End If End If
適当に応用してください。
(手本) 2022/02/15(火) 11:43
■1
質問とは関係ありませんが、全部小文字になっているところをみると手打ちされたのですかね。
細かいタイプミスの指摘はお互いに不利益だとおもいますので、無理にとは言いませんが、極力VBE(エディタ)から直接コピペして投稿されるとよいと思います。
■2
手打ちされた結果そうなっているだけかもしれませんし、こだわりがあるということかもしれませんが、実際のコードもインデントを付けていないということであれば、インデントを付けることをお勧めします。
インデントを付けることで、コード全体の構造が把握しやすくなり、ご自身のデバッグ作業の効率アップに寄与するとおもいます。
■3
>複数行(例えばH10〜H15)を選択しているとき〜
残念ながら複数の範囲を選択していても「ActiveCell」は1つしかありません。
「選択しているセル範囲」を取得するならば「Selection」を使います。
しかし、「Selection」になり得るのはセル範囲だけとは限りません。例えばオートシェイプなどの図形を選択していたらそれが「Selection」になってます。
なので、どうしても使うなら「Selection」のタイプを判別して使うのが無難だとおもいます。
【参考】 http://officetanaka.net/excel/vba/tips/tips15.htm
■4
>複数行(例えばH10〜H15)を選択しているときは、その行の全体(B10〜AO15)
このようなケースでは、【選択しているセルが含まれる行全体】と【B〜AO列全体】が【交差するセル】が処理対象というように考えるとよいです。
この【交差するセル】を取得するにはIntersectメソッドを使います。
【参考】 http://officetanaka.net/excel/vba/tips/tips118.htm https://excel-ubara.com/excelvba1/EXCELVBA402.html
■5
>6行分のD列の情報がメッセージボックスに出て
仰っているイメージがわからないので、サンプル例を提示できませんか?
(6行分もあると提示が大変だとおもうので、2,3行の例でかまいません)
■6
とりあえず2〜4を踏まえるとこんな感じになります。興味があればステップ実行して研究してみてください。
Sub 研究用() Dim MyRNG As Range
If TypeName(Selection) = "Range" Then Set MyRNG = Intersect(Selection.EntireRow, Range("B:AO"))
If MsgBox(prompt:="以下のセル範囲をコピーしますか?" & vbLf & MyRNG.Address(False, False), Buttons:=vbYesNo) = vbYes Then MyRNG.Copy End If End If End Sub
(もこな2) 2022/02/15(火) 12:09
ご協力いただきありがとうございます。
初めてのことが多くて、ついていけないというか勉強になります。
■5について
例えば6行分(H10〜H15)をコピーしたとして、D列の内容(D10〜D15)を表示したいと考えていました。
「D10、D11、D12、D13、D14、D15の行をコピーしますか?」と表示させることを考えていました。
(D10〜D15は実際のセルの値が表示されているということです)
しかし、それよりは、「6行コピーしました」の方がよいかと考えなおしました。
選択した範囲のうち、(一番下の行数)−(一番上の行数)+1をして、メッセージボックスに表示させる行数を算出するようになるのでしょうか。
よろしくお願いいたします。
(わさび) 2022/02/15(火) 16:38
参考に Sub Test() Dim rw As Long Dim rc As VbMsgBoxResult Dim i As Long, msg As String
With Selection For i = 1 To .Rows.Count msg = msg & .Rows(i).EntireRow.Range("D1").Value & vbCrLf Next rc = MsgBox(msg & "上記" & .Rows.Count & "行をコピーしますか?", vbYesNo) If rc = vbYes Then .EntireRow.Columns("B:AO").Copy End If End With End Sub
(ピンク) 2022/02/15(火) 23:08
当初の考えを踏まえたメッセージボックスにしていただいたんですね。
ありがとうございました!!
(わさび) 2022/02/16(水) 18:48
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.