2013-10-21 97 views
2

我目前正在嘗試寫入基於表更改的宏,其中表列中的字母自動轉換爲大寫。因此,例如,如果我在單元格中輸入「abcde-12345-678」,它會自動更正爲「ABCDE-12345-678」。在做了一些挖掘之後,我發現了一些適用於某些人的代碼,但我無法對其進行調整以適應我的需求。自動文本大寫Excel VBA

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Range("E:E")) Is Nothing Then Exit Sub 
    Application.EnableEvents = False 
    Target = UCase(Target) 
    Application.EnableEvents = True 
End Sub 

我想解決兩件事情。首先,這個代碼目前不適用於我。根據作者(位於Sheet1對象中),我將它放在正確的位置。有什麼想法,爲什麼這不工作?

第二個是我想修改代碼來引用表列而不是範圍。例如,我試圖改變上述代碼的第二行以下的(我的表的名稱是ReviewTracker,我感興趣的列是產品編號):

If Intersect(Target, Range(ReviewTracker[[@Headers],[Product Number]])) Is Nothing Then Exit Sub 

這返回編譯錯誤「預期:列表分隔符或)」。所以顯然有些問題,但希望它可以幫助說明我正在努力完成什麼。

在此先感謝您對此問題的任何幫助。

-Sean

+0

檢查它是否工作 - 在'If Intersect ...'之前添加以下行'Debug.Print Now'作爲第一行。在E:E列中添加一些值並返回到VBA編輯器。在即時窗口中,您應該輸入當前的日期和時間。有沒有什麼? –

+0

代碼在E列中正常工作。如果您可以簡單地使用範圍(「A2:A10」),例如 – 2013-10-21 14:32:20

回答

5

首先。由於很多原因,您可以禁用事件。讓我們可以肯定的是事件上,你可以做如下:

去VBA編輯>>打開即時窗口>>寫有:Application.EnableEvents = true >>按Enter鍵

二。要檢查是否在你交叉口匹配相應的列,你需要這樣的ListObject table

If Intersect(Target, Range("ReviewTracker[Product Number]")) is Nothing Then 

假設ReviewTracker是表名和Product Number是表列。您不需要#Headers,因爲它只會引用標題行。

+0

+1範圍(「ReviewTracker [產品編號]」)位。 – varocarbas

+0

感謝您的快速響應。這正是我所期待的。 – detroitwilly

3

UCase做什麼是將所有的字符給定的字符串中爲大寫字母,因此可以將其應用到任何Range.Value。每當單元格的值發生變化時調用Worksheet_Change,因此是放置代碼的好地方。但是你用來引用表的方式是錯誤的。您發佈的適應您的要求的代碼:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Intersect(Target, Sheet1.ListObjects("Table1").ListColumns(1).Range) Is Nothing Then Exit Sub 
    Target.Value = UCase(Target.Value) 
End Sub 

它轉換成上端蓋在Table1Sheet1第一列中的任意字符串輸入。它必須放置在Sheet1目標文件中(在VBA項目瀏覽器中:文件夾中的Sheet1 (Sheet1))。適應你的實際情況很簡單。

+0

+1,您爲什麼需要使用表格列...在我之前30秒:) –