我试图将一个数组写入一个范围,并且尝试了几种方法,但是无论如何,我总是一遍又一遍地只获得数组的FIRST值。
这是代码:
Option Explicit
Sub test()
ActiveWorkbook.Worksheets("Sheet1").Cells.Clear
Dim arrayData() As Variant
arrayData = Array("A", "B", "C", "D", "E")
Dim rngTarget As Range
Set rngTarget = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
'this doesn't work
rngTarget.Resize(UBound(arrayData, 1), 1).Value = arrayData
Dim rngTarget2 As Range
Set rngTarget2 = ActiveWorkbook.Worksheets("Sheet1").Range(Cells(1, 5), Cells(UBound(arrayData, 1), 5))
'this doesn't work either
rngTarget2.Value = arrayData
End Sub
我希望看到的是:
(Col A) (Col E)
A A
B B
C C
D D
E E
我真正看到的是:
(Col A) (Col E)
A A
A A
A A
A A
A A
我在这里做错了什么?
我在这里找到了Chip Chipearson的建议
但是没有运气...
好的,因此添加此问题的第二部分:
我有一个包含8,061个元素的一维数组,正将其传递给以下函数:
Call writeArrayData7(strTabName, arrayBucketData, 7)
Sub writeArrayData7(strSheetName As String, arrayData As Variant, intColToStart As Integer)
Dim lngNextRow As Long
lngNextRow = 1 ' hard-coded b/c in this instance we are just using row 1
' Select range for data
Dim rngData As Range
Set rngData = Sheets(strSheetName).Range(Cells(lngNextRow, intColToStart), Cells(lngNextRow - 1 + UBound(arrayData, 1), intColToStart))
' Save data to range
Dim arrayDataTransposed As Variant
arrayDataTransposed = Application.Transpose(arrayData)
rngData = arrayDataTransposed
End Sub
因此,当我运行此命令时,转置函数可以正确转换为:
Array(1 to 8061, 1 to 1)
该范围似乎是在G列中有8,061个单元格的单个列。
但是我收到以下错误:
Run-time error '1004':
Application-defined or object-defined error
该错误引发以下行:
rngData = arrayDataTransposed
-更新-
因此,我从示例代码中忽略了一件事(老实说我认为这没关系),数组的内容实际上是公式。这是我在实际实时代码中使用的行:
arrayData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"")"
好吧,我发现(在Excel Hero的帮助下)是,上面的语句没有字符串所需的双引号,所以我不得不改为以下内容:
arrayBucketData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"""")"
我可以将其归结为深夜的骨头编码。
但是,我了解到的另一件事是,当我返回运行完整代码时,需要永远将数组粘贴到范围中。通常,这是一个非常简单的任务,并且很快就会发生,所以我真的很困惑。
经过大量调试后,我发现问题出在以下事实:我关闭了所有警报/计算/等功能,当我粘贴这些公式时,工作strSheetName
表还不存在。从主文件。显然,当您粘贴代码时,它会弹出一个对话框,但是,如果您关闭了所有内容,则看不到它,但实际上会减慢一切。如果这些选项卡不存在,则粘贴该范围大约需要6分钟,如果它们存在,则需要几秒钟(可能更少)。无论如何,为了进一步完善代码,我只是添加了一个检查所需工作表的函数,如果该工作表不存在,则将选项卡添加为占位符,以使整个过程不会减慢抓取速度。
感谢大家的帮助!我希望这可以帮助其他人。
做这个:
arrayData = Array("A", "B", "C", "D", "E")
[a1].Resize(UBound(arrayData) + 1) = Application.Transpose(arrayData)
重要的是Transpose()函数。
但是,如果计划将2D数组写入工作表,则最好从一开始就使用它们。只要将它们定义为第一行中的行和第二行中的列,那么就不需要转置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句