2012-10-04 28 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項目中,它也沒有工作 –

相關問題