简单的VBA数组连接不起作用

问题描述 投票:0回答:3

我很困惑为什么我不能将此连接数组发送到 msgbox。如果我创建一个带有输入值的静态数组,我可以做得很好,但是对于 Excel 中的一系列值,我不断收到“无效的过程调用或参数”

我已经做了相当多的研究,但我找不到这个问题的任何例子。我在这里做错了什么?

 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
arrays excel vba
3个回答
20
投票

cookie 转到 brettdj,因为调整一维数组的大小并填充它是最好的方法(最快),但我想提供一个更鲜为人知的紧凑解决方案,以防您不打算在长数组上使用它。它不像一维方法那么快,但也不像串联那么慢,但是当你想一起编写快速代码时它很方便(更容易避免用单行代码犯错)!

myArray = Range("B2:B10").value
myString = Join(WorksheetFunction.Transpose(myArray), ", ")

甚至只是:

myString = Join(WorksheetFunction.Transpose(Range("B2:B10").value), ", ")

18
投票

直接从工作表范围创建的变体数组是二维的(即它具有行和列) -

Join
需要一维数组。

所以你需要做这样的事情

[更新 将范围读取到变体数组中,然后将变体数组转换为一维数组以进行连接 - 避免单元循环]

另请注意,使用 Issun 在单列上使用

TRANSPOSE
确实会立即强制生成 1D ouctome。因此,另一种选择是循环遍历 2D 变体数组的列或行,然后逐列(或逐行)遍历它们以快速生成 1D 数组。

TRANSPOSE



0
投票

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

Excel 有时完全疯狂:(

© www.soinside.com 2019 - 2024. All rights reserved.