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

2023-11-24

我正在尝试将数组写入一个范围,并且尝试了多种方法,但无论如何,我总是一遍又一遍地只获得数组的第一个值。

这是代码:

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),"""")"

我可以把这归因于深夜的笨蛋编码。

然而,我了解到的另一件事是,当我返回运行完整代码时,将数组粘贴到范围需要很长时间。这通常是一项非常简单的任务并且发生得很快,所以我真的很困惑。

经过多次调试,我发现问题归结为我关闭了所有警报/计算/等,当我粘贴这些公式时,strSheetName工作表还不存在,因为我正在与主文件分开开发此代码。显然,当您粘贴代码时,它会弹出一个对话框,但是如果您关闭了所有这些东西,您就看不到它,但它确实会减慢一切。如果这些选项卡不存在,则粘贴范围大约需要 6 分钟,如果存在,则需要几秒钟(可能更少)。无论如何,为了进一步完善代码,我只是添加了一个函数来检查所需的工作表,如果它不存在,它会添加选项卡作为占位符,这样整个过程就不会变得缓慢。

感谢大家的帮助!我希望这对其他人有帮助。


Do this:

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

[a1].Resize(UBound(arrayData) + 1) = Application.Transpose(arrayData)

重要的一点是 Transpose() 函数。

但如果您计划将二维数组写入工作表,最好从一开始就使用它们。只要将它们定义为第一行中的行和第二行中的列,则不需要转置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数组写入范围。只获取数组的第一个值 的相关文章

随机推荐