サーチ…
VBAで配列を宣言する
配列の宣言は、変数の宣言と非常によく似ていますが、名前の直後に配列の次元を宣言する必要がある点が異なります。
Dim myArray(9) As String 'Declaring an array that will contain up to 10 strings
既定では、VBA内の配列はゼロからインデックスされているため、かっこ内の数値は配列のサイズを参照するのではなく、最後の要素のインデックスを参照します
要素へのアクセス
配列の要素にアクセスするには、Arrayの名前を使用し、括弧の中にある要素のインデックスを続けます。
myArray(0) = "first element"
myArray(5) = "sixth element"
myArray(9) = "last element"
配列の索引付け
配列のインデックス付けを変更するには、この行をモジュールの先頭に配置します。
Option Base 1
この行では、モジュールで宣言されているすべての配列が1つのインデックスに登録されます 。
特定のインデックス
To
キーワードと下限/上限(=インデックス)を使用して、独自のインデックスを持つ各配列を宣言することもできます。
Dim mySecondArray(1 To 12) As String 'Array of 12 strings indexed from 1 to 12
Dim myThirdArray(13 To 24) As String 'Array of 12 strings indexed from 13 to 24
動的宣言
宣言の前にArrayのサイズがわからない場合は、動的宣言とReDim
キーワードを使用できます。
Dim myDynamicArray() As Strings 'Creates an Array of an unknown number of strings
ReDim myDynamicArray(5) 'This resets the array to 6 elements
ReDim
キーワードを使用すると、配列の以前の内容が消去されます。これを防ぐには、 ReDim
後にPreserve
キーワードを使用しReDim
。
Dim myDynamicArray(5) As String
myDynamicArray(0) = "Something I want to keep"
ReDim Preserve myDynamicArray(8) 'Expand the size to up to 9 strings
Debug.Print myDynamicArray(0) ' still prints the element
Splitを使用して文字列から配列を作成する
分割機能
指定した数の部分文字列を含むゼロベースの1次元配列を返します。
構文
分割(式 [、 デリミタ [、 制限 [、 比較 ]]] )
部 | 説明 |
---|---|
表現 | 必須。部分文字列と区切り文字を含む文字列式。 expressionが長さゼロの文字列( ""またはvbNullString)の場合、 Splitは要素もデータも含まない空の配列を返します。この場合、返される配列は0のLBoundと-1のUBoundを持ちます。 |
デリミタ | オプション。部分文字列の制限を識別するために使用される文字列文字。省略すると、スペース文字( "")が区切り文字とみなされます。 区切り文字が長さゼロの文字列の場合、 式文字列全体を含む単一要素の配列が返されます。 |
限定 | オプション。返される部分文字列の数。 -1は、すべての部分文字列が返されることを示します。 |
比較する | オプション。部分文字列を評価するときに使用する比較の種類を示す数値。値については、設定セクションを参照してください。 |
設定
compare引数には、次の値を指定できます。
定数 | 値 | 説明 |
---|---|---|
説明 | -1 | Option Compare文の設定を使用して比較を実行します。 |
vbBinaryCompare | 0 | バイナリ比較を実行します。 |
vbTextCompare | 1 | テキスト比較を実行します。 |
vbDatabaseCompare | 2 | Microsoft Accessのみ。データベース内の情報に基づいて比較を実行します。 |
例
この例では、Splitがいくつかのスタイルを表示することによってどのように動作するかを示しています。コメントには、実行された異なるスプリットオプションのそれぞれについての結果セットが表示されます。最後に、返された文字列配列をループする方法を示します。
Sub Test
Dim textArray() as String
textArray = Split("Tech on the Net")
'Result: {"Tech", "on", "the", "Net"}
textArray = Split("172.23.56.4", ".")
'Result: {"172", "23", "56", "4"}
textArray = Split("A;B;C;D", ";")
'Result: {"A", "B", "C", "D"}
textArray = Split("A;B;C;D", ";", 1)
'Result: {"A;B;C;D"}
textArray = Split("A;B;C;D", ";", 2)
'Result: {"A", "B;C;D"}
textArray = Split("A;B;C;D", ";", 3)
'Result: {"A", "B", "C;D"}
textArray = Split("A;B;C;D", ";", 4)
'Result: {"A", "B", "C", "D"}
'You can iterate over the created array
Dim counter As Long
For counter = LBound(textArray) To UBound(textArray)
Debug.Print textArray(counter)
Next
End Sub
配列の要素を反復する
For ...次へ
イテレータ変数をインデックス番号として使用することは、配列の要素を反復する最も速い方法です。
Dim items As Variant
items = Array(0, 1, 2, 3)
Dim index As Integer
For index = LBound(items) To UBound(items)
'assumes value can be implicitly converted to a String:
Debug.Print items(index)
Next
ネストされたループを使用して、多次元配列を反復することができます。
Dim items(0 To 1, 0 To 1) As Integer
items(0, 0) = 0
items(0, 1) = 1
items(1, 0) = 2
items(1, 1) = 3
Dim outer As Integer
Dim inner As Integer
For outer = LBound(items, 1) To UBound(items, 1)
For inner = LBound(items, 2) To UBound(items, 2)
'assumes value can be implicitly converted to a String:
Debug.Print items(outer, inner)
Next
Next
それぞれのために...次へ
For Each...Next
ループは、パフォーマンスが重要でない場合でも、配列の反復に使用できます。
Dim items As Variant
items = Array(0, 1, 2, 3)
Dim item As Variant 'must be variant
For Each item In items
'assumes value can be implicitly converted to a String:
Debug.Print item
Next
For Each
ループは、すべての次元を外側から内側に反復します(要素がメモリに配置されるのと同じ順序)ので、ネストされたループは必要ありません。
Dim items(0 To 1, 0 To 1) As Integer
items(0, 0) = 0
items(1, 0) = 1
items(0, 1) = 2
items(1, 1) = 3
Dim item As Variant 'must be Variant
For Each item In items
'assumes value can be implicitly converted to a String:
Debug.Print item
Next
パフォーマンスが重要な場合、 For Each
ループはCollection
オブジェクトを反復するのに最適です。
上の4つのスニペットはすべて同じ出力を生成します:
0
1
2
3
動的配列(配列のサイズ変更と動的処理)
ダイナミックアレイ
配列の変数を動的に追加したり減らしたりすることは、扱う情報に設定された数の変数がない場合に大きな利点となります。
値を動的に追加する
ReDim
ステートメントで配列のサイズを変更するだけで、配列のサイズは変更されますが、配列に既に格納されている情報を保持する場合は、 Preserve
という部分が必要になりPreserve
。
以下の例では、配列内の値を保持しながら、配列を作成し、各繰り返しで変数を1つ増やします。
Dim Dynamic_array As Variant
' first we set Dynamic_array as variant
For n = 1 To 100
If IsEmpty(Dynamic_array) Then
'isempty() will check if we need to add the first value to the array or subsequent ones
ReDim Dynamic_array(0)
'ReDim Dynamic_array(0) will resize the array to one variable only
Dynamic_array(0) = n
Else
ReDim Preserve Dynamic_array(0 To UBound(Dynamic_array) + 1)
'in the line above we resize the array from variable 0 to the UBound() = last variable, plus one effectivelly increeasing the size of the array by one
Dynamic_array(UBound(Dynamic_array)) = n
'attribute a value to the last variable of Dynamic_array
End If
Next
値を動的に削除する
同じ論理を利用して配列を減らすことができます。この例では、値「last」が配列から削除されます。
Dim Dynamic_array As Variant
Dynamic_array = Array("first", "middle", "last")
ReDim Preserve Dynamic_array(0 To UBound(Dynamic_array) - 1)
' Resize Preserve while dropping the last value
配列のリセットと動的再利用
作成した配列をメモリ上に再利用することもできるので、実行時間が遅くなります。これは、さまざまなサイズの配列に便利です。配列を再利用するために使用できるスニペットは、配列をReDim
(0)
戻し、1つの変数を配列に帰属させ、配列を再び自由に増加させることです。
下のスニペットでは、値1〜40の配列を作成し、配列を空にして、値40〜100で配列を補充します。すべてこれが動的に行われます。
Dim Dynamic_array As Variant
For n = 1 To 100
If IsEmpty(Dynamic_array) Then
ReDim Dynamic_array(0)
Dynamic_array(0) = n
ElseIf Dynamic_array(0) = "" Then
'if first variant is empty ( = "") then give it the value of n
Dynamic_array(0) = n
Else
ReDim Preserve Dynamic_array(0 To UBound(Dynamic_array) + 1)
Dynamic_array(UBound(Dynamic_array)) = n
End If
If n = 40 Then
ReDim Dynamic_array(0)
'Resizing the array back to one variable without Preserving,
'leaving the first value of the array empty
End If
Next
ジグザグ配列(配列の配列)
ジグザグ配列は多次元配列ではありません
配列の配列(ジグザグ配列)は多次元配列と同じではありません。多次元配列は次元(配列内)の要素数が定義された行列(長方形)のように見えますが、配列は年ごと別の月の日のように、要素の数が異なる内部配列を持つカレンダー。
ジグザグ配列は、ネストされたレベルのために使用するのが面倒で扱いにくいですが、型の安全性はあまりありませんが、非常に柔軟性があるため、さまざまな種類のデータを簡単に操作できます。空の要素。
ギザギザの配列を作成する
以下の例では、名前の配列とNumbersの配列の2つの配列を含むぎざぎざの配列を初期化し、それぞれの要素にアクセスします
Dim OuterArray() As Variant
Dim Names() As Variant
Dim Numbers() As Variant
'arrays are declared variant so we can access attribute any data type to its elements
Names = Array("Person1", "Person2", "Person3")
Numbers = Array("001", "002", "003")
OuterArray = Array(Names, Numbers)
'Directly giving OuterArray an array containing both Names and Numbers arrays inside
Debug.Print OuterArray(0)(1)
Debug.Print OuterArray(1)(1)
'accessing elements inside the jagged by giving the coordenades of the element
ジグザグ配列の動的作成と読み込み
私たちは、配列を構築するのにもっとダイナミックになることができます。顧客データシートがExcelにあると想像して、顧客の詳細を出力する配列を作成したいと考えています。
Name - Phone - Email - Customer Number
Person1 - 153486231 - 1@STACK - 001
Person2 - 153486242 - 2@STACK - 002
Person3 - 153486253 - 3@STACK - 003
Person4 - 153486264 - 4@STACK - 004
Person5 - 153486275 - 5@STACK - 005
Header配列とCustomers配列を動的に構築し、ヘッダーに列タイトルを格納し、Customers配列には配列として各顧客/行の情報を格納します。
Dim Headers As Variant
' headers array with the top section of the customer data sheet
For c = 1 To 4
If IsEmpty(Headers) Then
ReDim Headers(0)
Headers(0) = Cells(1, c).Value
Else
ReDim Preserve Headers(0 To UBound(Headers) + 1)
Headers(UBound(Headers)) = Cells(1, c).Value
End If
Next
Dim Customers As Variant
'Customers array will contain arrays of customer values
Dim Customer_Values As Variant
'Customer_Values will be an array of the customer in its elements (Name-Phone-Email-CustNum)
For r = 2 To 6
'iterate through the customers/rows
For c = 1 To 4
'iterate through the values/columns
'build array containing customer values
If IsEmpty(Customer_Values) Then
ReDim Customer_Values(0)
Customer_Values(0) = Cells(r, c).Value
ElseIf Customer_Values(0) = "" Then
Customer_Values(0) = Cells(r, c).Value
Else
ReDim Preserve Customer_Values(0 To UBound(Customer_Values) + 1)
Customer_Values(UBound(Customer_Values)) = Cells(r, c).Value
End If
Next
'add customer_values array to Customers Array
If IsEmpty(Customers) Then
ReDim Customers(0)
Customers(0) = Customer_Values
Else
ReDim Preserve Customers(0 To UBound(Customers) + 1)
Customers(UBound(Customers)) = Customer_Values
End If
'reset Custumer_Values to rebuild a new array if needed
ReDim Customer_Values(0)
Next
Dim Main_Array(0 To 1) As Variant
'main array will contain both the Headers and Customers
Main_Array(0) = Headers
Main_Array(1) = Customers
To better understand the way to Dynamically construct a one dimensional array please check Dynamic Arrays (Array Resizing and Dynamic Handling) on the Arrays documentation.
上記のスニペットの結果は、4要素、2インデントレベルを持つ配列の2つの配列を持つジャグド配列で、もう1つはそれぞれ4要素と3インデントレベルの5配列を含む別のジャグド配列です。
Main_Array(0) - Headers - Array("Name","Phone","Email","Customer Number")
(1) - Customers(0) - Array("Person1",153486231,"1@STACK",001)
Customers(1) - Array("Person2",153486242,"2@STACK",002)
...
Customers(4) - Array("Person5",153486275,"5@STACK",005)
あなたは心の中であなたが作成ジャグ配列の構造を負担する必要があります情報にアクセスするには、上記の例では、あなたはそれを見ることができるMain Array
の配列が含まれHeaders
とアレイ(配列のCustomers
さまざまな方法でそれゆえ)要素にアクセスする。
ここで、 Main Array
情報を読み、各顧客情報をInfo Type: Info
として印刷します。
For n = 0 To UBound(Main_Array(1))
'n to iterate from fisrt to last array in Main_Array(1)
For j = 0 To UBound(Main_Array(1)(n))
'j will iterate from first to last element in each array of Main_Array(1)
Debug.Print Main_Array(0)(j) & ": " & Main_Array(1)(n)(j)
'print Main_Array(0)(j) which is the header and Main_Array(0)(n)(j) which is the element in the customer array
'we can call the header with j as the header array has the same structure as the customer array
Next
Next
あなたのJagged Arrayの構造を把握するために、上記の例では、 Main_Array -> Customers -> CustomerNumber -> Name
という3つのレベルにアクセスして、必要な"Person4"
を返しますMain_Array(Customers)(CustomerNumber)(Name)
Main_Array(1)(3)(0)
あるMain_Array(1)(3)(0)
は、Main_ArrayのCustomersの位置、次にCustomer Jagged配列のCustomer 4の位置、 Main_Array(Customers)(CustomerNumber)(Name)
。
多次元配列
多次元配列
名前が示すように、多次元配列は、複数の次元(通常は2つまたは3つ)を含む配列ですが、最大32の次元を持つことができます。
マルチ配列は、さまざまなレベルの行列のように機能し、1つ、2つ、3つの次元を比較します。
One Dimensionは典型的な配列であり、要素のリストのように見えます。
Dim 1D(3) as Variant
*1D - Visually*
(0)
(1)
(2)
2次元は数独グリッドやExcelシートのように見えます。配列を初期化するときに、配列の行数と列数を定義します。
Dim 2D(3,3) as Variant
'this would result in a 3x3 grid
*2D - Visually*
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
三次元はルービックのキューブのように見えるでしょう。配列を初期化するときには、行と列、および配列/層数を定義します。
Dim 3D(3,3,2) as Variant
'this would result in a 3x3x3 grid
*3D - Visually*
1st layer 2nd layer 3rd layer
front middle back
(0,0,0) (0,0,1) (0,0,2) ¦ (1,0,0) (1,0,1) (1,0,2) ¦ (2,0,0) (2,0,1) (2,0,2)
(0,1,0) (0,1,1) (0,1,2) ¦ (1,1,0) (1,1,1) (1,1,2) ¦ (2,1,0) (2,1,1) (2,1,2)
(0,2,0) (0,2,1) (0,2,2) ¦ (1,2,0) (1,2,1) (1,2,2) ¦ (2,2,0) (2,2,1) (2,2,2)
さらなる次元は3Dの乗算と考えることができるので、4D(1,3,3,3)は2つの並列の3Dアレイとなる。
2次元配列
作成
以下の例は、従業員のリストを集めたもので、各従業員はリスト(姓、姓、住所、電子メール、電話など)に関する一連の情報を持ちます。例は本質的に配列に格納されます従業員、情報)は、(0,0)が最初の従業員の名です。
Dim Bosses As Variant
'set bosses as Variant, so we can input any data type we want
Bosses = [{"Jonh","Snow","President";"Ygritte","Wild","Vice-President"}]
'initialise a 2D array directly by filling it with information, the redult wil be a array(1,2) size 2x3 = 6 elements
Dim Employees As Variant
'initialize your Employees array as variant
'initialize and ReDim the Employee array so it is a dynamic array instead of a static one, hence treated differently by the VBA Compiler
ReDim Employees(100, 5)
'declaring an 2D array that can store 100 employees with 6 elements of information each, but starts empty
'the array size is 101 x 6 and contains 606 elements
For employee = 0 To UBound(Employees, 1)
'for each employee/row in the array, UBound for 2D arrays, which will get the last element on the array
'needs two parameters 1st the array you which to check and 2nd the dimension, in this case 1 = employee and 2 = information
For information_e = 0 To UBound(Employees, 2)
'for each information element/column in the array
Employees(employee, information_e) = InformationNeeded ' InformationNeeded would be the data to fill the array
'iterating the full array will allow for direct attribution of information into the element coordinates
Next
Next
サイズ変更
サイズ変更またはReDim Preserve
は、1次元配列のノルムのように、エラーが発生する代わりに、元のサイズと同じサイズと追加する行数または列数を加えた情報を一時配列に転送する必要があります。下の例では、一時配列を初期化し、元の配列から情報を転送し、残りの空の要素を埋め、一時配列を元の配列に置き換える方法を見ていきます。
Dim TempEmp As Variant
'initialise your temp array as variant
ReDim TempEmp(UBound(Employees, 1) + 1, UBound(Employees, 2))
'ReDim/Resize Temp array as a 2D array with size UBound(Employees)+1 = (last element in Employees 1st dimension) + 1,
'the 2nd dimension remains the same as the original array. we effectively add 1 row in the Employee array
'transfer
For emp = LBound(Employees, 1) To UBound(Employees, 1)
For info = LBound(Employees, 2) To UBound(Employees, 2)
'to transfer Employees into TempEmp we iterate both arrays and fill TempEmp with the corresponding element value in Employees
TempEmp(emp, info) = Employees(emp, info)
Next
Next
'fill remaining
'after the transfers the Temp array still has unused elements at the end, being that it was increased
'to fill the remaining elements iterate from the last "row" with values to the last row in the array
'in this case the last row in Temp will be the size of the Employees array rows + 1, as the last row of Employees array is already filled in the TempArray
For emp = UBound(Employees, 1) + 1 To UBound(TempEmp, 1)
For info = LBound(TempEmp, 2) To UBound(TempEmp, 2)
TempEmp(emp, info) = InformationNeeded & "NewRow"
Next
Next
'erase Employees, attribute Temp array to Employees and erase Temp array
Erase Employees
Employees = TempEmp
Erase TempEmp
要素値の変更
特定の要素の値を変更/変更するには、変更する座標を呼び出して新しい値を与えるだけですEmployees(0, 0) = "NewValue"
あるいは、座標を使用して条件を繰り返し、必要なパラメータに対応する値を一致させることができます。
For emp = 0 To UBound(Employees)
If Employees(emp, 0) = "Gloria" And Employees(emp, 1) = "Stephan" Then
'if value found
Employees(emp, 1) = "Married, Last Name Change"
Exit For
'don't iterate through a full array unless necessary
End If
Next
読書
配列内の要素にアクセスするには、ネストループ(すべての要素を繰り返します)、ループと座標(行を繰り返し、列に直接アクセスする)、または両方の座標で直接アクセスすることができます。
'nested loop, will iterate through all elements
For emp = LBound(Employees, 1) To UBound(Employees, 1)
For info = LBound(Employees, 2) To UBound(Employees, 2)
Debug.Print Employees(emp, info)
Next
Next
'loop and coordinate, iteration through all rows and in each row accessing all columns directly
For emp = LBound(Employees, 1) To UBound(Employees, 1)
Debug.Print Employees(emp, 0)
Debug.Print Employees(emp, 1)
Debug.Print Employees(emp, 2)
Debug.Print Employees(emp, 3)
Debug.Print Employees(emp, 4)
Debug.Print Employees(emp, 5)
Next
'directly accessing element with coordinates
Debug.Print Employees(5, 5)
多次元配列を使用する場合、配列マップを保持することは常に便利であることを覚えておいてください 。混乱することがあります。
3次元配列
3Dアレイでは、2D配列と同じ前提を使用します。従業員と情報を格納するだけでなく、ビルディングを組み込むだけでなく、
3D配列には、従業員(行と考えることができる)、情報(列)、および建物があり、Excel文書では異なるシートと考えることができ、サイズは同じですが、各シートにはそのセル/要素内の異なる情報セット。 3Dアレイには、 n個の2Dアレイが含まれます。
作成
3D配列は3つの座標を初期化する必要がありますDim 3Darray(2,5,5) As Variant
、配列の最初の座標はBuilding / Sheets(行と列の異なるセット)の数になり、2番目の座標は行と3を定義します列。上記のDim
は108要素( 3*6*6
)の3D配列をもたらし、効果的に3つの異なる2D配列のセットを持ちます。
Dim ThreeDArray As Variant
'initialise your ThreeDArray array as variant
ReDim ThreeDArray(1, 50, 5)
'declaring an 3D array that can store two sets of 51 employees with 6 elements of information each, but starts empty
'the array size is 2 x 51 x 6 and contains 612 elements
For building = 0 To UBound(ThreeDArray, 1)
'for each building/set in the array
For employee = 0 To UBound(ThreeDArray, 2)
'for each employee/row in the array
For information_e = 0 To UBound(ThreeDArray, 3)
'for each information element/column in the array
ThreeDArray(building, employee, information_e) = InformationNeeded ' InformationNeeded would be the data to fill the array
'iterating the full array will allow for direct attribution of information into the element coordinates
Next
Next
Next
サイズ変更
3D配列のサイズ変更は、2Dのサイズ変更と似ていますが、元のサイズと同じサイズのテンポラリ配列を最初に作成し、パラメータの座標に1を増やすと、最初の座標は配列のセット数を増やします。 3番目の座標は、各セットの行または列の数を増やします。
以下の例では、各セットの行数を1つずつ増やし、最近追加された要素に新しい情報を埋め込みます。
Dim TempEmp As Variant
'initialise your temp array as variant
ReDim TempEmp(UBound(ThreeDArray, 1), UBound(ThreeDArray, 2) + 1, UBound(ThreeDArray, 3))
'ReDim/Resize Temp array as a 3D array with size UBound(ThreeDArray)+1 = (last element in Employees 2nd dimension) + 1,
'the other dimension remains the same as the original array. we effectively add 1 row in the for each set of the 3D array
'transfer
For building = LBound(ThreeDArray, 1) To UBound(ThreeDArray, 1)
For emp = LBound(ThreeDArray, 2) To UBound(ThreeDArray, 2)
For info = LBound(ThreeDArray, 3) To UBound(ThreeDArray, 3)
'to transfer ThreeDArray into TempEmp by iterating all sets in the 3D array and fill TempEmp with the corresponding element value in each set of each row
TempEmp(building, emp, info) = ThreeDArray(building, emp, info)
Next
Next
Next
'fill remaining
'to fill the remaining elements we need to iterate from the last "row" with values to the last row in the array in each set, remember that the first empty element is the original array Ubound() plus 1
For building = LBound(TempEmp, 1) To UBound(TempEmp, 1)
For emp = UBound(ThreeDArray, 2) + 1 To UBound(TempEmp, 2)
For info = LBound(TempEmp, 3) To UBound(TempEmp, 3)
TempEmp(building, emp, info) = InformationNeeded & "NewRow"
Next
Next
Next
'erase Employees, attribute Temp array to Employees and erase Temp array
Erase ThreeDArray
ThreeDArray = TempEmp
Erase TempEmp
要素の値と読みを変更する
3D配列の要素を読み込んで変更することは、2D配列のやり方と同様に行うことができます。ループと座標の余分なレベルを調整するだけです。
Do
' using Do ... While for early exit
For building = 0 To UBound(ThreeDArray, 1)
For emp = 0 To UBound(ThreeDArray, 2)
If ThreeDArray(building, emp, 0) = "Gloria" And ThreeDArray(building, emp, 1) = "Stephan" Then
'if value found
ThreeDArray(building, emp, 1) = "Married, Last Name Change"
Exit Do
'don't iterate through all the array unless necessary
End If
Next
Next
Loop While False
'nested loop, will iterate through all elements
For building = LBound(ThreeDArray, 1) To UBound(ThreeDArray, 1)
For emp = LBound(ThreeDArray, 2) To UBound(ThreeDArray, 2)
For info = LBound(ThreeDArray, 3) To UBound(ThreeDArray, 3)
Debug.Print ThreeDArray(building, emp, info)
Next
Next
Next
'loop and coordinate, will iterate through all set of rows and ask for the row plus the value we choose for the columns
For building = LBound(ThreeDArray, 1) To UBound(ThreeDArray, 1)
For emp = LBound(ThreeDArray, 2) To UBound(ThreeDArray, 2)
Debug.Print ThreeDArray(building, emp, 0)
Debug.Print ThreeDArray(building, emp, 1)
Debug.Print ThreeDArray(building, emp, 2)
Debug.Print ThreeDArray(building, emp, 3)
Debug.Print ThreeDArray(building, emp, 4)
Debug.Print ThreeDArray(building, emp, 5)
Next
Next
'directly accessing element with coordinates
Debug.Print Employees(0, 5, 5)