【问题标题】:Variant/String instead of Variant/Empty变体/字符串而不是变体/空
【发布时间】:2018-11-26 15:27:05
【问题描述】:

我使用以下代码从工作表中的范围创建 10 行和 2 列的变体:

Dim ws As Worksheet
Dim leRange As Variant

Set ws = ThisWorkbook.Worksheets(1)
leRange = ws.Range(ws.Cells(1, 1), ws.Cells(10, 2)).Value

第一列总是被填满,但第二列不被填满。 当我在 Locals 窗口中检查 leRange 时,当单元格中没有任何内容时,值为 Empty 类型为 Variant/Empty。我想将其更改为 `Variant/String 类型的 ""

我可以循环变体来检查和替换,但我想知道是否有更聪明的方法来做,谢谢!

编辑:将这些数据作为参数的函数需要字符串的变体,我无法更改它,因此我需要进行替换。

【问题讨论】:

  • 似乎过早的优化。 Variant 是一种相当有效的数据类型。除非您知道这是一个实际问题,否则为什么要花费 CPU 周期将空变体更改为空字符串?
  • @JohnColeman 因为获取这些数据的函数要求其中只有字符串的变体,我无法更改它
  • 我认为没有更有效的方法了。您可以使用Evaluate 来获取一个包含空字符串的数组,但我怀疑它会更有效。
  • 没有区别。将Variant/Empty 传递给接受String 的函数,该函数会很高兴地得到vbNullString - 但是当子类型为Error 时会出现问题,因此在将其传递给函数之前,请验证变量是否为@987654332 @ 和 IsError,然后根据需要将其显式转换为 StringCStr
  • 等等,函数 - 什么函数?我们至少能看到它的签名吗? “需要字符串的变体”根本没有意义。

标签: excel vba


【解决方案1】:

声明leRange As String,你会得到一个空的String。您的代码与 Range.Value 的返回类型无关,由 Excel 决定。

问题是leRange 不只是这里的任何其他Variant/Empty:范围不跨越单个单元格,所以变体包含的实际上是一个二维变体数组,事情就是这样工作的。您无法更改从宿主应用程序的对象模型中获取的单个数组元素的变体子类型。

Variant/Empty 不等同于空字符串:如果单元格实际上是空白,则IsEmpty 返回 true。如果单元格包含/评估为空字符串,则 IsEmpty 返回 false。

请注意,只有 Variant 可以保存 Error 值。如果一个单元格评估为例如#REF!,变体子类型将是 Variant/ErrorIsError 将为其返回 true - 尝试将这样的值分配给 String 将导致 类型不匹配 错误。

Excel 为您提供了一个变体数组:您的代码需要处理一个变体数组。 Empty 很容易与 ""vbNullString 进行比较(比较结果为 True) - 没有问题要解决,您担心变体子类型放错了位置,没什么好担心的。


编辑:将这些数据作为参数的函数需要字符串的变体,我无法更改它,所以我需要进行替换。

我不确定这意味着什么,但如果这意味着您将整个 2D Variant 数组传递给一个接受 String() 数组的函数,那么是的,您需要声明一个新数组并复制您的变体变成字符串,否则您可能会遇到类型不匹配 - 这与您期望它被赋予数百/数千个单元格一样低效,但如果这是关于 OP 中涉及的少数单元格,它应该'不会太糟糕。

【讨论】:

  • 感谢您的详细解答! (对不起第一次删除,我看到你同时编辑了你的帖子)
  • 关于函数,它是他们的 excel 插件中的一个 matlab 函数,函数定义类似于 functionName(Optional variableName as Variant)。当变体未满字符串时出现错误,他们可能会迭代变体并且不接受除字符串之外的其他内容
  • @TmSmth 可能。在这种情况下,您可以声明一个 String() 数组,并用您的单元格值填充它 - 不幸的是,没有捷径可走。下次,请确保您的问题包含所有相关上下文;-)
  • 对不起!我接受了你的回答,因为你提供了一些有趣的细节。
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多