引用数组(在数组内)
Referencing an array (within an array)
我的潜艇试图做什么:
取一个数组(例如(1到100,1到36),包含在数组的数组中)
只取一些列(例如,我只想要第 2、5、7 列等)
将原始数组替换为仅包含这些列的数组(因此它将从(1 到 100、1 到 36)变为例如(1 到 100、1 到 5))。
我通过将我想要的列复制到一个新数组,然后擦除原始列并仅使用新信息重新创建它来做到这一点。
N.B。我所有的阵列都变暗为变体 dim arrVariable as Variant
和 arrVariable = Array()
我有一个数组 arrAggregatedArrays(1 to 8)
我子的相关部分是:
FilterSheetArrayForColumns (ArrAggregatedArrays(i))
Private Sub FilterSheetArrayForColumns(ByRef arrSource As Variant)
'/======================================================================================================================================================
'/ Author: Zak Armstrong
'/ Email: zak.armstrong@luminwealth.co.uk
'/ Date: 12/August/2015
'/
'/ Description: Takes Sheet arrays, finds the columns from the colAllHeadings, recreates the array with just that data (and empty columns for the ones not found)
'/======================================================================================================================================================
Dim i As Long
Dim j As Long
Dim k As Long
Dim lngFinalRow As Long
Dim lngFinalColumn As Long
Dim arrTempArray As Variant '/ Temporarily holds the filtered information
arrTempArray = Array()
Dim arrHeadingsRow As Variant '/ Holds the top (headings) row for application.match
arrHeadingsRow = Array()
Dim varColumnPosition As Variant '/ Holds the position of the relevant column
Dim strHeading As String '/ The current heading to search for
'/======================================================================================================================================================
AssignArrayBounds arrSource, UB1:=lngFinalRow, UB2:=lngFinalColumn
'/==================================================
'/ Recreate Headings Row
'/==================================================
ReDim arrHeadingsRow(1 To lngFinalColumn)
For i = 1 To lngFinalColumn
arrHeadingsRow(i) = arrSource(1, i)
Next i
'/==================================================
'/ Find Columns, put in array
'/==================================================
ReDim arrTempArray(0 To lngFinalRow, 0 To ColAllHeadings.Count)
arrTempArray(0, 0) = arrSource(0, 0)
Dim lngDestinationColumn As Long
Dim lngSourceColumn As Long
For i = 1 To ColAllHeadings.Count
strHeading = ColAllHeadings(i)
varColumnPosition = Application.Match(strHeading, arrHeadingsRow, 0)
If IsError(varColumnPosition) _
Then
MissingDataHeadingsHandler arrSource, strHeading
Else
lngDestinationColumn = i
lngSourceColumn = varColumnPosition
CopyArrayColumn2d arrSource, arrTempArray, lngSourceColumn, lngDestinationColumn
End If
Next i
CopyArrayContents2d arrTempArray, arrSource
End Sub
但是,在这个 sub 的末尾,arrAggregatedArrays(i)
仍然包含原始数组,而不是过滤后的数组。
我想我的代码可能只是擦除对数组的引用,而不是数组本身。如果是这样,我该如何正确引用它?
如果不是这样,变量引用哪里出错了?
函数 FilterSheetArray() 未使用参数 "arrSource"
试试这个:
FilterSheetArray(arrAggregatedArrays(i))
Sub FilterSheetArray(ByRef arrSource as variant)
dim arrTemp as variant
arrTemp = arrSource ' <----------------------
'/ fill arrTemp with specific columns from arrSource
'/ Erase arrSource, ReDim and copy contents of arrTemp
arrSource = arrTemp
End Sub
并确保在末尾将 "arrTemp" 分配回 "arrSource"
(或者只使用 "arrSource" 并删除 "arrTemp")
我发现了问题。我使用以下语法调用我的子程序:
FilterSheetArrayForColumns (ArrAggregatedArrays(i))
我应该在什么时候使用:
FilterSheetArrayForColumns ArrAggregatedArrays(i)
在 VBA 中,每当您在变量周围使用括号时,它都会强制 VBA 对其求值。因此,在这种情况下,它没有传递变量 arrAggregatedArrays(i),而是传递一个评估(实际上是一个本地副本)。
所以 sub 做了它应该做的,但它没有引用原始变量,它只是更改了一个本地副本,该副本在 sub 结束后立即消失,原始变量保持不变。
我的潜艇试图做什么:
取一个数组(例如(1到100,1到36),包含在数组的数组中)
只取一些列(例如,我只想要第 2、5、7 列等)
将原始数组替换为仅包含这些列的数组(因此它将从(1 到 100、1 到 36)变为例如(1 到 100、1 到 5))。
我通过将我想要的列复制到一个新数组,然后擦除原始列并仅使用新信息重新创建它来做到这一点。
N.B。我所有的阵列都变暗为变体 dim arrVariable as Variant
和 arrVariable = Array()
我有一个数组 arrAggregatedArrays(1 to 8)
我子的相关部分是:
FilterSheetArrayForColumns (ArrAggregatedArrays(i))
Private Sub FilterSheetArrayForColumns(ByRef arrSource As Variant)
'/======================================================================================================================================================
'/ Author: Zak Armstrong
'/ Email: zak.armstrong@luminwealth.co.uk
'/ Date: 12/August/2015
'/
'/ Description: Takes Sheet arrays, finds the columns from the colAllHeadings, recreates the array with just that data (and empty columns for the ones not found)
'/======================================================================================================================================================
Dim i As Long
Dim j As Long
Dim k As Long
Dim lngFinalRow As Long
Dim lngFinalColumn As Long
Dim arrTempArray As Variant '/ Temporarily holds the filtered information
arrTempArray = Array()
Dim arrHeadingsRow As Variant '/ Holds the top (headings) row for application.match
arrHeadingsRow = Array()
Dim varColumnPosition As Variant '/ Holds the position of the relevant column
Dim strHeading As String '/ The current heading to search for
'/======================================================================================================================================================
AssignArrayBounds arrSource, UB1:=lngFinalRow, UB2:=lngFinalColumn
'/==================================================
'/ Recreate Headings Row
'/==================================================
ReDim arrHeadingsRow(1 To lngFinalColumn)
For i = 1 To lngFinalColumn
arrHeadingsRow(i) = arrSource(1, i)
Next i
'/==================================================
'/ Find Columns, put in array
'/==================================================
ReDim arrTempArray(0 To lngFinalRow, 0 To ColAllHeadings.Count)
arrTempArray(0, 0) = arrSource(0, 0)
Dim lngDestinationColumn As Long
Dim lngSourceColumn As Long
For i = 1 To ColAllHeadings.Count
strHeading = ColAllHeadings(i)
varColumnPosition = Application.Match(strHeading, arrHeadingsRow, 0)
If IsError(varColumnPosition) _
Then
MissingDataHeadingsHandler arrSource, strHeading
Else
lngDestinationColumn = i
lngSourceColumn = varColumnPosition
CopyArrayColumn2d arrSource, arrTempArray, lngSourceColumn, lngDestinationColumn
End If
Next i
CopyArrayContents2d arrTempArray, arrSource
End Sub
但是,在这个 sub 的末尾,arrAggregatedArrays(i)
仍然包含原始数组,而不是过滤后的数组。
我想我的代码可能只是擦除对数组的引用,而不是数组本身。如果是这样,我该如何正确引用它?
如果不是这样,变量引用哪里出错了?
函数 FilterSheetArray() 未使用参数 "arrSource"
试试这个:
FilterSheetArray(arrAggregatedArrays(i))
Sub FilterSheetArray(ByRef arrSource as variant)
dim arrTemp as variant
arrTemp = arrSource ' <----------------------
'/ fill arrTemp with specific columns from arrSource
'/ Erase arrSource, ReDim and copy contents of arrTemp
arrSource = arrTemp
End Sub
并确保在末尾将 "arrTemp" 分配回 "arrSource"
(或者只使用 "arrSource" 并删除 "arrTemp")
我发现了问题。我使用以下语法调用我的子程序:
FilterSheetArrayForColumns (ArrAggregatedArrays(i))
我应该在什么时候使用:
FilterSheetArrayForColumns ArrAggregatedArrays(i)
在 VBA 中,每当您在变量周围使用括号时,它都会强制 VBA 对其求值。因此,在这种情况下,它没有传递变量 arrAggregatedArrays(i),而是传递一个评估(实际上是一个本地副本)。
所以 sub 做了它应该做的,但它没有引用原始变量,它只是更改了一个本地副本,该副本在 sub 结束后立即消失,原始变量保持不变。