大家好:
如上的語法是可以使用,但問題已經我在指定欄位後,在Excel選擇多欄後,按下鍵「Delete」鍵就有錯誤訊息出現,但選擇一欄的時後按下「Delete」鍵就無錯誤訊息出現!請如要如何克服?!
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect([A1:A2000,K1:K2000], Target) Is Nothing Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
應該是 UCase 帶入的非字串類型發生的錯誤
VBA Target 預設如果為單一儲存格,會回傳文字,
若是範圍,會回傳 Range,
但是 Range 無法傳入 UCase。
稍微改了下程式碼如下,
請您參閱。
Private Sub Worksheet_Change(ByVal Target As Range)
'判斷更動區域是否為 A1:A2000 或 K1:K2000
If Intersect([A1:A2000,K1:K2000], Target) Is Nothing Then
Exit Sub
End If
'Application.ScreenUpdating = False '關閉螢幕更新
Application.EnableEvents = False '關閉事件程序
'Application.Interactive = False '禁止交互模式
Application.DisplayStatusBar = False '關閉顯示狀態
Application.Calculation = xlCalculationManual '關閉自動計算
'判斷為單一儲存格
With Target
'範圍列數為 1 列,範圍欄數為 1 欄
If .Rows.Count = 1 And .Columns.Count = 1 Then
.Cells.Value = UCase(.Cells.Value) '內容轉大寫
GoTo e '跳到結束
End If
End With
'範圍儲存格,取得非空值
On Error Resume Next '錯誤跳轉到下一句,為了 set 範圍內無內容時的錯誤
Dim Rng As Range, Cel As Range '設定變數,類型為區域
With Target
Set Rng = .SpecialCells(xlCellTypeConstants, 23) '取得範圍內 "非空白" 的儲存格
If Not Rng Is Nothing Then '如果有 "非空白" 的儲存格
For Each Cel In Rng '遍歷
With Cel '儲存格
If .Column = 1 Or .Column = 11 Then '如果該儲存格為 A 欄或 K 欄
.Value = UCase(.Value) '內容轉大寫
End If
End With
Next
End If
Set Rng = Nothing '釋放範圍變數
Set Cel = Nothing
End With
e:
Application.ScreenUpdating = True '開啟事件程序
Application.EnableEvents = True '開啟螢幕更新
Application.Interactive = True '禁止交互模式
Application.DisplayStatusBar = True '開啟顯示狀態
Application.Calculation = xlAutomatic '開啟自動計算
End Sub