VBA в MS Access: как ускорить работу цикла на наборе записей - PullRequest
0 голосов
/ 23 ноября 2018

В моей базе данных (MS Access 2010) я использую процедуру VBA для очистки записей, а именно: установка значений в поле от «да» до «нет».Процедура перебирает все записи и устанавливает значения в соответствующем поле по мере необходимости.

Моя база данных насчитывает около 900 записей.Не слишком много, надо подумать.

Моя проблема: процедура VBA работает очень медленно.На моей текущей машине мне нужно подождать около 10 секунд, пока цикл не пройдет 900 записей.Это непрактично в повседневной работе.

Что мне нужно: Я ищу способы ускорить это, либо путем улучшения кода, либо с помощью совершенно другого подхода.

Вот моя процедура:

Private Sub WipeSelectionMarks_Click()

'Remove any filter that might be set to reduce the number of records in
'the form - We want here to operate on all records in the database!

   Me.Filter = ""
   Me.FilterOn = False
    'Don't know if we really need two commands here; but at least it works 

'Operate on a recordset that holds all the records displayed in the form
   Dim rs As DAO.Recordset
   Set rs = Me.RecordsetClone
   rs.MoveFirst
   Do Until rs.EOF
      With rs
        .Edit
        !Int_IwSelectMove = False
        .Update
      End With
      rs.MoveNext
   Loop

'Message box with info what has been done 
   MsgBox "A total of " & rs.RecordCount & " records were updated by wiping the Move mark"

'Cleaning up
   Set rs = Nothing
   Me.Refresh

 End Sub

Примечание 1: если решение будет использовать вместо этого команду SQL, я буду благодарен за практические советы или примеры.Я использую команды SQL во многих местах, но все равно было бы полезно встать на правильный путь.

Примечание 2: Или можно переписать процедуру VBA таким образом, чтобы обрабатывались только записи, для которых у рассматриваемого поля есть значение «да» (обычно это только 20-30 из 900), и те, у которых"нет" опущены?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

может ли процедура VBA быть переписана таким образом, что обрабатываются только записи, в которых рассматриваемое поле имеет значение "да"

Действительно, и это вполне может быть самый быстрый метод, так как вам не придется запрашивать форму:

   With rs
       Do Until .EOF
           If !Int_IwSelectMove.Value = True Then
               .Edit
               !Int_IwSelectMove = False
               .Update
           End If
           .MoveNext
       Loop
       .Close
   End With

Или вы можете использовать FindFirst или отфильтрованный набор записей.Запуск SQL на наборе записей формы обычно является последним вариантом.

0 голосов
/ 23 ноября 2018

Вы можете использовать команду UPDATE:

CurrentDb.Execute "UPDATE YourTable SET Int_IwSelectMove = False"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...