简单的VBA阵列连接不起作用

时间:2011-12-13 00:11:38

标签: arrays excel excel-vba vba

我很困惑为什么我不能将这个加入数组的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

2 个答案:

答案 0 :(得分:18)

将cookie转换为brettdj,因为调整一维阵列的大小并填充它是最好的方法(最快)但是我想提供一个更鲜为人知的紧凑型解决方案,如果你不打算使用它长阵列。它不如一维方法快,但不像连接一样慢,但是当你想要快速编写代码时更方便(更容易不用单行编写错误)!

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

甚至只是:

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

答案 1 :(得分:16)

直接从工作表范围创建的变量数组是2D(即它有行和列) - Join需要一维数组。

所以你需要做这样的事情

[更新 将范围读入变量数组,然后将变量数组转换为1D数组以进行连接 - 避免单元格循环]

另请注意,在单个列上使用TRANSPOSE作为Issun的下方会立即强制执行1D ouctome。因此,另一种方法是循环遍历2D变量数组的列或行,并逐列(或逐行)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
相关问题