2015-11-16 83 views
0

我對Excel VBA很新。 根據工作表上特定單元格上的輸入,我正在觸發幾個宏。另一個運行時錯誤'13':類型不匹配

我對前2個選項沒有問題。 但是每次我使用第三個選項,即刪除行,&,每次編輯單元格或刪除單元格時,都會遇到錯誤。

的代碼如下:

Sub Worksheet_Change(ByVal Target As Range) 
Set Target = ActiveCell 
If Target.Value = "Fuel Supply" Then (<=Error At This Point) 
     Fuel_Heating_Value 
ElseIf Target.Value = "Add Row" Then 
     Insert_New_Row 
ElseIf Target.Value = "Delete Row" Then 
     Delete_Row 
Else: 
End If 
End Sub 

的錯誤是總是在代碼中的第一個選項語句中的第三行。

第三選項代碼如下:

Sub Delete_Row() 
' 
' Delete_Row Macro 
' 
    Application.ScreenUpdating = False 
    ActiveCell.Select 
    ActiveCell.EntireRow.Select 
    Selection.Delete Shift:=xlUp 
    ActiveCell.Select 
    ActiveCell.Offset(-1, 12).Select 
    ActiveCell.Select 
    Selection.Copy 
    ActiveCell.Offset(1, 0).Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = False 
    ActiveCell.Offset(0, -11).Select 
    Application.ScreenUpdating = True 
    End Sub 

任何有助於消除這一問題將不勝感激。

謝謝。

+1

請在代碼中標出產生錯誤的行(''< - Error here'),您的描述有點混亂。 – Andre

+0

正如我在下面的回答中所述,刪除行的操作會觸發另一個更改事件,並且Worksheet_Change會嘗試在其本身之上運行。當它這樣做時,Target是替換已刪除行的行,因此「Target」不是單個單元格。它是16,384個單元格的集合(整行),不能將16,384個單元格的集合與單個文本字符串進行比較。這是'類型不匹配'。 – Jeeped

回答

0

您正在從Worksheet_Change事件宏刪除行,複製和粘貼單元格等。您不應該修改Worksheet_Change中的工作表而不禁用事件,否則您執行的操作將觸發另一個事件,並且Worksheet_Change將嘗試在其本身之上運行。

此外,我不知道Set Target = ActiveCell是做什麼的。當Worksheet_Change被觸發時,它傳遞一個或多個接收到更改的單元格的地址。你基於你的目標的條件。您不必將其設置爲任何內容。但是,您應該警惕目標不止有一個單元格;如果您嘗試將一組單元格與單個文本字符串進行比較,則您的代碼將引發錯誤。也許這是錯誤發生的地方。您的條件全部取決於Target是單個單元格。如果Target不止一個單元格,我已經放棄了退出代碼,因爲如果它是複數,那麼繼續是毫無意義的。

Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Count > 1 Then Exit Sub 

    On Error GoTo bm_Safe_Exit 
    Application.EnableEvents = False 

    If Target.Value = "Fuel Supply" Then 
     Fuel_Heating_Value 
    ElseIf Target.Value = "Add Row" Then 
     Insert_New_Row 
    ElseIf Target.Value = "Delete Row" Then 
     Delete_Row 
    Else: 
    End If 

bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

現在不會踢另一個事件在第一上運行,如果在工作表中的Worksheet_Change的結果有什麼變化。

Delete_Row例行程序也可以改進,但它有助於描述它試圖完成什麼。有選中的單元格已被選中,並且相當多地拋出了ActiveCell property

請參閱How to avoid using Select in Excel VBA macros以獲取更多有關擺脫依賴選擇和激活來實現您的目標的方法。

相關問題