虽然 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!,那么这将引发 类型不匹配 错误。在将单元格值视为String、Date 或任何Double 或其他数值之前,始终验证单元格值的类型 - 可以使用IsError 函数来避免使用Variant/Error 值和不小心将其强制转换为String:
If Not IsError(cell.Value) Then cell.Value = Trim(cell.Value)