選択しているセルの最初の列行と最後の列行を取得する方法を教えてください。
やりたいこととしては、
VBAを作成していて、下記を埋める時に
For i = 選択している最初の行 to 選択している最後の行 For j = 選択している最初の列 to 選択している最後の列
としたいです。
例としては、
A1からC3まで選択していたら・・・
For i = 1 to 3 For j = 1 to 3
となるような感じです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
vba
1 Dim i As Long, j As Long 2 3 With Selection 4 For i = .Cells(1, 1).Row To .Cells(.Rows.Count, 1).Row 5 For j = .Cells(1, 1).Column To .Cells(1, .Columns.Count).Column 6 Debug.Print i; j 7 Next 8 Next 9 End With
という感じかな?
選択範囲すべてのセルに同じ処理をするのなら、For Each を使った方がシンプルになりますが、最終的に何をしたいのか不明なので、とりあえずは要件にそった回答。
投稿2019/09/06 02:39
編集2019/09/06 02:44総合スコア34073
0
ベストアンサー
ええと、、、
まず最初に、
セル範囲は、「セルの集まり」だというところから認識してください。
そして、エクセルVBA的には、セル範囲は4つの形態として認識できます。
1)各単体のセルの集まり(Cells)
2)行の集まり(Rows)
3)列の集まり(Columns)
4)矩形に区切られたセルの集まり(Areas)
つまり、
C3セルからE5セルのセル範囲
と指定した時、
単体のセルの集まりの1番目のセルは?
と、エクセル君に聞くと、
C3セルを返します。
そして、
セルの集まりの9番目のセルは?と聞くと、
E5セルを返します。
Magbox Range("C3:E5").Cells(9).Address
同じように3番目の行は?と聞くと、
C5セルからE5セルの行を返します。
Msgbox Range("C3:E5").Rows(3).address
※↑のコードを1行コピーして、イミディエイトウィンドウに貼りつけたあと、
Enterキー押下で動作を確認してみてください。
それで、
最初の行は1番目の行なので1でいいですね?
最後の行は、
例えばセル範囲が5行あれば、5番目、
10行あれば10番目の行ですよね?
つまり、セル範囲の行の数を数えればいいわけです。
これは、Countプロパティで取得できます。
Msgbox Range("C3:E5").Rows.Rount
日本語で書くと、
メッセージボックスに表示。セル範囲(C3セルからE5セル)の行の集まりの数。
となります。
次に、
「選択しているセル」ですが、
これはExcelVBAでは、
Cellection
と表現します。(ただし、選択されるものは、セルだけではないので、要注意)
ということを踏まえると、
ExcelVBA
1Sub test() 2 Dim i As Long, j As Long 3 4 For i = 1 To Selection.Rows.Count 5 For j = 1 To Selection.Columns.Count 6 MsgBox Selection.Cells(i, j).Address(False, False) 7 Next 8 Next 9End Sub
こういう感じになります。
が、あえてわざわざ行の数や列の数の値をセル範囲から取り出して、
それを使う必要はないかも知れません。
集まりの話をしましたが
「集まり」のことを「コレクション」といいます。
この、コレクション内を巡回するするときは、
For Each ステートメントを使います。
ExcelVBA
1Sub test2() 2 Dim r As Range, c As Range 3 4 For Each r In Selection.Rows 5 For Each c In r.Columns 6 c.Select 7 MsgBox c.Address(falsse, False) 8 Next 9 Next 10End Sub
意味的には、
選択範囲の行の集まりを要素(この場合は各行)毎に繰り返す 各行の列の集まりを要素(この場合は各列)ごとに繰り返す (結局1行の各列なので単体のセルになる) そのセルを選択 そのセルのアドレスを表示 次へ 次へ
というような感じになります。
ここで、
1)各単体のセルの集まり(Cells)
という話をしました。
つまりセル範囲を各セルの集まりと見立てることも出来るわけです。
ExcelVBA
1Sub test3() 2 Dim c As Range 3 4 For Each c In Selection.Cells 5 c.Select 6 MsgBox c.Address(False, False) 7 Next 8End Sub
このように、
「あるセル範囲の内、各セルに対して何か操作をしたい。」
と思った時には、
行番号がどうとか、何番目がどうとかあえて考えなくても、
あるセル範囲というもの中にそれらの情報は内包されていますので、
「操作対象のセル範囲を各各巡回する」と
命令文を書けばいいです。
For Each ステートメント
ぜひ覚えてください。
投稿2019/09/06 03:13
総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
VBA
1列始 = ActiveCell.Column 2行始 = ActiveCell.Row 3列終 = C1 + Selection.Columns.Count - 1 4行終 = R1 + Selection.Rows.Count - 1
投稿2019/09/06 02:37
総合スコア120
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。