你的問題是,如果循環過期(耗盡所有的迭代),沒有控制來防止它進入WriteProcess。
這是使用GoTo
語句時的一個問題。最好將這些降到最低。例如,雖然這並不檢查每行行,只是一個例子說明如何避免額外的GoTo
。
'Write the Selected Value in the Range - Next Available row in the Column of Source
For i = TableStartingRow + 1 To AddNewEntrow
If Range(EntryColLett & i).Value = wb21Tool.Sheets("Home").ComboBox1.Value Then
MsgBox "The data exists in the Table"
GoTo StopSub
Else
wbTool.Sheets("Home").Range(EntryColLett & AddNewEntrow).Value = wb21Tool.Sheets("Home").ComboBox1.Value
End If
Next
StopSub:
'Turn on the ScreenUpdate
Application.ScreenUpdating = True
但是,蠻力遍歷所有表中的數據似乎沒有必要,如果你需要檢查所有行詮釋,他的表就可能更好地只使用Find
方法。
假設EntryColLet
是代表列字母的字符串:
Dim tblRange as Range
Dim foundRow as Range
Set tblRange = Range(EntryColLet & (TableStartingRow+1) & ":" & EntryColLet & AddNewEntRow)
Set foundRow = tblRange.Find(wb21Tool.Sheets("Home").ComboBox1.Value)
If foundRow Is Nothing Then
'The value doesn't exist in the table, so do something
'
Else
'The value exists already
MsgBox "The data exists in the Table"
GoTo StopSub
End If
'More code, if you have any...
StopSub:
Application.ScreenUpdating = True
而對於其餘GoTo
- 如果沒有更多的代碼,條件If foundRow Is Nothing
後執行,那麼你可以刪除整個Else
條款和GoTo
標籤:
Dim tblRange as Range
Dim foundRow as Range
Set tblRange = Range(EntryColLet & (TableStartingRow+1) & ":" & EntryColLet & AddNewEntRow)
Set foundRow = tblRange.Find(wb21Tool.Sheets("Home").ComboBox1.Value)
If foundRow Is Nothing Then
'The value doesn't exist in the table, so do something
End If
Application.ScreenUpdating = True
End Sub
這裏有個問題嗎?代碼片段看起來像它會工作得很好。你有錯誤嗎? – tigeravatar
似乎更好地使用'Find'方法或'Application.Match'函數的範圍,但我沒有看到這段代碼有什麼問題。請詳細說明。 –
@tigeravatar是的,先生。它工作正常。但它沒有做我想做的事。當我在調試模式下運行代碼時,我發現它在運行增量i中的所有值之前運行了else循環。我希望代碼檢查增量i中的所有值,只有當它們不匹配所有這些值時,它才能進入WriteProcess。 – Sid29