1

我已经制作了一些 VBA 代码来解决这个问题:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
   If Target.Value <> Empty Then
      Target.Value = UCase(Target.Value)
   End If
End Sub

但是当我尝试在字段中输入一些数据时,Excel 停止工作,没有一条错误消息。

有谁知道这个问题可能来自哪里?

4

2 回答 2

1

您可能已设置 Application.EnableEvents = False。在 VBA 编辑器中打开“立即”窗口,application.EnableEvents = True然后键入 ENTER 以重新打开它们。

此外,如果您不想导致更改工作表和重新触发事件的循环,则需要禁用事件。ISEMPTY 函数在 VBA 中略有不同,您的代码可以更新为以下内容,这也将处理不止一个单元格的更改

Option Explicit

    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim cell As Variant

        Application.EnableEvents = False
            For Each cell In Target
                If Not IsEmpty(cell.Value) Then
                   cell.Value = UCase(cell.Value)
                End If
           Next cell
        Application.EnableEvents = True
    End Sub

或者如果您想将此运行限制为仅更改 1 个单元格,请将 for each 循环替换为If Target.rows.count = 1 AND Target.columns.count = 1....

于 2012-10-04T09:31:34.897 回答
0

您可能没有在正确的位置回调函数:

VBA 中的事件和事件过程

对于工作表(工作表和图表工作表)级别的事件,事件过程代码必须放在与该工作表关联的工作表模块中。工作簿级别的事件必须放在 ThisWorkbook 代码模块中。如果事件过程不在正确的模块中,VBA 将无法找到它并且事件代码将不会被执行。

于 2012-10-04T09:10:00.230 回答