【发布时间】:2015-10-16 01:58:40
【问题描述】:
我正在尝试将一个数组写入一个范围,我尝试了多种方法,但无论如何,我总是一遍又一遍地只得到数组的第一个值。
代码如下:
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 Pearson 的建议,如发现 HERE
但没有运气......
好的,所以添加这个问题的第二部分:
我有一个包含 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),"""")"
我可以把它归结为深夜的白痴编码。
但是,我学到的另一件事是,当我返回运行完整代码时,需要 FOREVER 将数组粘贴到范围。这通常是一项非常简单的任务,而且发生得很快,所以我真的很困惑。
经过多次调试,我发现问题归结为我关闭了所有警报/计算/等,当我粘贴这些公式时,strSheetName 表还没有 b/c 我'正在开发与主文件分开的代码。显然,当您粘贴代码时,它会弹出一个对话框,但是如果您关闭了所有这些东西,您将看不到它,但它确实会减慢一切。如果这些选项卡不存在,则粘贴范围大约需要 6 分钟,如果存在则需要几秒钟(可能更少)。无论如何,为了进一步完善代码,我只是添加了一个函数来检查所需的工作表,如果它不存在,它将选项卡添加为占位符,这样整个过程就不会慢到爬行。
感谢大家的帮助!我希望这可以帮助其他人。
【问题讨论】:
-
您的 1004 发生在这里:
Set rngData = Sheets(strSheetName).,因为您尚未将Cells对象限定为工作表。因此,要么在With块中完成所有操作,要么在Cells(lngNextRow, intColToStart).Address中完成所有操作(使用.Address属性和对Cells类的 all 调用。 -
你能按照大卫的建议去做吗?
-
@DavidZemens - 这实际上不是我得到 1004 的地方。我在这里得到它:
rngData = arrayDataTransposed- 我将你提到的行更改为:Set rngData = Sheets(strSheetName).Range(Cells(lngNextRow, intColToStart).Address, Cells(lngNextRow - 1 + UBound(arrayData, 1), intColToStart).Address),但我仍然得到错误在上面一行。 -
@gotmike 数组中是否有任何元素的文本长度超过 255 个字符?
-
有没有机会给我发一份有问题的小样本工作簿?我可以快速排序。我的电子邮件地址是:daniel.ferry@gmail.com