将数组粘贴到范围上的索引表示法

Posted

技术标签:

【中文标题】将数组粘贴到范围上的索引表示法【英文标题】:Index notation to paste an array on a range 【发布时间】:2021-12-19 10:19:34 【问题描述】:

以下代码在一个模块中

Option Explicit

Private sub paste_arr()
    Dim arr(2)
    
    arr(0) = 2
    arr(1) = 3
    arr(2) = 5

    with sh_array
   
        .Range(.Cells(2,5), .Cells(4,5)) = arr

    end with

以下数组中的结果

 2
 2
 2

似乎只粘贴了列表中的第一项,但我想粘贴整个数组。

其他解决方案似乎没有使用索引表示法。例如以下 Using multiple dimension array's with sheet names instead of code names 或 A1 notation in combination with .resize()

编辑: 根据给出的答案,我认为不是每个人都理解我希望使用索引表示法 Cells(1,1) 而不是 A1 表示法 "A1"。这是我用索引表示法/引用索引号的意思的链接。 Index numbers VBA Docs. 使用索引表示法的愿望导致了另一种(也许不是那么简单)的表示法。因为带有索引符号的 .Resize() 函数如下:

With sh_array

    .Range(*code*).Resize(*code*)
    ' or
    .Range(.Cells(1,1).Resize(*code*)

end With

结果

对象“_Worksheet”的方法“范围”失败

【问题讨论】:

试试.Range(.Cells(2,5), .Cells(4,5)) = Application.Transpose(arr)arr 是一个 1D 数组,它没有行。以你的方式,只有第一个数组元素被粘贴了3次......当你使用更大的数组时,为了避免手动构建需要粘贴的字符串,你可以使用.Range("E2").Resize(ubound(arr) +1,1)=Application.Transpose(arr)。 + 1 因为一维零基数组。它也应该在这种情况下工作。或者从头构建一个二维数组... ^^ 或者使用Dim arr(2, 0) 表示您要创建三行和一列。然后使用arr(0, 0) = 2等。 @FaneDuru 感谢您的建议。我已将其添加为答案。但是我发现调整大小选项很有趣。这也可以使用索引符号吗? .Range("E2").Resize(ubound(arr) +1,1)=Application.Transpose(arr) 没关系通过使用 .Cells 而不是 .Range 得到它。谢谢! 当然,如果我正确理解你的意思,这是可能的......如果你将使用一个二维数组,建立在 flay 上(从一开始就不知道它的尺寸),你可以使用Range("A1").resize(ubound(arr), ubound(arr, 2)).value = arr. Where ubound(arr, 2)`是数组列数。我的意思是当它根据某些条件调整大小时。 【参考方案1】:

一维数组到一个范围

Option Explicit

Private Sub ZeroBased()
    
'    ' 1. Either
'    'Dim arr(2) As Variant
'    ' More correct is (Option Base related):
'    Dim arr(0 To 2) As Variant ' ensure zero-based

'    arr(0) = 2
'    arr(1) = 3
'    arr(2) = 5

    ' 2. Or
    'Dim arr As Variant: arr = Array(2, 3, 5)
    ' More correct is (Option Base related):
    Dim arr As Variant: arr = VBA.Array(2, 3, 5) ' ensure zero-based

    Dim cCount As Long
    'cCount = UBound(arr) - LBound(arr) + 1 ' 2 - 0 + 1 = 3
    ' Since in this case LBound(arr) is 0, you can simplify:
    cCount = UBound(arr) + 1 ' 2 + 1 = 3
    
    ' A simple way to write the values to the Immediate window (Ctrl+G).
    Debug.Print Join(arr, ",") ' delimited
    Debug.Print Join(arr, vbLf) ' one below the other
    
    ' Write to a range
    With Sheet1
        ' Write to a one-row range:
        .Range("A1").Resize(, cCount).Value = arr ' A1:C1 ' note the comma
        ' Write to a one-column range:
        .Range("A3").Resize(cCount).Value = Application.Transpose(arr) ' A3:A5
    End With
    
    ' .Resize(, cCount) is short for .Resize(1, cCount)
    ' .Resize(cCount) is short for .Resize(cCount, 1)
    
    ' Interestingly, you could easily write only the first 2 items
    ' (think first 100 out of 1000 items):
    With Sheet1
        ' Write to a one-row range:
        .Range("E1").Resize(, 2).Value = arr ' E1:F1 ' note the comma
        ' Write to a one-column range:
        .Range("A7").Resize(2).Value = Application.Transpose(arr) ' A7:A8
    End With
    
End Sub

【讨论】:

我已经添加了关于索引符号的说明。您的建议使用 "A1" 符号,所以不是我想要的。感谢您的回复。在发布您的解决方案之前,我已经添加了我的解决方案。【参考方案2】:

感谢@FaneDuru

我错误地假设 Excel 会计算出垂直传递一维数组会为我调整数组。

所以答案是

Option Explicit

Private sub paste_arr()
    Dim arr(2)
    
    arr(0) = 2
    arr(1) = 3
    arr(2) = 5

    with sh_array
   
        .Range(.Cells(2,5), .Cells(4,5)) = Application.Transpose(arr)
        ' or better if length of array is unknown
        .Range(.Cells(2,5), .Cells(UBound(arr) + 2,5)) = Application.Transpose(arr)
        ' next option based on .resize
        .Cells(2,5).Resize(UBound(arr) + 1, 1) = Application.Transpose(arr)

    end with

以下数组中的结果

 2
 3
 5

【讨论】:

以上是关于将数组粘贴到范围上的索引表示法的主要内容,如果未能解决你的问题,请参考以下文章

golang:将有序的数字切片转换为数字范围表示的字符串数组

[算法必须死 第3期] 旋转数组的二分查找

LeetCode:范围求和||598

如何重新创建“索引超出数组范围”将项目添加到字典?

搜索日期并复制并粘贴整行:VBA

为啥文本文件中的身份证号码粘贴到EXCEL中时将变为科学计数法表示