Um exemplo pra melhor entendimento:
Digamos que vc tenha 3 documentos Word no disco A: Teste1.docx, Teste2.docx e Teste3.docx. À partir do Excel, vc quer abrir cada um deles, escrever alguma coisa, salvar e fechar.
A pior maneira em relação ao uso de variáveis seria assim:
Sub PéssimaEscolha()
Dim i As Integer, wdApp As Object
For i = 1 To 3
Set wdApp = CreateObject("Word.Application")
With wdApp.Documents.Open("A:\Teste" & i & ".docx")
.Range.Text = "Olá Mundo" & i
.Save
.Close
End With
Next i
End Sub
O código iria rodar e fazer o que queria, embora vc nem veria o Word aparecer. Mas várias coisas não estão certas (ou pelo menos deveriam ser melhoradas) :
- Criar múltiplas instâncias do Word Application dentro do laço For...Next:
Vc não precisa abrir 3 Words em paralelo para abrir os 3 arquivos, pois os arquivos são abertos sequencialmente (em série) e fechados para só então abrir outro. Portanto a linha Set wdApp = CreateObject("Word.Application") deve vir fora do laço, antes da linha For i = 1 To 3. Isso também deixa o código bem mais rápido e com menor uso de recursos da sua máquina.
Um detalhe: o método .Close acima não fecha o Aplicativo Word e sim o Documento que foi aberto.
- Não fechar o(s) objeto(s) após consumi-lo(s):
Se após rodar o código anterior vc abrir o Gerenciador de Tarefas do Windows (CTRL+SHIFT+ESC) vai perceber que existem 3 aplicativos Word ainda abertos na memória, embora invisíveis. Estão ali, catatônicos, consumindo memória e não servindo pra nada, pois vc está sem acesso a eles (para eliminá-los clique com o direito sobre cada um e escolha Finalizar Tarefa).
Mesmo se após a linha .Close vc tivesse atribuído Set wdApp = Nothing, isso teria liberado a variável wdApp da memória, mas o aplicativo Word continuaria rodando. Então esvaziar a variável é necessário, mas não suficiente.
O que faltou ali foi Fechar o Word com o método Quit (wdApp.Quit)
- Não extinguir a variável de objeto wdApp após consumi-la:
Há uma certa polêmica em relação a isso, pois há os que defendem que seria desnecessário, uma vez que o próprio VBA libera as variáveis quando chega no End Sub/Function ou Exit Sub/Function. E há os que consideram uma boa prática fazê-lo sempre, geralmente no final da rotina ou após seu último uso (Set wdApp = Nothing). Em códigos pequenos, com baixa frequência de uso costumo dispensar. Mas nos de maior responsabilidade, sempre uso essa prática.
Então uma versão melhorada do código ficaria assim:
Sub AgoraMelhorou()
Dim i As Integer, wdApp As Object
Set wdApp = CreateObject("Word.Application")
For i = 1 To 3
With wdApp.Documents.Open("A:\Teste" & i & ".docx")
.Range.Text = "Olá Mundo" & i
.Close
End With
Next i
wdApp.Quit
Set wdApp = Nothing
End Sub
Postado : 23/07/2020 2:31 am