简单的 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 中不起作用。为啥?

Vba窗体的keydown怎么不起作用

为啥 Access VBA 下拉方法不起作用?

Access 2010 VBA:为啥这个表单打开和关闭序列不起作用?

vba粘贴不起作用