2012-10-04 31 views
1

我已经产生了一些VBA代码来解决此问题:如何在Excel中自动将小写字段转换为大写字段?

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停止工作没有一个单一的错误消息。

有谁知道这个问题可以从哪里来?

+0

有趣的是,该代码在Excel停止前工作... –

+1

您是否将enableEvents设置为false?另外,它会再次自我触发(或任何其他eventHandler)。 – CaBieberach

回答

1

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

另外,如果您不想导致更改工作表和重新触发事件的循环,则需要禁用事件。 IsEmpty函数是VBA略有不同,你的代码可以更新,这将也处理的不仅仅是1个单元改变多个以下

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次小区变更,更换对于每个循环与If Target.rows.count = 1 AND Target.columns.count = 1....

+0

在完整的代码中,我做到了这一点:如果Target.Cells.Count = 1并且(Target。 Column = 1或Target.Column = 4)...但是你可能是对的,可能有一个触发事件的循环,我检查了这个,谢谢 –

+0

Aaaaaand,我觉得很蠢。 –

0

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

Events And Event Procedures In VBA

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

+0

实际上,它在正确的位置,我将它放在“This Worbook”MSExcel Object中,因此它适用于所有工作簿,而不仅仅是第一张工作表。 无论如何,我试图把它放在你说的地方,在一个空白的Excel项目中,它也没有工作 –

相关问题