Excel VBA 转为大写

Excel VBA to Uppercase

有人可以告诉我以下代码是否经过优化并正确地将 Excel VBA 转换为单元格焦点上的大写吗?

有时它会减慢 Excel。能有更好的版本吗?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Application.EnableEvents = False
 
 For Each cell In Target
     If IsEmpty(cell) Then
  
    
 ElseIf cell.HasFormula = True Then
  
       cell.Font.Name = "Arial Narrow"
    cell.Font.Size = 9
    Else

    cell = UCase(cell)
    cell.Font.Name = "Arial Narrow"
    cell.Font.Size = 9
        End If
    
    Next
    Application.EnableEvents = True
End Sub

缩进不一致,重复的语句可以重新组织,这样就不需要重复了;不需要存在空代码块,将 Boolean 表达式与 Boolean 文字进行比较的条件表达式是多余的,并且隐式默认成员调用可以显式显示以获得更清晰的代码:

Application.EnableEvents = False
Dim cell As Range
For Each cell In Target
    If Not IsEmpty(cell.Value) Then
        If Not cell.HasFormula Then
            cell.Value = UCase(cell.Value)
        End If
        cell.Font.Name = "Arial Narrow"
        cell.Font.Size = 9
    End If
Next
Application.EnableEvents = True

Rubberduck(免费,开源;我管理项目)可以帮助缩进,它的代码检查会警告空块(并建议反转条件)和隐式默认成员调用 Range (cell.Value).

至于性能,作为 Worksheet.Change 事件处理程序意味着宏会在每次修改任何单元格时迭代每个修改的单元格。大多数情况下,这是针对单个单元格的,因此循环在大多数情况下只迭代一次;您可能可以通过禁用 ScreenUpdating 并将 Calculation 模式设置为 xlCalculationManual 以及将 EnableEvents 设置为 True 来节省几毫秒,但 IMO 的好处将是边缘的。

考虑使用样式而不是设置单个单元格的 Font.NameFont.Size,但此处要做的最有影响力的修改是测试 Target 是否与特定的特定兴趣点相交Range 工作表上的单元格 - 例如,如果 运行 如果 TargetA2:C25 范围内,则循环,您可以将此测试作为第一个宏所做的事情,以防止在修改后的单元格超出该范围时执行任何代码:

If Application.Intersect(Target, Me.Range("A2:C25") Is Nothing Then
    'modified cell isn't in A2:C25; bail out
    Exit Sub
End If

请注意,Worksheet.Change 事件处理程序不会 运行“在单元格 focus”,而是“在单元格 value/formula已修改”;考虑处理 Worksheet.SelectionChange,每当单元格获取 Excel 的选择矩形时 运行 代码。