我有一个动态的二维数组,该数组具有比我所需更多的数据,我只想将数组的某些元素(列)写回到工作表中。这可能吗?例如:
Sub writeArray()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim arSource() As Variant
Dim a As Long
Dim b As Long
Set wsDest = wbPT.Worksheets("Import")
Set wsSource = wbSource.Worksheets("Export")
wsDest.Activate
ReDim Preserve arSource(3 To wsSource.Range("B" & Rows.Count).End(xlUp).row, 2 To 40) '
For a = LBound(arSource, 1) To UBound(arSource, 1)
For b = LBound(arSource, 2) To UBound(arSource, 2)
arSource(a, b) = wsSource.Cells(a, b)
Next b
Next a
End Sub
此数组在第一维中具有3到271个元素,在第二维中具有2到40个元素。
在39个元素(列)中,我只需要这些列:4、5、6、7、8、23、35和36。
在与列相关的目标工作表上:2、3、4、5、6、7、13和14。我需要源数组中的第4列现在移到目标工作表上的第2列和第5列从源到目标表的第3列,依此类推,有8列。我不需要任何其他数据。 -我是否应该尝试另一种方式?
我将用源和目标工作表中的列号创建两个数组,然后可以将循环减少到仅1个,这样就可以在源工作表的列中找到单元格的数目,然后将该范围复制到目标工作表中。
Sub TestWriteArray()
Dim inputColumns As Variant
inputColumns = Array(4, 5, 6, 7, 8, 23, 35, 36)
Dim outputColumns As Variant
outputColumns = Array(2, 3, 4, 5, 6, 7, 13, 14)
writeArray inputColumns, outputColumns
End Sub
Sub writeArray(ByVal ipSourceColumns As Variant, ByVal ipDestColumns As Variant)
If UBound(ipSourceColumns) <> UBound(ipDestColumns) Then
Err.Raise _
17, _
"Columns Mismatch", _
"The number of columns in the source and desination arrays do not match"
End If
Dim wsSource As Worksheet
Set wsSource = ActiveWorkbook.Worksheets("Sheet1")
Dim wsDest As Worksheet
Set wsDest = ActiveWorkbook.Worksheets("Sheet2")
Dim myIndex As Long
For myIndex = LBound(ipSourceColumns) To UBound(ipSourceColumns)
Dim myLastRow As Long
myLastRow = wsSource.Cells(Rows.Count, ipSourceColumns(myIndex)).End(xlUp).Row
wsSource.Range(wsSource.Cells(3, ipSourceColumns(myIndex)), wsSource.Cells(myLastRow, ipSourceColumns(myIndex))).Copy
wsDest.Cells(3, ipDestColumns(myIndex)).PasteSpecial xlPasteAll
Next
End Sub
仅按两个序列复制数组
只是为了好玩,并且为了演示如何使用Application.Index()
function的高级功能而不是复制范围,如何将整个数据数组切成两个临时序列。 -[[这种替代方法并非伪装成比上述方法更快或更佳的解决方案,但可能值得研究以更好地理解数组方法。
示例通话
Application.Index()
或例如
ExtractGivenColumns wsSource , wsDest ' using the predeclared worksheet objects
ExtractGivenColumns Sheet1, Sheet2 ' using the project's sheet Code(Name)s