将数组粘贴到范围上的索引表示法
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
【讨论】:
以上是关于将数组粘贴到范围上的索引表示法的主要内容,如果未能解决你的问题,请参考以下文章