简单的 VBA 数组连接不起作用
Posted
技术标签:
【中文标题】简单的 VBA 数组连接不起作用【英文标题】:Simple VBA array join not working 【发布时间】:2011-12-13 00:11:38 【问题描述】:我很困惑为什么我不能 msgbox 这个加入的数组。如果我创建一个带有输入值的静态数组,我可以做到这一点,但是使用 excel 中的一系列值,我不断收到 "Invalid Procedure Call or Argument"
我已经进行了大量研究,但找不到任何关于此问题的示例。我在这里做错了什么?
Sub From_sheet_make_array()
Dim myarray() As Variant
Dim dudeString As String
myarray() = Range("B2:B10").Value
dudeString = Join(myarray(), ", ")
MsgBox dudeString
End Sub
【问题讨论】:
【参考方案1】:cookie 转到 brettdj,因为调整一维数组的大小并填充它是最好的方法(最快),但我想提供一个鲜为人知的紧凑型解决方案,以防您不打算使用它长数组。它没有 1D 方法快,但也没有像串联那么慢,但是当你想一起编写快速代码时它很方便(更容易不使用单行代码拼写错误)!
myArray = Range("B2:B10").value
myString = Join(WorksheetFunction.Transpose(myArray), ", ")
甚至只是:
myString = Join(WorksheetFunction.Transpose(Range("B2:B10").value), ", ")
【讨论】:
谢谢,这非常适合这个特定的应用程序! +1 我花了一个小时试图记住/找到 WorksheetFunction 哈哈。好一个!尤其是当值全部排在一行时,它很好地摆脱了额外的维度。【参考方案2】:直接从工作表范围创建的变量数组是二维的(即它有行和列)-Join
需要一维数组。
所以你需要做这样的事情
[更新 将范围读入变量数组,然后将变量数组转换为一维数组以进行连接 - 避免单元循环]
还请注意,使用 TRANSPOSE
作为 Issun 在下面的单个列上确实会立即强制一维 ouctome。因此,另一种选择是循环遍历二维变量数组的列或行,TRANSPOSE
逐列(或逐行)快速生成一维数组。
Sub From_sheet_make_array()
Dim X
Dim lngRow As Long
Dim myArray()
X = Range("B2:B10").Value2
ReDim myArray(1 To UBound(X, 1))
For lngRow = 1 To UBound(X, 1)
myArray(lngRow) = X(lngRow, 1)
Next
Dim dudeString As String
dudeString = Join(myArray, ", ")
MsgBox dudeString
End Sub
【讨论】:
澄清一下,Range("B2:B10").Value 返回 Variant(9,1),而不是 Variant(9)。我认为我们必须使用循环,但我们可以使用 ReDim 根据范围内的行数或单元格数来调整数组的大小。 @eric 行数是第一维的长度;使用 ReDim,您只能修改最后一个维度。因此,您只能使用 ReDim 添加或删除列。要接受 Value 属性的值,实际上是接受 ReDim,您需要将数组声明为可变大小数组:Dim MyArray()
。在将值分配给变量之前,您不应该 ReDim,因为那只会浪费分配。
@phoog 我们只需要数组 (myArray) 中的一维来保存要连接的值,而不管范围的形状和大小。
+1 巧妙地使用了ReDim
(实际上对我来说似乎有点危险)。但是为什么Value2
?
... 或者更确切地说是这些 格式。 @brettdj:感谢您的链接。我不知道这些微妙之处。以上是关于简单的 VBA 数组连接不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft ODBC for Oracle 在 excel vba 中不起作用
Application.Inputbox [LEFT] 和 [TOP] 在 Excel Vba 中不起作用。为啥?