2015-08-28 33 views
0

什么我的子正试图做的事:
以阵列(例如(1〜100,1〜36),包含在一个数组的数组)
只有一些拿的列(例如,我只想要列2,5,7等)
将原始数组替换为仅包含那些列的原始数组(因此它将从(1到100,1到36)到例如(1到100 ,1至5))。
我这样做是通过将我想要的列复制到一个新数组,然后擦除原始数据并仅使用新信息重新创建它。引用数组(阵列中)

N.B.我所有的阵列灰色作为第一个变种dim arrVariable as VariantarrVariable = Array() 我有阵列arrAggregatedArrays(1 to 8)的数组

我子的相关部分有云:

FilterSheetArrayForColumns (ArrAggregatedArrays(i)) 


Private Sub FilterSheetArrayForColumns(ByRef arrSource As Variant) 

'/====================================================================================================================================================== 
'/ Author: Zak Armstrong 
'/ Email: [email protected] 
'/ 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 

但是,在这一分结束,arrAggregatedArrays(i)仍含有原始数组,而不是过滤的数组。

我想我的代码可能只是擦除引用数组,而不是数组本身。如果是这样的话,我该如何正确引用它?

如果情况并非如此,变量引用出错的地方在哪里?

回答

0

我发现了这个问题。我用这种语法叫我子:

FilterSheetArrayForColumns (ArrAggregatedArrays(i)) 

当我应该一直在使用:

FilterSheetArrayForColumns ArrAggregatedArrays(i) 

在VBA中,只要您使用围绕一个变量括号,它迫使VBA对其进行评估。因此,在这种情况下,它不是通过变量arrAggregatedArrays(i),而是通过一个评估(实际上是一个本地副本)。

因此,子是在做它应该做的事情,而不是引用原来的变量,它只是改变本地副本,一旦子结束就消失,保持原有的不变。

+0

像您对问题的正确和分析诊断一样。顺便说一句,实际情况可能需要这种类型的锯齿状阵列。 – skkakkar

+0

在这种情况下,它是不同的数据集,但是一旦我将它们放入数组中,其他所有对它们做的操作都是标准化的,所以我宁愿遍历它们,而不是单独调用每个数据集 – Kaz

1

功能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”)

+0

我不确定你已经理解了我要完成的任务,我将添加一个修改来澄清它。 – Kaz

+0

答案应该解决这个问题:必须更新arrSource –

+0

这没有做到。 arrSource现在有正确的数据,但arrAggregatedArrays(i)仍然引用原始数组,而不是arrsouce – Kaz