[[20220215105559]] 『複数行の選択の仕方』(わさび) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数行の選択の仕方』(わさび)

一行をコピーするマクロは作成することができました。

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


tkit様

ありがとうございます。
ロジックだけでは自力で作成できないかもしれないため、ロジックもコードも教えていただきたいです。
申し訳ありません。
(わさび) 2022/02/15(火) 11:43


If TypeName(Selection) = "Range" Then
   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


手本様、もこな2様

ご協力いただきありがとうございます。
初めてのことが多くて、ついていけないというか勉強になります。

■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.