VBA左function问题

我试图使用这个基本的示例代码中的左侧函数,它给了我编译错误,但是,当我使用Right函数,而不是左侧可以找出原因。

示例代码:

Public Sub LeftSub() Dim SourceRange As Range, DestinationRange As Range Dim i As Integer Set SourceRange = Workbooks("xx.xlsx").Sheets("Sheet1").Range("B1:B10") Set DestinationRange = Workbooks("xx.xlsx").Sheets("Sheet1").Range("A1:A10") For i = 1 To SourceRange.Count DestinationRange(i, 1).Value = Left(SourceRange(i, 1).Value, 2) Next i End Sub 

Left可以解决(按此顺序):

  1. 一个名为Left的局部variables
  2. 模块范围的variables或同一模块中的成员
  3. 基类中的成员(例如,表单模块中的UserForm.Left
  4. 同一项目的标准模块中的公共/全球成员
  5. VBA标准库中的公共/全局成员或任何引用的项目(按项目引用对话框中指定的顺序)

第一场比赛是使用的, 无论其签名

即使签名完全不同,智能感知也显示了如何将左分解为相同模块的左功能

这个函数的标识符是隐藏内置的。 要访问内置的Left函数,您现在需要限定它:

 Debug.Print VBA.Strings.Left(...) 

稍有不同,但请注意VBA.Strings.Left返回一个隐含的Variant

在这里输入图像说明

它的小强types的小弟弟返回一个明确的String

在这里输入图像说明

因此避免了隐式types转换的代价; 只要String参数永远不会是Null Left$就是Left的 – 这两个函数非常相似,除了这个:

 Debug.Print Left(Null, 1) ' outputs Null Debug.Print Left$(Null, 1) ' raises runtime error 94 - Invalid use of Null 

这就是说,除非你正在处理access-vba ,否则在VBA中可能永远不会遇到Null

这适用于我没有编译错误:

 Option Explicit Public Sub LeftSub() Dim SourceRange As Range, DestinationRange As Range Dim i As Integer Set SourceRange = Range("B1:B10") Set DestinationRange = Range("A1:A10") For i = 1 To SourceRange.Count DestinationRange(i, 1).Value = Left(SourceRange(i, 1).Value, 2) Next i End Sub