2014-09-19 61 views
0

代碼:事件處理程序 - 不更新單元格按預期

Private Sub Worksheet_change(ByVal target As Range) 
Application.ScreenUpdating = False 
Application.EnableEvents = False 

Dim cell 

For Each cell In Me.UsedRange.Columns("E").Cells 
    If cell.Text = "Cu" And cell.offset(0, -1) = "WR229" Then 
     MsgBox "Cu not permitted for WR229 or larger waveguide", vbOKOnly, "Cu Alert" 
     cell = "Al" 
    End If 
Next cell 

Application.ScreenUpdating = True 
Application.EnableEvents = True 
End Sub 

的問題是,當條件滿足時,細胞不會被重置爲值「鋁」。爲什麼不?

+0

您是否嘗試過將在圈頂部一個斷點,單步調試代碼? – paulroho 2014-09-19 18:41:47

回答

1

如果UsedRange未在A列中啓動,OP代碼可能失敗的一個可能原因是。如果A列中沒有數據並且沒有格式化,則會發生這種情況。

爲什麼?因爲.Columns(和.Rows.Cells就此而言)是相對到指定的範圍。例如,如果UsedRangeB2:Z10,則Me.UsedRange.Columns("E")將參考範圍F2:F10

OP代碼中的另一個問題是,它將運行任何單元更改,包括列A中的那些更改。這會引發錯誤,因爲列A中的偏移量-1無效。

那麼,如何解決它?正如jbarker2160回答的那樣,您應該利用參數Target,該參數告訴您哪些單元格已更改。但是這個答案留下了一些問題。

  • 我們要檢查E柱=「銅」和列D爲「WR229」,但我們不知道哪一個將進入第一
  • 我們應該考慮的是若干個電池的可能性同時,如改變由於複製/粘貼
  • 我們應如何處理可能出現的錯誤,並禁用
  • 的OP的代碼是區分大小寫的休假活動。即當「Cu」不是時,「CU」將被接受。這是期望的行爲嗎? (如果它是,從下面的代碼中刪除UCase$()的)
  • 在OP的代碼隱式是存在的被禁止對Cu 較大波導的範圍內。這在下面的代碼中仍未得到解決。

此代碼解決了上述問題

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim rw As Range 

    On Error GoTo EH 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 

    For Each rw In Application.Intersect(_ 
     Target.EntireRow, Me.UsedRange.EntireRow.Columns("D:E")).Rows 

     If UCase$(rw.Cells(1, 2)) = "CU" And UCase$(rw.Cells(1, 1)) = "WR229" Then 
      MsgBox "Cu not permitted for WR229 or larger waveguide", _ 
       vbOKOnly, "Cu Alert" 
      rw.Cells(1, 2) = "Al" 
     End If 
    Next 
EH: 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 
End Sub 
+0

更好的解決方案。我不知道EnableEvents可能是錯誤的。謝謝,克里斯。 – jmaz 2014-09-20 19:30:19

0

改變這一行:

cell = "Al" 

要這樣:

cell.Value = "Al" 
1

代碼

Private Sub Worksheet_change(ByVal target As Range) 
Application.ScreenUpdating = False 
Application.EnableEvents = False 

If target = "Cu" And target.offset(0, -1) = "WR229" Then 
    MsgBox "Cu not permitted for WR229 or larger waveguide", vbOKOnly, "Cu Alert" 
    target = "Al" 
End If 

Application.ScreenUpdating = True 
Application.EnableEvents = True 
End Sub 

說明

因爲你正在做這個循環中的每個變化,你不不需要循環呃整個列和使用target將得到解決不得不使用Value屬性。

+0

aphoria的答案很有幫助,而且這更進一步。感謝您通過更好的編碼練習來幫助我。 – jmaz 2014-09-19 19:09:09

+0

解決問題後,您應該回到帖子並將最有幫助的答案標記爲「答案」。 – 2014-09-22 16:57:50

+0

我標記了chris neilsens的回答最有幫助。 – jmaz 2014-09-22 17:44:41