仅将二维数组的某些元素/列写回到工作表

问题描述 投票:1回答:2

我有一个动态的二维数组,该数组具有比我所需更多的数据,我只想将数组的某些元素(列)写回到工作表中。这可能吗?例如:

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列。我不需要任何其他数据。 -我是否应该尝试另一种方式?

excel vba arraylist multidimensional-array
2个回答
1
投票

我将用源和目标工作表中的列号创建两个数组,然后可以将循环减少到仅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

1
投票

仅按两个序列复制数组

只是为了好玩,并且为了演示如何使用Application.Index()function的高级功能而不是复制范围,如何将整个数据数组切成两个临时序列。 -[[这种替代方法并非伪装成比上述方法更快或更佳的解决方案,但可能值得研究以更好地理解数组方法。

  • Sequence(1)
提取前6列,并将它们全部写入目标列2和相邻列(即B:G),
  • 序列(2)
  • 将其余两列写入目标列13 +邻居(即M:N)。

    示例通话

    Application.Index()
    或例如

    ExtractGivenColumns wsSource , wsDest ' using the predeclared worksheet objects

       ExtractGivenColumns Sheet1, Sheet2      ' using the project's sheet Code(Name)s
    
    © www.soinside.com 2019 - 2024. All rights reserved.