我正在尝试将数组写入范围,我尝试了几种方法,但无论如何,我总是一遍又一遍地得到数组的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 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
---更新---
所以我遗漏了我的示例代码(b / c,老实说,我认为它不重要),我的数组的内容实际上是公式。以下是我在实际实时代码中使用的行:
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分钟,如果它们存在则需要几秒钟(可能更少)。无论如何,为了进一步细化代码,我只是添加了一个检查所需工作表的函数,如果它不存在,它会将选项卡添加为占位符,这样整个过程就不会慢爬行。
感谢大家的帮助!我希望这可以帮助其他人。
答案 0 :(得分:21)
这样做:
arrayData = Array("A", "B", "C", "D", "E")
[a1].Resize(UBound(arrayData)) = Application.Transpose(arrayData)
重要的一点是Transpose()函数。
但是,如果您打算将它们写入工作表,那么最好从get get开始使用2D数组。只要您将它们定义为第一个排名中的行和第二个排名中的列,那么就不需要换位。
答案 1 :(得分:4)
此:
Sub test()
ActiveWorkbook.Worksheets("Sheet1").Cells.Clear
Dim arrayData(1 To 5, 1 To 1) As Variant
arrayData(1, 1) = "A"
arrayData(2, 1) = "B"
arrayData(3, 1) = "C"
arrayData(4, 1) = "D"
arrayData(5, 1) = "E"
Dim rngTarget As Range
Set rngTarget = ActiveWorkbook.Worksheets("Sheet1").Range("A1:A5")
rngTarget = arrayData
End Sub
将产生:
答案 2 :(得分:0)
如果我可以扩大接受的答案,我建议:
Dim arrayData(0 to 2)
那是安全的方法。无论您是否将数组变量声明为:
Dim arrayData(1 to 3)
或
Dim arrayData()
接受的答案仅在第二种情况下有效。
如果数组的大小未知并且您将arrayData声明为:
,建议的方法可能会很有用。{=CORREL(IF(A1:A8*B1:B8<>0;A1:A8);B1:B8)}