2015-11-02 69 views
1

我正在循環記錄集以執行一些基本功能或編輯。訪問VBA循環(未響應)

通常記錄集的記錄數超過50,訪問將停止響應。

我在循環命令前有me.repaint,但窗口始終凍結,訪問標題欄顯示:...(未響應)。

任何想法如何解決這個問題?

謝謝。

戴夫。

編輯:添加循環代碼

If Me.Dirty = True Then Me.Dirty = False 
Dim rs As DAO.Recordset 
Set rs = Me.Guardians_Subform1.Form.Recordset 

Dim strFirstName, strLastName As String 

If Not (rs.EOF And rs.BOF) Then 
    rs.MoveFirst 

    Do Until rs.EOF = True  
rs.Edit 
    strFirstName = Trim(StrConv(rs!FirstName, 3)) 
    strLastName = Trim(StrConv(rs!LastName, 3)) 
    If rs!FirstName <> strFirstName Then 
    rs!FirstName = strFirstName 
    End If 

    If rs!LastName <> strLastName Then 
    rs!LastName = strLastName 
    End If 

    rs.Update 
     rs.MoveNext 
Me.Repaint 
    Loop 
Else 
    MsgBox "There are no records in the recordset." 
End If 
Set rs = Nothing 
+2

嗨戴夫,你可以提供這個代碼請。我們會更容易幫助你。 – psychicebola

+0

另外,訪問應該能夠處理大小不超過[1gig]的記錄集(https://support.office.com/en-us/article/Access-2010-specifications-1e521481-7f9a-46f7-8ed9-ea9dff1fa854) 。你的記錄有多大? – Jens

+0

最後一個記錄集少於100條記錄。我已經添加了循環代碼。謝謝! –

回答

2

您需要在循環中調用DoEvents-Function以將控制權傳遞給操作系統,以重繪Access-GUI並處理任何可能需要處理的其他窗口消息。由此,應用程序不會在任務管理器和標題欄中被標記爲「不響應」。

Do Until rs.EOF = True 
    [...] 
    rs.MoveNext 
    DoEvents 
Loop 

有一個小的性能折衷。如果不調用DoEvents,則循環的總執行時間會縮短一些,但Access不會執行任何操作,然後處理循環。因此它似乎沒有迴應。

3

它不是做這樣的修改與一個記錄循環最好的辦法。 UPDATE查詢效率更高。

例如

UPDATE tblGuardians 
SET FirstName = Trim(StrConv(FirstName, 3)) 
WHERE StrComp(FirstName, Trim(StrConv(FirstName, 3)), 0) <> 0 

LastName相同。

這使用StrComp而不是簡單的<>比較,因爲後者是不區分大小寫的。第三個參數0 = vbBinaryCompare

+0

我的確同意,單個SQL語句通常比循環編輯多條記錄的記錄集要好得多。 - 但是這個答案沒有解決處理循環時訪問凍結的一般問題。 – PhilS

+0

謝謝!所以我應該這樣做:DoCmd.RunSQL「UPDATE tblGuardians SET Firstname = FirstName = Trim(StrConv(FirstName,3))WHERE ID =」&rs![ID] & ";「 –

+0

@DaveB:不,這個查詢不會在記錄集循環中運行,這就是要點,它會立即更新所有記錄,這個查詢(加上LastName的記錄)是**替換**你的Loop代碼。 – Andre

2

正如其他人所指出的,您可以在繼續之前使用DoEvents釋放您的處理器以執行其他操作。當我在循環中使用DoEvents時,我使用計數器。

Dim iCounter as Integer 

Do Until 
' some code here 
    iCounter=iCounter+1 
    If iCounter = 100 then 
     DoEvents 
     iCounter=0 
    End if 
Loop 

這使DoEvents不會太頻繁地觸發並導致您的整體代碼變慢。調整計數器以適應任何迭代。