VBA - 仅返回字符串中的大写字符

问题描述 投票:0回答:1

我正在 Excel 的 VBA 中使用我们的用户名使用

Environ("Username")
构建动态宏,并且需要提取大写字符。所以 JohnSmith 就变成了 JS

我无法让宏只返回缩写。它只是给了我一个空白的回复

'
' Macro1 Macro
'
Dim Username As String
Dim UserInits As String
Username = Environ("UserName")
Dim i As Integer
Dim spltStr() As String
spltStr = Split(Username)

UserInits = ""

i = 1
Do While i <= Len(Username)

    If UCase(spltStr(i)) = spltStr(i) Then
        UserInits = UserInits & spltStr(i)
    End If
    
i = i + 1
Loop

MsgBox UserInits

End Sub

有人能看出我做错了什么吗?

vba
1个回答
0
投票

我怀疑你的代码根本无法运行。原因是命令

Split(Username)
没有执行您期望的操作。
Split
使用分隔符将字符串拆分为单词。如果省略第二个参数(分隔符),则使用空格。因此
split("JohnSmith")
将仅返回一个元素(索引为 0),Split(
John Smith
) 将返回两个元素,`Split("A,B,C", ",") 将返回 3。

按照您的代码,

spltStr(i)
应该抛出运行时错误9Subscript out of Range,因为您的Split命令肯定不会创建一个包含与名称中的字符一样多的元素的数组(而且它的索引始终从0开始) .

如果您想检查单个字符,只需使用

mid
函数,第三个参数 = 1。

以下简单函数将从字符串中提取大写字符。

Function GetInitials(s As String) As String
    Dim i As Long
    For i = 1 To Len(s)
        Dim c As String
        c = Mid(s, i, 1)
        If UCase(c) = c And Asc(c) > 32 Then
            GetInitials = GetInitials & c
        End If
    Next i
End Function

调用可能如下所示:

Sub t1()
    Dim Username As String
    Username = Environ("UserName")
    
    MsgBox GetInitials(Username)
    ' or
    MsgBox GetInitials("User FunThomas gave me a good Answer on StackOverflow")
    
End Sub

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.