Excel VBA:使用2D数组数据填充交错范围

3
我目前正在寻找一种更有效的方法,通过VBA,将2维数组中的信息传输到Excel工作簿中交错的一组范围内。下面是一个包含代码的示例,我已经将需要的内容提炼出来了,非常感谢您的帮助。
为了简单起见,让我们定义“输入表”为工作簿中的Sheet1,“输出表”为Sheet2:
以下是示例代码:

Input Sheet

  Option Explicit

  Sub TransferData()
    Dim myArray as Variant           'Define the array to hold the data.
    Dim i as integer                 'Define a generic loop counter variable.

    myArray = Sheet1.Range("A1:F7")  'Pulls all the relevant data into the array.

现在,myArray与范围完全相同。(我想发布第三个链接,但我需要先赚取更多的声望)。

我想将数据传输到我的输出文件中,使其看起来像这样:

Output Sheet

以下是我目前处理这种情况的方法:

    For i = 1 to ubound(myArray)
      Sheet2.Cells(i,1) = myArray(i,1)
      Sheet2.Cells(i,3) = myArray(i,2)
      Sheet2.Cells(i,6) = myArray(i,3)
      Sheet2.Cells(i,7) = myArray(i,4)
      Sheet2.Cells(i,8) = myArray(i,5)
      Sheet2.Cells(i,9) = myArray(i,6)
    Next i
  End Sub

我的问题是这样的:是否有一种类似于我逐个获取数组范围的方式,将数据从数组传输到交错范围中? 例如,以下内容:

Sheet2.Range("A1:A8") = myArray(1 to 7, 1)  'Note: this is total pseudocode
Sheet2.Range("C1:C8") = myArray(1 to 7, 2)  'Note: this is total pseudocode

我相信我已经自学掌握了相当数量的VBA知识,但我肯定并不是万能的,需要你的帮助。我正在试图通过VBA来最小化对工作表的写入操作,因为这些操作会使计算机负荷很重。

非常感谢您的帮助。

谢谢!


我猜你没有使用=Sheet1!B1作为Sheet2单元格C2的公式等,肯定有原因吧。 - mwolfe02
此外,这不是一个确切的答案,但关闭屏幕绘制可能会极大地加快您现有算法的速度(Application.ScreenUpdating = False)。只是不要忘记在错误处理程序和退出例程之前将其打开。 - mwolfe02
当然。首先,感谢您添加图片!将要编辑sheet1的用户有删除行的习惯,我试图避免如果他们删除引用单元格可能会出现的#REF错误。我的解决方法是将整个范围闪存到一个数组中,并通过快速读/写来处理事情。这样说通了吗? - Prej1
再次感谢,我肯定会关闭屏幕更新,但在实际应用中让我困扰的是我正在处理一个最大为500行x96列的二维数组,这使得逐个单元格写入循环变得非常繁琐。 - Prej1
2个回答

2
“复制粘贴”值可能会更快。显然,您需要将其概括以适应您的目的,但是此代码可与您提供的示例一起使用:
Sub TransferData()

    Sheet3.Range("A1:A7") = Sheet1.Range("A1:A7").Value
    Sheet3.Range("C1:C7") = Sheet1.Range("B1:B7").Value
    Sheet3.Range("F1:I7") = Sheet1.Range("C1:F7").Value

End Sub

这个回答让我感到非常惊讶,因为我太专注于数组而忘记了使用这种简单的方法。您,先生,让我走上了一条减少宏运行时间数个数量级的道路。非常感谢您的帮助! - Prej1

1
根据要插入的“其他数据”的大小,一种非常简单的方法是将所有数据转移到输出范围,然后插入新列并适当地放置其他数据。
例如:
data = Worksheets("InputSheet").Range("A1:F7").Value
Worksheets("OutputSheet").Range("A1:F7").Value = data
Worksheets("OutputSheet").Columns("B").EntireColumn.Insert ' do this for every column you need, within reason. 

然后,您可以将“其他数据”放入您创建的所有新列中。


谢谢Paul,我很感激你的建议(双关语)。我听从了你和mwolfe的建议,而且已经有所实践,非常感谢你们的帮助! - Prej1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接