Arrays 简单VBA数组联接不起作用

Arrays 简单VBA数组联接不起作用,arrays,excel,vba,Arrays,Excel,Vba,我不明白为什么我不能msgbox这个加入的数组。如果我用键入的值创建一个静态数组,我可以做得很好,但是使用excel中的一系列值,我会不断得到“无效的过程调用或参数” 我做了大量的研究,但是我找不到任何关于这个问题的例子。我做错了什么 Sub From_sheet_make_array() Dim myarray() As Variant Dim dudeString As String myarray() = Range("B2:B10").Value

我不明白为什么我不能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

直接从图纸范围创建的变量数组是二维数组(即它有行和列)Join需要一维数组

 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
所以你需要这样做

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

还要注意的是,在单个列上使用Issun的
转置
,确实会立即强制1D ouctome。因此,另一种选择是循环二维变量数组的列或行,并将它们逐列(或逐行)转置,以快速生成一维数组

 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

cookie归brettdj所有,因为调整1D数组的大小并填充它是最好的方法(最快),但我想提供一个不太为人所知的紧凑解决方案,以防您不打算在长数组上使用它。它不像1D方法那样快,但不像串联方法那样慢,但是当您想一起编写快速代码时,它很方便(更容易不使用一行代码拼写错误)

甚至只是:

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

为了澄清,范围(“B2:B10”)。值返回变量(9,1),而不是变量(9)。我认为我们必须使用循环,但我们可以使用ReDim根据范围内的行数或单元格数来调整数组的大小。@eric行数是第一维的长度;使用ReDim,您只能修改最后一个尺寸标注。因此,您只能使用ReDim添加或删除列。要接受value属性的值,甚至要进行ReDim,需要将数组声明为可变大小数组:
Dim MyArray()
。在将值分配给变量之前,不应重新输入,因为这只会浪费分配。@phoog我们只需要数组中的一个维度(myArray)来保存要连接的值,而不考虑范围的形状和大小。+1用于巧妙地使用
ReDim
(实际上对我来说似乎有点危险)。但是为什么
Value2
?。。。或者更确切地说是这些格式@谢谢你的链接。我没有意识到这些微妙之处。谢谢,这对于这个特定的应用来说是非常棒的+1我花了一个小时试着记住/找到工作表函数lol。很好!特别是当值都在一行中结束时,它很好地消除了额外的维度。