J'ai un bon niveau en VBA Excel, mais j'ai un de mes programmes qui s'exécute d'une façon que je ne comprends pas.
Contexte :
J'ai un classeur qui, pour se remplir, doit faire appel à un autre classeur.
Donc au début de ma macro, je déclare et j'affecte mes deux classeurs :
Code:
Dim Actif As Workbook 'Mon classeur
DimMacro As Workbook 'L'autre classeur
Set Actif = ThisWorkbook
Set Macro = Workbooks("Macro débitance 3.xls")
Le début de mon programme se présente ensuite de cette façon :
Code:
i = 4
While Range("A" & i) <> ""
Actif.Activate
Qusine = Cells(i, 2)
...
Suivent beaucoup d'instructions, puis je termine mon programme par :
Code:
...
i = i + 1
Wend
Macro.Close False
End Sub
Problème :
Avant de lancer mon programme, j'ouvre le classeur Macro.
Ensuite, si je lance l'exécution directement, il ne se passe rien, à part que le classeur Macro est fermé à la fin ; mais le corps de mon programme ne semble pas s'exécuter.
Avec une exécution en pas à pas, il se passe une chose étrange : lorsque j'exécute la ligne
Code:
While Range("A" & i) <> ""
qui est au début de mon code, au lieu de rentrer dans le While l'exécution saute directement à la ligne de fermeture du classeur Macro, puis il sort. Il ne passe même pas par le Wend.
J'ai vérifié, la cellule "A" & i n'est pas vide.
Je ne comprends pas
Le programme réagit de la même façon si je lui dis d'ouvrir lui même l'autre classeur
(Set Macro = ThisWorkbook.Path & "\Macro débitance 3.xls"
Mmh... Non, ce n'est pas le problème, parce que mon programme est rédigé dans le classeur Actif. Donc ThisWorkbook renvoie toujours à Actif.
J'ai quand même vérifié, effectivement ThisWorkbook correspond à Actif tout le long de l'exécution.
alors il faut explicitement faire référence au classeur et à la feuille dans:
Code:
Do While LeClasseur.Sheets("LaFeuille").Range("A" & i)<>""
Mais plutôt que de référencer les classeurs peut-être serait-il préférable de référencer les Feuilles. D'autant plus que la feuille active de l'un ou l'autre peut changer.
Code:
Dim Sh1 as WorkSheet, Sh2 as WorkSheet
Set Sh1=ThisWorkBook.Sheets("UneFeuille")
Set Sh2=Workbooks("AutreClasseur").Sheets("AutreFeuille")
Do While Sh1.Range("A" & I) <>""
Je viens enfin de trouver pourquoi ça ne marchait pas
En fait, j'ai voulu exécuter mon programme et tout d'un coup il a fonctionné normalement, il est rentré dans le While etc. alors que ça faisait une semaine qu'il plantait systématiquement !
Du coup j'ai voulu tester la réponse de Hasco et pendant l'exécution j'ai interrogé la fenêtre exécution (celle qu'on a par Ctrl+G)
C'est là que je me suis rendue compte que ThisWorkbook pointait effectivement sur Actif, mais que mon classeur et ma feuille actifs, eux, correspondaient au classeur Macro.
Or, la cellule A1 de Macro est vide...
Encore merci !!!
Je vais préciser mes instructions, à partir de maintenant !