Arrays 简单VBA数组联接不起作用
我不明白为什么我不能msgbox这个加入的数组。如果我用键入的值创建一个静态数组,我可以做得很好,但是使用excel中的一系列值,我会不断得到“无效的过程调用或参数” 我做了大量的研究,但是我找不到任何关于这个问题的例子。我做错了什么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
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。很好!特别是当值都在一行中结束时,它很好地消除了额外的维度。