の続き
例えばPythonでいうところの
# 配列itemsを定義 ※Python等の配列のインデックス番号は0から始まることに注意
items = ["test1","test2","test3"]
# PythonのFor文の例
for i in range(len(items)):
print(i+1,items[i])
#-----出力結果------------
>> 1 test1
>> 2 test2
>> 3 test3
の range(len(items)) にあたるものの書き方がVBAだとそこそこ慣れない感じだったので、自分の頭の整理のために以下にまとめておく
例えば、以下の表のA列において番号を入力していくような場合を考える。
※実際はこれぐらいならオートフィルで手入力でいい気もするが(-_-;)。。あくまで例ということで
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 番号 | 氏名 | 年齢 | |
| 2 | A田B男 | 30 | ||
| 3 | C山D子 | 29 | ||
| 4 | F山G男 | 30 | ||
| 5 |
これをマクロで何とかする場合、マクロを後で使い回しやすいように、終了値はEndプロパティで何が来てもいい感じに取得されるようにすることが多いらしい
以下の例は「4」が「分かっていない」ものとして
Sub 番号書き込み1()
Dim 行番号 As Long
For 行番号 = 2 To 4
Cells(行番号,1).Value = 行番号 - 1
Next 行番号
' Nextの次の行番号は省略可
End Sub
「To」の後ろをEndプロパティ等を使って書き換えたものである
(1)1行目のセルからB列を見たときに下方向に向かって最終行(=値がある最後の行)を探す場合
Sub 番号書き込み1()
Dim 行番号 As Long
For 行番号 = 2 To Range("B1").End(xlDown).Row
Cells(行番号,1).Value = 行番号 - 1
Next 行番号
' Nextの次の行番号は省略可
End Sub
の Range("B1").End(xlDown).Row
(2)シートの最終セルのある行からB列を見たときに上方向に向かって最終行を探す場合
Sub 番号書き込み2()
Dim 行番号 As Long
For 行番号 = 2 To Cells(Row.Count,2).End(xlUp).Row
Cells(行番号,1).Value = 行番号 - 1
Next 行番号
' Nextの次の行番号は省略可
End Sub
の Cells(Row.Count,2).End(xlUp).Row
以下のような書き方もあるらしい
Sub 番号書き込み2()
Dim 行番号 As Long
For 行番号 = 2 To Range("B" & Rows.Count).End(xlUp).Row
Cells(行番号,1).Value = 行番号 - 1
Next 行番号
' Nextの次の行番号は省略可
End Sub
Range("B" & Rows.Count).End(xlUp).Row
「&」は文字列結合演算子
結局何をしているのか
~.End() までで何らかのセルを取得し、「.Row」で、その行数を取得している。
※上の例では「B4セル」を取得し、「.Row」でその行数の「4」を取っている
~End(xl~).Column で同様に列数を取った場合、A、B、C、・・・ではなく、
1,2、3・・・の値が取得される
Sub sample()
ActiveCell.Value = Cells(指定したい行の行数, Columns.Count).End(xlToLeft).Column
End Sub
.End()プロパティの移動に関する注意
(1)〇〇.End()の 〇〇 は移動の起点
※Rows.Count、Columns.CountはそれぞれExcel全体の最終行数、最終列数を表す
(2)起点とするセルから進行方向に以下のルールを元に直線に移動する
①値が入っているセルを起点とする場合、最初に来る空白セルの手前で止まる
②値が入っていないセルを起点とする場合、最初に来る値が入っているセルで止まる
③「.Row」か「.Column」で値を取った際は返り値のデータ型はLongのため、演算に使われうる(※下の例参照)
Sub sample()
Dim i As Long, j As Long '複数変数を書く場合、Dimを書くのは各行の最初だけ
For i = 1 To Range("A1").End(xlDown).Row
'A1列を基点として行を下方向に見ていって最初に来る空白セルの前(ここでは10行目)の行数を取得(そのため10)
If Cells(i, 2) <> "×" Then 'B列のi行目の値が「×」でないならば
j = Cells(Rows.Count, 4).End(xlUp).Row + 1
'最後の+1は見出し行の次に行くための+1
Cells(i, 1).Copy Cells(j, 4)
End If
Next i
End Sub
このマクロを例えば
で試すとこうなる
Copyメソッドは
コピー元のセル.Copy コピー先のセル
A.Copy B 'AをBにコピーする
主な参考資料
①この1冊で合格! 永井雅明のExcel VBA ベーシック テキスト&問題集
②Range.End プロパティ (Excel)(Microsoftの公式ドキュメント)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.end
③Range.Row プロパティ (Excel)(Microsoftの公式ドキュメント)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.row


