2017-09-05 67 views
3

我是一個Excel-VBA新手,我正在嘗試編寫一段代碼,該代碼由某人更改工作表中單元格的值觸發。它應該將更改單元格的值設置爲零,如果它小於零。代碼如下所示:Worksheet_Change事件中的目標範圍不正確

Private Sub Worksheet_Change(ByVal Target As Range) 
'Debug.Print Target.Address 
If Target.Column = 6 Then 
    For Each Cell In Target.SpecialCells(xlCellTypeConstants, 3) 
    If Cell.Value < 0 Then 
     Cell.Value = 0 
    End If 
    Next 
End If 
End Sub 

現在發生的事情是,當我改變6列任意單元格的值,在含有小於零號片的每一個細胞是變爲零。

我在考慮爲Worksheet_Change事件處理程序創建的「目標」對象只包含更改的單元/單元,因此我的代碼只會更改被修改的單元格的值,並觸發第一名。

我試圖通過使用Debug.Print來幫助自己輸出對象的地址。它打印出表格中每個單元格的地址值小於零,因此我假設處理程序運行了好幾次。

實際上我發現了一個問題本身的解決方法,但我的問題是這樣的:我如何在使用Worksheet_Change事件失敗以及未來可以做什麼以避免出現這樣的問題?

+2

使用application.enableevents = false或您的事件過程將自行運行。 – Jeeped

+0

'Target'確實只涉及已更改的單元格,並且我無法複製您的錯誤。試試Jeeped的修正案,看看你如何繼續。 – SJR

+1

不要忘記將它設置回'Application.EnableEvents = True',否則你的事件將不會在下次啓動 – Tom

回答

0

編輯1:與bug修復更新代碼中的註釋

編輯2提示:更新代碼錯誤處理,處理數組公式

在回答你的問題

[1]我怎麼在使用Worksheet_Change事件和[2]我可以在未來做些什麼不會有這樣的問題?

  1. 技術上你沒有
  2. 沒有這種類型的問題,儘管以下規則一般

你是在你的Target對象的理解是否正確幫助。您的代碼失敗,因爲SpecialCells不喜歡單個單元格操作。給它一個,它擴展到整個表!給它別的東西,它工作得很好。

的原因,你的Debug.Print顯示所有單元格的是,每次你的代碼更改單元格,另一變化事件被觸發。幸運的是第二個發現一個零,所以它不會觸發另一個之一。下面的一般規則應該有助於避免了很多問題,只是沒有這個特殊的一個:

  • 始終圍繞在改變與Application.EnableEvents工作簿中的任何一部分的事件處理程序的任何代碼。

要修復你的代碼,所以它可以工作,只需刪除SpecialCells方法調用。由於您使用的是Cell.Value而不是強烈推薦的Cell.Value2(請參閱here),VBA隱式類型會將格式爲文本的數字轉換爲實際的數字。因此,該代碼對數字和文本值都起作用。

代碼:

Private Sub Worksheet_Change(ByVal Target As Range) 
    'Debug.Print Target.Address; 
    Application.EnableEvents = False 
    For Each Cell In Target '.SpecialCells(xlCellTypeConstants, 3) 
     If Cell.Column = 6 And Cell.Value < 0 Then 
     On Error GoTo Error: 
     Cell.Value = 0 
     On Error GoTo 0 
     End If 
    Next 
GoTo ExitSub: 
Error: 
    If Err.Number = 1004 Then ' 1004 -> "You cannot change part of an array." 
    'Application.Undo ' Uncomment to disallow array entering a negative value formula into/across column 6 
    MsgBox "A cell could not be zeroed as" & vbCr & "it is part of an array formula.", vbExclamation, "Microsoft Office Excel" 
    On Error GoTo 0 
    Else 
    On Error GoTo 0 
    Resume 
    End If 
ExitSub: 
    Application.EnableEvents = True 
End Sub 

注:

- 更新1:代碼與多細胞的變化,現在正確處理。

- 更新2:代碼現在捕獲錯誤1004應對進入數組公式。它可以允許在列6中輸入數組公式,以便在列6中輸入負值,或者完全停止輸入。

+0

我避免使用target.column,因爲可以使用Ctrl + Enter在水平範圍內輸入數據。 –

+0

@PatrickHonorez不知道我明白。您也可以在*垂直*範圍內輸入數據。公式必須不同。 – robinCTS

+0

'Target'可能是一個範圍,並且覆蓋了幾列。因此'如果Target.Column = 6'容易出錯。 –

0

此作品(更新

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim c As Range 
    For Each c In Target 
     If c.Column = 6 Then If IsNumeric(c) Then If c < 0 Then c = 0 
    Next c 
End Sub 

並請,學習和使用OPTION EXPLICIT

+0

我無法使用'.SpecialCells(xlCellTypeConstants,3)' – Tom

+0

這也適用於3。它不包括在[文檔](https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-specialcells-method-excel) – Tom

+1

@Tom:根據文檔3等於'xlNumbers + xlTextValues'。這個工程,我只是試過 –