将数组写入范围.只获取数组的第一个值

got*_*ike 8 arrays excel vba excel-vba

我正在尝试将数组写入范围,我尝试了几种方法但无论如何,我总是一遍又一遍地得到数组的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
Run Code Online (Sandbox Code Playgroud)

我期望看到的是:

(Col A)     (Col E)
A           A
B           B
C           C
D           D
E           E
Run Code Online (Sandbox Code Playgroud)

我实际看到的是:

(Col A)     (Col E)
A           A
A           A
A           A
A           A
A           A
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

我试图遵循Chip Pearson的建议,就像在这里找到的那样

但没有运气......

好的,所以在这个问题的第二部分添加:

我有一个带有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
Run Code Online (Sandbox Code Playgroud)

所以当我运行它时,转置功能正确转换为:

Array(1 to 8061, 1 to 1)
Run Code Online (Sandbox Code Playgroud)

该范围似乎是一列,在G列中有8,061个单元格.

但是我收到以下错误:

Run-time error '1004':
Application-defined or object-defined error
Run Code Online (Sandbox Code Playgroud)

错误发生在以下行:

rngData = arrayDataTransposed
Run Code Online (Sandbox Code Playgroud)

---更新---

所以我遗漏了我的示例代码(b/c,老实说,我认为这不重要),我的数组的内容实际上是公式.这是我在实际实时代码中使用的行:

arrayData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"")"
Run Code Online (Sandbox Code Playgroud)

好吧,我发现(使用Excel Hero的帮助)是上面的语句没有字符串所需的双引号,所以我不得不改为:

arrayBucketData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"""")"
Run Code Online (Sandbox Code Playgroud)

我可以把它归结为深夜的骨头编码.

然而,我学到的另一件事是,当我回去运行完整代码时,它需要FOREVER将数组粘贴到范围内.这通常是一项非常简单的任务,很快就会发生,所以我真的很困惑.

经过大量调试后,我发现问题归结为我关闭了所有警报/计算/等等,当我粘贴在这些公式中时,strSheetName表单不存在b/c我正在单独开发此代码来自主文件.显然,当你粘贴代码时,它会抛出一个对话框,但是如果关闭所有这些东西,你就看不到它,但它真的会减慢一切.如果那些标签不在那里,粘贴范围大约需要6分钟,如果它们存在则需要几秒钟(可能更少).无论如何,为了进一步细化代码,我只是添加了一个检查所需工作表的函数,如果它不存在,它会将选项卡添加为占位符,这样整个过程就不会慢慢爬行.

感谢大家的帮助!我希望这可以帮助其他人.

Exc*_*ero 23

做这个:

arrayData = Array("A", "B", "C", "D", "E")

[a1].Resize(UBound(arrayData)) = Application.Transpose(arrayData)
Run Code Online (Sandbox Code Playgroud)

重要的是Transpose()函数.

但是,如果您打算将它们写入工作表,最好从get get开始使用2D数组.只要您将它们定义为第一个等级中的行和第二个等级中的列,则不需要转置.

  • 是的,VBA中的1D数组是水平的. (4认同)
  • @DavidZemens 我的回答旨在通过简化其他所有内容来引起对 Transpose() 函数的关注。当然,可以适当地限定范围引用。我使用 Resize 没有任何问题。 (3认同)

Gar*_*ent 6

这个:

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
Run Code Online (Sandbox Code Playgroud)

将产生:

在此处输入图片说明