【问题标题】:Why does Excel 2007 pt-PT Trim all cells results in error?为什么 Excel 2007 pt-PT Trim all cells 会导致错误?
【发布时间】:2019-10-03 14:43:29
【问题描述】:

我正在使用 excel 2007 - pt-PT,我正在尝试使用 vba 脚本修剪工作表中的所有单元格(compactar)。 以下脚本返回此错误 - “对象不支持此属性或方法”,我不明白为什么。

Sub TrimAllCells()
    Dim cell As Range
    For Each cell In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)
    cell = WorksheetFunction.Compactar(cell)
    Next cell
End Sub

我做错了什么?

【问题讨论】:

  • WorksheetFunction.Trim?
  • VBA使用英文版的工作表函数名

标签: excel vba trim


【解决方案1】:

虽然 Excel 函数已本地化,但对象模型库中的相应方法并未本地化 - 每个本地化具有不同的成员意味着每个可能的本地化都有不同的构建版本,然后支持和调试将非常混乱。更不用说,某些语言环境使用非 ANSI 字符,VBE 可能很难正确显示。

Application.WorksheetFunction 是早期绑定的——这意味着编译器知道它在看什么,所以当你在WorksheetFunction. 中键入点时,你会得到该对象所有成员的列表; Compactar(或任何其他本地化工作表函数名称)不在该列表中 - 因此“对象不支持此属性或方法”编译错误。

经验法则,当您针对早期绑定对象进行编码时,您在键入 . 取消引用运算符时获得的成员列表是您可以合法地对该对象执行的所有操作的列表。 种情况,有时成员被隐藏(您可以使它们在对象浏览器中可见;F2 并右键单击任意位置,选择“显示隐藏的成员”),以及后期绑定成员被添加的情况-on 在可扩展的 COM 接口上运行时,但一般来说,如果它不在成员列表中,则它不是一个合法的成员来调用。

如果您使用后期绑定等效项,您的代码编译 - 并在运行时崩溃并出现错误 438(编译时的后期绑定/运行时等效项你得到的错误):

cell = Application.Compactar(cell) '<~ error 438 at run-time

您正在寻找 Trim 工作表函数...但请注意,VBA 有自己的 Trim 函数,因此您甚至不需要让 WorksheetFunction 参与其中。

请注意,您是Range 类的implicitly assigning to the default member。更明确的代码是这样的:

cell.Value = Trim(cell.Value) ' fully-qualified: VBA.Strings.Trim

但是,这假设没有工作表错误 - 如果任何 cell 包含例如#VALUE!#REF!,那么这将引发 类型不匹配 错误。在将单元格值视为StringDate 或任何Double 或其他数值之前,始终验证单元格值的类型 - 可以使用IsError 函数来避免使用Variant/Error 值和不小心将其强制转换为String

If Not IsError(cell.Value) Then cell.Value = Trim(cell.Value)

【讨论】:

  • 我现在得到类型不匹配
  • @Eunito 好,进步!难道cell.Value 包含Variant/Error 值?见编辑。
  • 请注意 - WorksheetFunction.TrimTrim 的行为并不完全相同。 WorksheetFunction 将删除字符串中的额外空格,即单词之间的空格,而 Trim 仅删除整个字符串上的前导/尾随空格。不确定哪个 OP 想要。
  • @BigBen 谢谢,很高兴知道这让WorksheetFunction.Trim 非常不标准 =)
  • 同意。然而,解析在单词之间有很多空格的半非结构化文本文件非常有用(不要问,非常糟糕的数据)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2022-01-27
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多