Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 用大写字母改变单词的颜色_Excel_Vba - Fatal编程技术网

Excel 用大写字母改变单词的颜色

Excel 用大写字母改变单词的颜色,excel,vba,Excel,Vba,我有一张有很多单词的桌子,需要找到大写字母的单词并改变颜色。例如: A1: event A2: Event A3: Happy day 在A2和A3中,应将单词的颜色更改为红色,但在A3中,仅更改为“快乐”单词。我试图用条件格式解决问题,但失败了。:)(可能是VBA?) 感谢您的帮助。参考-MicroSoft VBScript正则表达式X.X Sub test() Dim mCol As MatchCollection Dim Ws As Worksheet D

我有一张有很多单词的桌子,需要找到大写字母的单词并改变颜色。例如:

A1: event 
A2: Event 
A3: Happy day
  • 在A2和A3中,应将单词的颜色更改为红色,但在A3中,仅更改为“快乐”单词。我试图用条件格式解决问题,但失败了。:)(可能是VBA?)

感谢您的帮助。

参考-MicroSoft VBScript正则表达式X.X

Sub test()
    Dim mCol As MatchCollection
    Dim Ws As Worksheet
    Dim rngDB As Range, rng As Range
    Dim strPattern As String
    Dim s As String
    Dim i As Integer, Ln As Integer, c As Integer


    Set Ws = ActiveSheet
    Set rngDB = Ws.Range("a1", Ws.Range("a" & Rows.Count).End(xlUp))

    strPattern = "[A-Z][a-z]{1,}"

    For Each rng In rngDB
        s = rng.Value
        Set mCol = GetRegEx(s, strPattern)
        If Not mCol Is Nothing Then
            For i = 0 To mCol.Count - 1
                c = mCol.Item(i).FirstIndex + 1
                Ln = mCol.Item(i).Length
                rng.Characters(c, Ln).Font.Color = vbRed
            Next i
        End If
    Next
End Sub
Function GetRegEx(StrInput As String, strPattern As String) As Object
    Dim RegEx As New RegExp
    Set RegEx = New RegExp
    With RegEx
        .Global = True
        .IgnoreCase = False
        .MultiLine = True
        .Pattern = strPattern
    End With
    If RegEx.test(StrInput) Then
        Set GetRegEx = RegEx.Execute(StrInput)
    End If
End Function

参考-MicroSoft VBScript正则表达式X.X

Sub test()
    Dim mCol As MatchCollection
    Dim Ws As Worksheet
    Dim rngDB As Range, rng As Range
    Dim strPattern As String
    Dim s As String
    Dim i As Integer, Ln As Integer, c As Integer


    Set Ws = ActiveSheet
    Set rngDB = Ws.Range("a1", Ws.Range("a" & Rows.Count).End(xlUp))

    strPattern = "[A-Z][a-z]{1,}"

    For Each rng In rngDB
        s = rng.Value
        Set mCol = GetRegEx(s, strPattern)
        If Not mCol Is Nothing Then
            For i = 0 To mCol.Count - 1
                c = mCol.Item(i).FirstIndex + 1
                Ln = mCol.Item(i).Length
                rng.Characters(c, Ln).Font.Color = vbRed
            Next i
        End If
    Next
End Sub
Function GetRegEx(StrInput As String, strPattern As String) As Object
    Dim RegEx As New RegExp
    Set RegEx = New RegExp
    With RegEx
        .Global = True
        .IgnoreCase = False
        .MultiLine = True
        .Pattern = strPattern
    End With
    If RegEx.test(StrInput) Then
        Set GetRegEx = RegEx.Execute(StrInput)
    End If
End Function

我可能会跳过正则表达式,只检查第一个字符的ucase等价物(这只是一个猜测,但我认为它也会比使用正则表达式更快)。像这样:

Sub Capitalize()

Dim sheet As Worksheet
Dim cell, range As range
Dim results() As String
Dim pos As Integer

Set sheet = ActiveSheet
Set range = sheet.range("a1", sheet.range("a" & Rows.Count).End(xlUp))

For Each cell In range
    pos = 1
    results = Split(cell)
    'if first char is upper then set color
    For Each r In results
        If Left(r, 1) = UCase(Left(r, 1)) Then
            cell.Characters(pos, Len(r) + 1).Font.Color = vbRed
        End If
        pos = pos + Len(r) + 1
    Next
Next

End Sub

