Старайтесь делать такие процессы невидимыми для пользователя, избегайте Selected(i).
Если так хочется работать через VBA используйте
Dim mytab As ADODB.Recordset
Set mytab = New ADODB.Recordset
mytab.Open "Select..." '(тут ваш запрос)'
Do While mytab.EOF = False
'тут что хотите то и тврите с полями mytab!myField'
mytab.MoveNext
Loop
это один из способов в VBA
Другой способ через запросы:
создаете различные запросы на обновления, удаления, добавления. Можно какую то серию(транзакцию) запихать в один запрос но тогда уже не сможете пользоваться конструктором придется ручками(но это уже другой вопрос).
потом или сразу вешаете на кнопку исполнение запроса или если это серия запросов, создаете макрос исполняющий эту серию, и тогда уже вешаете макрос на кнопку.
В вашем случае нет нужды пробегать по строкам и для каждой делать insert так как данные не изменяются и вы не делаете ни каких проверок
сделайте один запрос типа
INSERT INTO ТаблицаДляВставки ( ПоляДляВставки через запятую )
SELECT ПоляДоноры
FROM ТаблицыДоноры
WHERE условия выборки можно тащить из формы
ORDER BY сортировочка;