目次
.Item
今回は ExcelVBA の Range オブジェクトの Item プロパティにインデックス番号を指定すると、どんな結果が返ってくるのかをテストしてみました。
マクロの一例
テストとして以下のマクロを作成してみました。「C4:E8」のセル範囲の Item プロパティに -50 から +50 までのインデックス番号を指定してみました。
Sub RangeオブジェクトのItemプロパティにインデックス番号を指定した結果を見てみるマクロ() Cells.Clear '全セル内容消去(書式設定まで) Dim a As Range 'セル範囲を格納する用の変数 Set a = Range("C4:E8") '指定範囲への参照をセット a.Interior.ColorIndex = 6 '背景色を黄色に設定 Dim b As Long 'Item のインデックス番号
'ループスタート
For b = -50 To 50 On Error Resume Next 'エラー発生時次の行から処理継続 a.Item(b).Value = b 'インデックス番号出力 Next
'ループが完了するとこの行に来ます
End Sub
上記マクロを実行してみると、以下の画像の結果になりました。「C4」セルを基点にして、プラス方向とマイナス方向のインデックス番号が出力されました。
四隅のセルアドレスを取得
Item プロパティで指定セル範囲の四隅のセルアドレスを取得するマクロを作成してみました。
Sub Itemプロパティで四隅のセルアドレスを取得()
Dim a As Range
Set a = Range("C4:E8")
Debug.Print "範囲="; a.Address(False, False)
Dim b As Long
b = a.Count
Debug.Print "セル個数="; b
Dim c As Long
c = a.Columns.Count
Debug.Print "列数="; c
Dim d As Long
d = b - c + 1
Debug.Print "左下のインデックス番号="; d
Debug.Print "左上="; a.Item(1).Address(False, False)
Debug.Print "左下="; a.Item(d).Address(False, False)
Debug.Print "右上="; a.Item(c).Address(False, False)
Debug.Print "右下="; a.Item(b).Address(False, False)
End Sub
上記マクロを実行してみると、 VBE のイミディエイトウィンドウに以下の内容が出力されました。
範囲=C4:E8
セル個数= 15
列数= 3
左下のインデックス番号= 13
左上=C4
左下=C8
右上=E4
右下=E8
A1 セルを取得
Item プロパティで A1 セルを取得するマクロを作成してみました。
Sub ItemプロパティでA1セルを取得()
Debug.Print Cells.Item(1).Address
End Sub
マクロを実行してみると、 VBE のイミディエイトウィンドウに以下の内容が出力されました。
$A$1
一列の場合
セル範囲が一列の場合はどうなるのかを試してみました。
Sub 一列の場合() Cells.Clear '全セル内容消去 Dim a As Range 'セル範囲を格納する用の変数 Set a = Range("B5:B9") '指定範囲への参照をセット a.Interior.ColorIndex = 6 '背景色を黄色に設定 Dim b As Long 'Item のインデックス番号 For b = -65536 * 2 To 65536 * 2 '2 列分 On Error Resume Next 'エラー発生時次の行から処理継続 a.Item(b).Value = b 'インデックス番号出力 Next End Sub
上記マクロを実行してみると、以下の画像の結果になりました。
マイナスの方は A1 まで戻って来ると思っていましたが -3 まで出力されました。
プラスの方は C 列まで出力されると思っていましたが、 B 列 の最終行まで出力されました。 65536 行は私の使用している Excel 2003 の最終行です。
入力後にセルを移動する方向を変えて
上記までのテストは、 Excel アプリの「ツール > オプション > 編集」の入力後にセルを移動する方向が「下」になっている設定でテストを行いましたが、方向を「右」に変更して一例目のマクロ実行してみます。
下記のマクロで。入力後にセルを移動するかどうかの True/False 設定、移動する方向の設定を変更してみます。
Sub Excelのオプション設定の入力後に移動する方向を右に変更()
'入力後にセルを移動する」のチェックを「ON」
Excel.Application.MoveAfterReturn = True
Debug.Print Excel.Application.MoveAfterReturn
'方向を右に設定
Excel.Application.MoveAfterReturnDirection = xlToRight '-4161
Debug.Print Excel.Application.MoveAfterReturnDirection
End Sub
ちなみに、 xlToRight の -4161 という定数の数値は xlToRight に文字入力カーソルを合わせて「Ctrl+I(アイ)」のショートカットキーを押すと確認出来るようです。
VBE のクイックヒントという編集機能のようです。
当投稿の一例目のマクロを実行してみると以下の画像の結果になりました。 Item プロパティの動作は入力後に移動する方向に左右されていないようです。
.Item を省略した場合
一例目のマクロの以下の部分の「.Item」を省略したマクロもテストしてみたいと思います。
.a.Item(b).Value = b 'インデックス番号出力
「.Item」を省略後は以下の記述になりました。
a(b).Value = b 'インデックス番号出力
完成したマクロは以下のようになりました。
Sub Item省略_RangeオブジェクトのItemプロパティにインデックス番号を指定した結果を見てみるマクロ() Cells.Clear '全セル内容消去(書式設定まで) Dim a As Range 'セル範囲を格納する用の変数 Set a = Range("C4:E8") '指定範囲への参照をセット a.Interior.ColorIndex = 6 '背景色を黄色に設定 Dim b As Long 'Item のインデックス番号 'ループスタート For b = -50 To 50 On Error Resume Next 'エラー発生時次の行から処理継続 a(b).Value = b 'インデックス番号出力 Next 'ループが完了するとこの行に来ます End Sub
上記マクロを実行してみると以下の画像の結果になりました。 A1 が -10 、 D20 が 50 になっていて一例目のマクロの結果と同じになっていますね。
テスト環境
- Windows 10(64 ビット)
- Microsoft Office Excel 2003
以上、閲覧ありがとうございました。