Я бы сказал, что, вообще говоря, наличие переменной, которая имеет два или более различных значения в зависимости от контекста, делает жизнь сопровождающего более сложной, чем она должна быть. В этом случае, независимо от того, помещаете ли вы его внутри или вне области видимости цикла , значение не должно иметь никакого значения вообще - фактически, если Set objDoc = Nothing
указано вообще, должно также не иметь значения.
Вы не показываете остальную часть процедуры, но, насколько я понимаю, на самом деле нет причины, по которой эта конкретная процедура не будет выполнять 10 000 других операций.
Код, который вы показали , должен быть записан в связке процедур и функций.
'Some code to set filename
Вам нужна функция, которая реализует логику для получения имени файла и возвращает String
.
'Code to retrieve relevant info from document
Вам нужна процедура, которая извлекает соответствующую информацию из документа.
Потяните тело цикла в свою собственную процедуру:
For r = 2 To 40
filename = LogicToGetTheFilename(r)
ProcessWordDocument wordApp, filename
Next
Намного выше уровень абстракции здесь - при правильном названии вы знаете, что делает этот цикл с первого взгляда .
Private Sub ProcessWordDocument(ByVal wordApp As Object, ByVal filename As String)
Dim docx As Object 'Word.Document
Set docx = wordApp.Documents.Open(filename, ...)
'do stuff
docx.Close
'Set docx = Nothing
End Sub
Теперь, когда переменная объекта документа Word находится в своей собственной области, VBA должен надлежащим образом уничтожить базовый объект всякий раз, когда выполнение выходит из этой области (то есть один раз за итерацию цикла).
Поскольку рефакторинг цикла в надлежащие уровни абстракции означает, что документ Word живет только одну итерацию, я бы сказал (довольно сильно), что Set objDoc = Nothing
принадлежит внутри тела цикла.