【问题标题】:Pass ListObject to array. type variable String error将 ListObject 传递给数组。类型变量字符串错误
【发布时间】:2019-11-27 13:14:35
【问题描述】:

这个想法是将 listobject.databodyrange 的完整内容传递给一个数组以在内存中进行操作,而不必重复访问工作表单元格的值,这非常耗时。

这是代码。

 Dim theArray As Variant
     theArray = mylistObject.DataBodyRange.value

MsgBox (theArray(1, 1)) '= column 1 row 1 = first element

它有效,到目前为止一切都很好。

但是!!!由于 theArray 的维度为 Variant,因此它们的元素不是字符串,因此当将 theArray 的每个值传递给需要字符串的函数时,就会出现错误。

怎么办?

注意:我知道我可能会将函数本身的数据类型更改为变量,但是这个函数是从很多例程中调用的,我不敢碰它。我宁愿尝试寻找将变体的内容转换为字符串的方法

喜欢theArray(i,j)str(thearray(i,j))(这不起作用)

一些帮助,一些想法?

编辑 1: 这是错误所在的行:

Dim theclaims As Variant
      theclaims = rawClsTbl.DataBodyRange.value
For i = LBound(theclaims, 1) To UBound(theclaims, 1)
myText = deleteRefSigns(theclaims(i, 2))
etc

错误:byref 参数类型不匹配

在哪里: 函数 deleteRefSigns(txT As String) As String

我将尝试提出的解决方案。

谢谢

相关问题: 前段时间我在溢出中问了自己这个问题: Passing Listobject Range to array and getting error "out of range" 并阅读这个 Excel VBA Type Mismatch Error passing range to array 和其他几个。

【问题讨论】:

  • 能发一下功能代码吗?
  • Dim MyStr As String: MyStr = CStr(theArray(1, 1)) 应该可以工作。您能否发布一个重现错误的minimal reproducible example? • 注意:始终将其声明为数组Dim theArray() As Variant,以确保它包含一个数组。否则,如果您执行theArray = Range("A1").value,它将仅包含一个值,如果您的范围是动态的,这可能很容易失败。
  • 请至少发布失败的代码行。
  • 您可以一次性将表中的所有数据作为字符串直接放入数组中(您需要在代码中直接引用您的表名)
  • @evr 那太好了!!!但如何。

标签: excel vba string variant listobject


【解决方案1】:

以下应该有效:

Dim MyStr As String
MyStr = CStr(TheArray(1, 1))

注意:始终将其声明为强制数组,而不仅仅是Variant ...

Dim TheArray() As Variant 'Variant array (can only be an array)
Dim TheArray As Variant 'Variant (can be a value or array)

... 以确保它包含一个数组。否则,如果你这样做,它将只包含一个值

TheArray = Range("A1").Value 

如果您的范围是动态的,这可能很容易失败。


如果你将一个范围读入一个数组,比如

Dim TheArray() As Variant
TheArray = Range("A1:C20").Value 

那么就不可能将数组声明为String,它被设计为强制为Variant

【讨论】:

  • 谢谢@PeH。很多时候,知道你不能用一门语言做什么和你能做什么一样重要。很明显,微软很久没有“现代化”VBA了。作为对您的答案的增强,其他“额外”可能性是将带有 for 循环的变量数组转储到字符串数组中。这将避免在代码中到处使用 Cstr()。
  • Dim TheArray() As Variant TheArray = [A1:C20&""] 将给出一个变体数组,其中所有项目都作为字符串
  • 实际上我从来没有遇到过变量数组的问题。实际上,如果您尝试将数字推送到字符串变量中,它会自动转换为字符串。无需使用CStr() 显式转换
【解决方案2】:

您似乎不希望deleteRefSigns 修改调用过程传递的参数。如果是这样,您可以按值传递参数...

Function deleteRefSigns(ByVal txT As String) As String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多