【问题标题】:VBA ByRef argument type mismatch passing varaint array between subsVBA ByRef 参数类型不匹配在 subs 之间传递变量数组
【发布时间】:2021-06-22 14:58:25
【问题描述】:

我有从一个工作簿中读取数据并在另一个工作簿中使用它们的代码。我将数据放入 4D Variant Array。它使用 ByRef 在 subs 之间传递。当我访问一个元素时,我得到了

编译错误:ByRef 参数类型不匹配

如果我在 OneIterationOfTask() 的上下文中将 importArray 添加到 Watchlist,然后破坏代码,则变量数组仍会填充数据。如何从特定索引中获取值,例如importArray(1,2,3,4)?

'Called when user clicks button - Variant Array okay here
Public Sub WriteValues()
   Dim importArray() As Variant

   importArray = getImportArray()

   useImportArray importArray 
End Sub

'Gets values from another workbook - Variant Array okay here
Private Function getImportArray() As Variant
   Dim importArray() As Variant ' 4D array of strings stored as variants
   
   [...Get data...]

   getImportArray = importArray' Return array
End Sub

'Decides how to use import array - Variant Array okay here
Private Sub useImportArray (ByRef importArray())
   oneIterationOfTask importArray
End Sub 

'Repetitive code  - Variant Array ByRef argument type mismatch. 
Private Sub OneIterationOfTask (ByRef importArray())
   WriteStringOutput importArray(1,2,3,4) 'Okay if I comment out this line
End Sub

【问题讨论】:

  • 类型化数组是一团糟......即使它们像这里一样隐式类型化。我建议将它们作为普通的 Variant 参数传递,例如ByRef imports As Variant; getImportArray 正在返回一个普通的 Variant
  • 尝试将importArray(1, 2, 3, 4)分配给字符串变量,然后将字符串变量传递给WriteStringOutput
  • @Domenic - 你非常接近。问题不在于数组,而是将 CStr() 放在任何存储为 Variants 的字符串周围,当期望字符串时使用。
  • 太好了,很高兴整理好了,干杯!

标签: arrays vba compiler-errors


【解决方案1】:

问题不在于 Variant 数组,尽管出现了。我尝试像字符串一样使用 importArray(1,2,3,4),这对于我的调试行来说是可以的,比如

MsgBox importArray(0, 0, 1, 0) 'Test accessing array

不过,这不适用于其他呼叫。

问题通过使用 CStr(importArray(0, 0, 1, 0)) 将 Variants 转换为 Strings 解决了,我本来应该这样做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多