質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

5866閲覧

複数行選択しているセルの最初と最後の行と列の取得の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/09/06 01:57

選択しているセルの最初の列行と最後の列行を取得する方法を教えてください。

やりたいこととしては、
VBAを作成していて、下記を埋める時に

For i = 選択している最初の行 to 選択している最後の行 For j = 選択している最初の列 to 選択している最後の列

としたいです。

例としては、
A1からC3まで選択していたら・・・

For i = 1 to 3 For j = 1 to 3

となるような感じです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/06 04:15

すごく詳しく教えてくださりありがとうございます。 勉強になりました。
guest

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

Dot

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2019/09/06 02:43

ActiveCell が必ず選択範囲の左上とは限らないです。 例えば左上方向に向かって選択した場合は、右下がActiveCellになります。
Dot

2019/09/06 02:45

そうですね 必ず左上からやってたのでこれではだめですね ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問