无论是在工作表中,还是VBA编程中,经常需要使用英文字母大小写转换功能。Excel函数中提供了UPPER,LOWER,PROPER
三个函数,VBA中提供了UCASE,LCASE
两个函数,为什么还要开发类似功能的自定义函数?这并不是重新发明轮子,而是要制造一个功能更完善的轮子也许是一个喷气发动机。
例如:对于这个句子this is a dog from USA.
,希望转换为单词首字母大写,并且对于专有名称缩写USA保持大写。工作表函数PROPER
的转换结果为This Is A Dog From Usa.
,并不能很好的实现这个需求。借助Shape对象的文本处理功能可以实现功能丰富的大小写转换。
示例代码如下。
Public Function fnStrCase(ByVal strLine As String, _
Optional intMode As Integer = 4) As String
On Error Resume Next
If intMode < 1 Or intMode > 5 Then
fnStrCase = "#Err#"
Else
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 0, 0)
With .TextFrame2.TextRange
.Text = strLine
.ChangeCase (intMode)
fnStrCase = .Text
End With
.Delete
End With
End If
On Error GoTo 0
End Function
工作表中示例数据如下。
A2单元格为原始内容,intMode参数是MsoTextChangeCase 枚举,取整范围1~5,其含义如下。
【代码解析】
第3行代码忽略运行时错误。
第4行代码判断,intMode参数的范围,如果不合规,则返回#Err#
。
第7行代码添加一个矩形框,并将大小设置为0,这样就不会影响用户的Excel界面。
第9行代码将需要转换的字符串赋值给Shape对象的Text属性。
第10行代码调用ChangeState方法,转换方式由intMode参数指定。
第11行代码读取转换后的字符串。
第13行代码删除创建的矩形框。
第16行代码恢复系统的错误处理机制。
借助Excel内置对象的法可以非常完美的实现一些需求,比使用基础的字符串函数逐个字符进行判断和处理更简洁高效。