【问题标题】:Excel VBA to UppercaseExcel VBA 转大写
【发布时间】:2021-02-23 16:49:50
【问题描述】:

谁能告诉我以下代码是否已针对 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

【问题讨论】:

  • 焦点(选择不同的单元格/范围)或更改(单元格内容已更新)? Worksheet_change 事件不会由公式重新计算引起的更改触发。
  • 在每次更改时运行 VBA 肯定会减慢 Excel。最好有一个在保存时运行的格式化宏以一次更正所有内容。
  • 永远不要重复相等的分配!将 cell.Font.Name = "Arial Narrow" 放在 For Each cell In Target 之前,不要重复。 cell.Font.Size = 9 也是如此
  • 仅供参考,这里的问题不一定是题外话(尽管可以说比典型的更广泛),但标题如“在修改后的单元格中强制大写”,这将是一个很好的问题- 在Code Review 上收到帖子,其中的“问题”具体要求对提交给同行评审的代码的任何/所有方面提供反馈。
  • 注意!谢谢大家

标签: excel vba ms-office uppercase


【解决方案1】:

缩进不一致,重复的语句可以重新组织,不需要重复;不需要存在空代码块,将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(免费,开源;我管理项目)可以帮助缩进,它的代码检查会警告空块(并建议反转条件)和针对@987654325 的隐式默认成员调用@ (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 上”,而是“在单元格值/公式修改”上运行;而是考虑处理Worksheet.SelectionChange,以便在单元格获取 Excel 的选择矩形时运行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2021-02-28
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多