はじめに
Excelの高速化テクニックの1つに、シートに対する読み書きの回数を減らすために「二次元配列を使ってシートに対する読み込み/書き込みを行う」というものがあります。
この時、例えばUsedRange
などを使ってシートの内容を取得して、その結果をVariant型の変数に代入すると、添え字が1から始まる配列(二次元配列)となっています。
Javaなど他の言語では配列の添え字は0から始まるのが一般的なので、配列の添え字の下限値をコントロールする方法を少し調べてみました。
配列の宣言時に添え字の下限値を指定する方法
- 配列の宣言時に、
Dim 配列名(添え字下限値 TO 添え字上限値)
と書くことで、添え字の下限値を指定できます。 - この方法が最もよく知られているオーソドックスな方法だと思います。
Module1.bas
Option Explicit
' 配列の添え字の下限値/上限値の確認
Sub TestLowerBound()
Dim ary(1 To 5) As Integer
Dim ary2D(1 To 4, 1 To 5) As Integer
Debug.Print "【一次元配列】添え字の下限値:" & LBound(ary)
Debug.Print "【二次元配列】添え字の下限値(一次元目):" & LBound(ary2D, 1)
Debug.Print "【二次元配列】添え字の下限値(二次元目):" & LBound(ary2D, 2)
End Sub
実行結果
【一次元配列】添え字の下限値:1
【二次元配列】添え字の下限値(一次元目):1
【二次元配列】添え字の下限値(二次元目):1
Option Baseステートメントを使う方法
- モジュールの先頭でOption Base ステートメントを使うと、そのモジュール内で宣言した配列の添え字の下限値を指定した値に変更できます。
- 変更されるのはあくまでも「デフォルト値」となるため、明示的に下限値を指定した場合にはデフォルト値は採用されません。
-
Dim ary(0 TO 5) AS Integer
と書いた場合、配列の添え字の下限値は0となります。
Module2.bas
Option Explicit
Option Base 1
' 配列の添え字の下限値/上限値の確認
Sub TestLowerBound2()
Dim ary(5) As Integer
Dim ary2D(4, 5) As Integer
Debug.Print "【一次元配列】添え字の下限値:" & LBound(ary)
Debug.Print "【二次元配列】添え字の下限値(一次元目):" & LBound(ary2D, 1)
Debug.Print "【二次元配列】添え字の下限値(二次元目):" & LBound(ary2D, 2)
End Sub
実行結果
【一次元配列】添え字の下限値:1
【二次元配列】添え字の下限値(一次元目):1
【二次元配列】添え字の下限値(二次元目):1
まとめ
- Option Baseステートメントはあまり知られていない方法なので、VBAに慣れていない人にコードを引き継いだ後に不具合を生みそうです。
- 一方で、「若干ではあるもののコードがスッキリする」「添え字の下限値の指定し忘れを防げる」という効果が期待できます。
- Javaなどでも「配列の添え字は0から始まる」というのが普通だったので、最初は「添え字が1から始まる」というのが不思議に感じたのですが、これは「セルの番地(〇行目×列)と合わせるための措置」ではないかと思われます。
- C#からInterop経由でExcelを操作する際にも、配列の添え字の下限値を1にする必要があります。
- 【C#】Microsoft.Office.Interop.Excelで使える二次元配列を作る