Arrays 基于数组的vba读取、转换和粘贴

Arrays 基于数组的vba读取、转换和粘贴,arrays,excel,vba,range,transform,Arrays,Excel,Vba,Range,Transform,我有一个主工作表,它的数据集大约有2800个条目,并且需要构建一个新的工作表,其中包含基于一些键的主数据子集。我做这一切与直接访问通过范围,这是太慢了。我现在尝试用数组重建逻辑 我的目标是 (1) 将范围读入变量主数组 (2) 循环通过这个主数组 (3) 基于条件/键使用主数组的子集构建新数组 (4) 将每个新“子集”-阵列粘贴到新图纸中 我有一(1)个 对于(2)和(3)我有这样的东西 For masterCounter = 1 To UBound(varray, 1) If InStr

我有一个主工作表,它的数据集大约有2800个条目,并且需要构建一个新的工作表,其中包含基于一些键的主数据子集。我做这一切与直接访问通过范围,这是太慢了。我现在尝试用数组重建逻辑

我的目标是 (1) 将范围读入变量主数组 (2) 循环通过这个主数组 (3) 基于条件/键使用主数组的子集构建新数组 (4) 将每个新“子集”-阵列粘贴到新图纸中

我有一(1)个

对于(2)和(3)我有这样的东西

For masterCounter = 1 To UBound(varray, 1)

  If InStr(1, currentUID, "KEY_XYZ", 1) Then
        subarray1(currentRow, 1) = varray(currentRow, 1)
        subarray1(currentRow, 2) = Trim(varray(currentRow, 2))
        subarray1(currentRow, 3) = varray(currentRow, 5)
 End If

      masterCounter = masterCounter + 1
Next
但是,现在我在用主数组中的值填充新的子集数组时遇到了一些类型不匹配错误

你有没有想过如何解决这个问题


谢谢

在给子阵列1赋值之前,您需要重拨子阵列1

在您的
前面插入这一行,以便。。。循环

    ReDim subarray1(LBound(varray) To UBound(varray), 1 To 3)

我假设
subray1
应该有3列,行数应该和
varray
一样多。如果您需要其他大小,您需要相应地更改它。

您的代码不完整,无法提供全面帮助(例如如何声明和设置currentRow),但这里有一些可能会有所帮助

您的数组声明需要括号

    Dim varray() As Variant
另外,我建议你更详细一些

伊克斯:

Sheets("MAINSHEET").Range("B2:Q" & Sheets("MAINSHEET").Cells(Rows.Count, "B").End(xlUp).Row).Value
将“Rows.Count”替换为“.Rows.Count”


您是如何声明子阵列的?第二个问题:为什么要把这个放到循环中:
masterCounter=masterCounter+1
?它不是必需的,增量是由循环本身执行的,当使用
For。。。循环
。此外,它还可能导致错误,因为现在
masterCounter
每循环增加2。所以从一个变量数组到另一个变量数组。数据类型为文本、日期和小数。对不起,我需要复制粘贴位并从我的代码中拼凑出来。您可以忽略主计数器,但谢谢!这个错误出现在哪一行?当我试图将第一个条目写入变量数组subray1(currentRow,1)=varray(currentRow,1)时,我遇到了另一个问题。当我基于主阵列重新划分子阵列时,每个子阵列都有主阵列的行数。(太大)是否有一种方法只对数据类型进行调暗,而不对数组大小进行调暗?这是否意味着数组(主/目标)的结构需要相同?因为它目前不是…@heyhey33是的,通常在声明数组的大小之前,您不能为数组分配任何内容。不幸的是,由于redim,现在所有子数组的大小都是主数组的大小。有没有办法将子数组的大小(行)减少到实际的行数(内容)?@heyhey33是的,您可以这样做:
ReDim subray1(LBound(varray)到rowscenter,1到3)
其中
rowscenter
是存储行数的变量。
Sheets("MAINSHEET").Range("B2:Q" & Sheets("MAINSHEET").Cells(Rows.Count, "B").End(xlUp).Row).Value
With Sheets("MAINSHEET")
    .Range("B2:Q" & .Cells(.Rows.Count, "B").End(xlUp).Row).Value
end with 



Sub fred()

    Dim MyRange As Range
    Dim varray() As Variant
    Dim subarray1() As Variant

    With Sheets("MAINSHEET")
        Set MyRange = .Range("B2:Q" & .Cells(.Rows.Count, "B").End(xlUp).Row)

        Debug.Print MyRange.Address

        varray = MyRange

    End With

    For masterCounter = 1 To UBound(varray, 1)

        Debug.Print varray(currentRow, 1)

         If InStr(1, currentUID, "KEY_XYZ", 1) Then
               subarray1(currentRow, 1) = varray(currentRow, 1)
               subarray1(currentRow, 2) = Trim(varray(currentRow, 2))
               subarray1(currentRow, 3) = varray(currentRow, 5)
        End If

          masterCounter = masterCounter + 1
    Next


End Sub