【问题标题】:Excel VBA: Populating Staggered Ranges with 2d Array dataExcel VBA:使用二维数组数据填充交错范围
【发布时间】:2011-07-19 04:39:22
【问题描述】:


我目前正在寻找一种更有效的方法,通过 VBA,将信息从 Sub 中的二维数组传输到 Excel 工作簿中的一组交错范围内。我将我需要的内容提炼成下面的示例,并附有代码;任何帮助将不胜感激。

   我已经链接了描述我正在使用的示例(输入、数组和输出)的图像,并在下面编写了我正在使用的代码示例。为简单起见,让我们在工作簿中将“输入工作表”定义为 Sheet1,将“输出工作表”定义为 Sheet2:

  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 现在看起来与范围完全一样。 (我会发布第三个链接,但我需要先获得更多代表)。

   我想将数据传输到我的输出文件中,使其如下所示:

   这是我目前处理这种情况的方式:

    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 的公式等是有原因的。
  • 另外,这本身并不是一个答案,但关闭屏幕绘画可能会极大地加速您现有的算法 (Application.ScreenUpdating = False)。只是不要忘记在错误处理程序中和退出例程之前重新打开它。
  • 当然。首先,感谢您添加图片!将要编辑 sheet1 的用户有删除行的习惯,我试图避免在删除引用的单元格时可能弹出的任何 #REF 错误。我的解决方法是简单地将整个范围闪存到一个数组中,并通过快速读/写来处理事情。这有意义吗?
  • 再次感谢;我肯定会关闭屏幕更新,但在实际应用程序中真正让我受益的是,我正在处理一个最大为 500 行 x 96 列的二维数组,这使得逐个单元格写入循环真的很乏味。

标签: arrays excel vba range


【解决方案1】:

“复制和粘贴”这些值可能会快很多。您显然需要对其进行概括以适合您的目的,但此代码适用于您提供的示例:

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

【讨论】:

  • 这个答案实际上让我大吃一惊,因为我太专注于数组,以至于忘记了简单地使用这种方法。先生,您让我走上了一条将宏的运行时间减少几个数量级的轨道。谢谢大家的帮助!
【解决方案2】:

根据要插入的“其他数据”的大小,解决此问题的一种非常简单的方法是将所有数据传输到输出范围,然后插入新列并根据需要放置其他数据。

例如:

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. 

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

【讨论】:

  • 谢谢保罗;我很欣赏输入(双关语)。我已经采纳了您和 mwolfe 所说的内容并加以利用,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2014-07-15
  • 2020-03-20
  • 1970-01-01
  • 2018-06-26
  • 2020-10-11
相关资源
最近更新 更多