温馨提示:本文翻译自stackoverflow.com,查看原文请点击:excel - Macro to force uppercase not working on specified range
excel vba

excel - 宏强制大写在指定范围内不起作用

发布于 2020-03-27 11:44:43

我需要Excel中的宏来自动大写在一系列单元格中输入的文本。

我在网上找到了行得通的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Target, Range("A1:C10")) _
Is Nothing) Then
        With Target
            If Not .HasFormula Then
                Application.EnableEvents = False
                .Value = UCase(.Value)
                Application.EnableEvents = True
            End If
        End With
    End If

它可以正常工作,但是当我将多个单元格复制或粘贴到指定范围内时,出现值不匹配错误。所以我尝试使用以下代码代替:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Set r = Range("$A$1:$C$10")
    Application.EnableEvents = False
    For Each r In Target
        If Not r.HasFormula And r.Value <> "" Then
            r.Value = UCase(r.Value)
        End If
    Next
    Application.EnableEvents = True
End Sub

即使在复制和粘贴时,此代码也可以完美地工作,但是即使r变量上设置了范围,它也适用于整个电子表格为什么?谢谢!

查看更多

查看更多

提问者
ahmad
被浏览
108
Roman Voronov 2019-07-03 23:19

您只需要适当地结合两个代码示例的技术即可。第二个代码缺少交集功能,而第一个代码则缺少一系列插入单元格之间的迭代。试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Magic_Range As Range, Iterator_Range As Range
    Set Magic_Range = Range("$A$1:$C$10")
    Application.EnableEvents = False
    If Not Application.Intersect(Target, Magic_Range) Is Nothing Then
        For Each Iterator_Range In Application.Intersect(Target, Magic_Range)
            If Not Iterator_Range.HasFormula And Iterator_Range.Value <> "" Then
                Iterator_Range.Value = UCase(Iterator_Range.Value)
            End If
        Next Iterator_Range
    End If
    Application.EnableEvents = True
End Sub