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.Name
和 Font.Size
,但此处要做的最有影响力的修改是测试 Target
是否与特定的特定兴趣点相交Range
工作表上的单元格 - 例如,如果 运行 如果 Target
在 A2: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 的选择矩形时 运行 代码。
有人可以告诉我以下代码是否经过优化并正确地将 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.Name
和 Font.Size
,但此处要做的最有影响力的修改是测试 Target
是否与特定的特定兴趣点相交Range
工作表上的单元格 - 例如,如果 运行 如果 Target
在 A2: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 的选择矩形时 运行 代码。