我可能会跳过正则表达式,只检查第一个字符的ucase等价物(这只是一个猜测,但我认为它也会比使用正则表达式更快)。像这样:

Sub Capitalize()

Dim sheet As Worksheet
Dim cell, range As range
Dim results() As String
Dim pos As Integer

Set sheet = ActiveSheet
Set range = sheet.range("a1", sheet.range("a" & Rows.Count).End(xlUp))

For Each cell In range
    pos = 1
    results = Split(cell)
    'if first char is upper then set color
    For Each r In results
        If Left(r, 1) = UCase(Left(r, 1)) Then
            cell.Characters(pos, Len(r) + 1).Font.Color = vbRed
        End If
        pos = pos + Len(r) + 1
    Next
Next

End Sub

编辑凯文的答案,如果你想检查单词中的任何字母(不仅仅是第一个字母)是否大写,如果为真,则用红色突出显示

Sub Capitalize()
Dim sheet As Worksheet
Dim cell As range, myrange As range
Dim results() As String
Dim pos As Integer

Set sheet = ActiveSheet
Set myrange = sheet.range("a1", sheet.range("a" & Rows.Count).End(xlUp))

For Each cell In myrange
    pos = 1
    results = Split(cell)

    For Each r In results
        If r <> LCase(r) Then

            cell.Characters(pos, Len(r) + 1).Font.Color = vbRed
        End If
        pos = pos + Len(r) + 1
    Next
Next

End Sub
Sub-Capitalize()
将工作表设置为工作表
暗淡单元格作为范围,myrange作为范围
Dim results()作为字符串
作为整数的Dim pos
设置工作表=活动工作表
设置myrange=sheet.range(“a1”,sheet.range(“a”和Rows.Count).End(xlUp))
对于myrange中的每个单元格
位置=1
结果=拆分(单元格)
对于结果中的每个r
如果r是LCase(r),那么
cell.Characters(pos,Len(r)+1)。Font.Color=vbRed
如果结束
位置=位置+透镜(右)+1
下一个
下一个
端接头

如果你想检查单词中的任何字母(不仅仅是第一个字母)是否大写,请编辑Kevin的答案,如果为真,请将其高亮显示为红色

Sub Capitalize()
Dim sheet As Worksheet
Dim cell As range, myrange As range
Dim results() As String
Dim pos As Integer

Set sheet = ActiveSheet
Set myrange = sheet.range("a1", sheet.range("a" & Rows.Count).End(xlUp))

For Each cell In myrange
    pos = 1
    results = Split(cell)

    For Each r In results
        If r <> LCase(r) Then

            cell.Characters(pos, Len(r) + 1).Font.Color = vbRed
        End If
        pos = pos + Len(r) + 1
    Next
Next

End Sub
Sub-Capitalize()
将工作表设置为工作表
暗淡单元格作为范围,myrange作为范围
Dim results()作为字符串
作为整数的Dim pos
设置工作表=活动工作表
设置myrange=sheet.range(“a1”,sheet.range(“a”和Rows.Count).End(xlUp))
对于myrange中的每个单元格
位置=1
结果=拆分(单元格)
对于结果中的每个r
如果r是LCase(r),那么
cell.Characters(pos,Len(r)+1)。Font.Color=vbRed
如果结束
位置=位置+透镜(右)+1
下一个
下一个
端接头

您需要VBA,只有当单元格的内容是字符串而不是公式的结果时,您才能使用它。您可以使用基于公式的规则(例如,
=not(EXACT(A2,LOWER(A2)))来使用CF(对于整个单元格)。
您需要VBA,只有当单元格的内容是字符串时,您才能使用它,而不是公式的结果。您可以使用基于公式的规则使用CF(对于整个单元格),例如(eg)
=not(精确的(A2,较低的(A2))
非常感谢,它工作起来很有魅力。:)谢谢,我不确定你是否需要红色,如果任何字母大写-如@Naresh answer这两种解决方案都适合我的任务。我现在需要找到大写的单词,但也许@Naresh的版本将来会有用。:)非常感谢,它就像一个符咒谢谢,我不确定你是否需要红色,如果任何字母大写-如@Naresh answer这两种解决方案都适合我的任务。我现在需要找到大写的单词,但也许@Naresh的版本将来会有用。:)非常感谢,它工作得更加完美。:)非常感谢,它工作得更加完美。:)对不起,它坏了。它以“编译错误:未定义用户定义类型”消息停止。很抱歉,它无法工作。它以“编译错误:未定义用户定义类型”消息停止。