返回列表 上一主題 發帖

[發問] 想不明白為何程式會進入無線迴圈

[發問] 想不明白為何程式會進入無線迴圈

我是VBA新手,在練習以下程式,會進入LOOP跳不出來
原本用意是在欄V位輸入資料(觸發程序)後會在D1:E10範圍內找相同資料後,輸出至相對的欄位B
用一般的 Sub () 可行,改用 Sub Worksheet_Change(ByVal Target As Range)就會進入無限回圈中

Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Variant
Dim I As Integer
  X = Range("A" & Rows.Count).End(xlUp).Row
    For I = 1 To X
      Cells(I, 2) = Application.VLookup(Cells(I, 1), Range("D1:E10"), 2)
    Next I
End Sub

請大家指點....謝謝

本帖最後由 lpk187 於 2015-12-8 17:57 編輯

回復 1# morris_lth


    Worksheet_Change是變更工作表中的儲存格時會發生此事件
而Cells(I, 2) = Application.VLookup(Cells(I, 1), Range("D1:E10"), 2)而正是做變更的動作,當然會進入無線迴圈入中
所以必須要在這列之前寫Application.EnableEvents = False 來禁止做觸發動作
之後寫Application.EnableEvents = True 來重新啟動觸發動作

Application.EnableEvents = False
For I = 1 To X
      Cells(I, 2) = Application.VLookup(Cells(I, 1), Range("D1:E10"), 2)
Next I
Application.EnableEvents = True

TOP

考題來了 !!

正常下應該如(1) 一樣陷入無窮回圈
有沒有人知道為何 (2) 卻不會陷入無窮回圈

(1)
Private Sub Worksheet_Change(ByVal Target As Range)
  For w = 1 To 2
  [A1] = Val([A1]) + 1
  Next
End Sub

(2)
Private Sub Worksheet_Change(ByVal Target As Range)
  For w = 1 To 1
  [A1] = Val([A1]) + 1
  Next
End Sub

TOP

本帖最後由 c_c_lai 於 2015-12-9 08:35 編輯

回復 1# morris_lth
因為你並沒有告訴系統在甚麼欄位有任何異動時,才去處理觸發事件。
亦即你沒指定 Target 是甚麼? 任何欄位? 亦或是某個特定欄位?
如 A 欄位.......? 所以才會感覺是在不斷地無窮迴圈。
因為你目前程式裏所下的條件是:
"只要表單內有任何異動時,隨即處理觸發事件"。

TOP

因為你的程式在單元格被修改的過程中修改了單元格的內容,導致二次事件激活……
可以做如下修改(增加兩行代碼):
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.   Dim X As Variant
  3.   Dim I As Integer
  4.   
  5.   Application.EnableEvents = False
  6.   X = Range("A" & Rows.Count).End(xlUp).Row
  7.   For I = 1 To X
  8.     Cells(I, 2) = Application.VLookup(Cells(I, 1), Range("D1:E10"), 2)
  9.   Next I
  10.   Application.EnableEvents = True
  11. End Sub
複製代碼
世界那麼大,可我想去哪?

TOP

原來是這樣阿~
謝謝大家的說明...

TOP

        靜思自在 : 盡多少本份,就得多少本事。
返回列表 上一主題