Excel plante après l'exécution du code
Bonjour,
J'ai un problème avec le programme que j'ai créé.
Il s'agit d'un code dans lequel je vais ouvrir une autre feuille Excel, récupérer des données, la refermer et recopier les données dans ma feuille de départ.
Le programme fonctionne très bien, cependant après l'exécution lorsque j'essaye d'écrire dans n'importe quelle cellule de ma feuille principale Excel plante sans que je ne sache pourquoi. J'ai un message du type:
« Excel a cessé de fonctionner. »
« Un problème a fait que le programme a cessé de fonctionner correctement. Windows va fermer le programme et vous avertit si une solution est disponible ».
J'ai cherché une solution dans plein d'autre forum mais je ne trouve pas
Ci dessous mon programme:
Sub donneeDAI()
Dim a, DLign, x2, workbk As String
Dim y, x1 As Long
Dim monfichier As String, chemin As String
Dim wbExcel As Workbook
DLign = Sheets("Suivi").Range("A" & Rows.Count).End(xlUp).Row
For y = 3 To DLign
a = Sheets("Suivi").Cells(y, 2).Value
monfichier = a & ".xlsx" 'le fichier que je veux ouvrir
chemin = "C:\Users\Documents\" 'le chemin où il se trouve
Application.ScreenUpdating = False
Set wbExcel = Workbooks.Open(chemin & monfichier)
x1 = Range("I31").Value 'prix tot
x2 = Range("J15").Value 'fournisseur
Workbooks(a & ".xlsx").Close False
With ActiveWorkbook
.Sheets("Suivi").Cells(y, 5).Value = x1
.Sheets("Suivi").Cells(y, 4).Value = x2
End With
Next y
End Sub
Merci d'avance de votre aide!
Bonjour
Une réponse à l'aveugle sans pouvoir tester...
En gros:
Libérer la variable objet wbExcel à chaque passage de la boucle pour éviter un empilement inutile
Ne pas bloquer l'écran dans une boucle (surtout sans le réactiver)
Correctement déclarer les variables..
Voir mes commentaires dans le code
Sub donneeDAI2()
Dim a As String, workbk As String
Dim DLign As Long, y As Long, x1 As Long
Dim monfichier As String, chemin As String, x2 As String
Dim wbExcel As Workbook
'//__ chaque variable doit être déclarée
'En écrivant :Dim a, DLign, x2, workbk As String
'Seule workbbk est string. Le reste est variant//__
DLign = Sheets("Suivi").Range("A" & Rows.Count).End(xlUp).Row
chemin = "C:\Users\Documents\" 'le chemin où il se trouve
'//__inutile de valoriser la variable à l'intérieur de la boucle//__
Application.ScreenUpdating = False
'//__ Inutile de bloquer l'écran plusieurs fois
'en mettant la ligne dans une boucle//__
For y = 3 To DLign
a = Sheets("Suivi").Cells(y, 2).Value
monfichier = a & ".xlsx" 'le fichier que je veux ouvrir
Set wbExcel = Workbooks.Open(chemin & monfichier)
x1 = Range("I31").Value 'prix tot
x2 = Range("J15").Value 'fournisseur
wbExcel.Close False
Set wbExcel = Nothing ' //__libération de la variable//__
With ActiveWorkbook.Sheets("Suivi")
.Cells(y, 5).Value = x1
.Cells(y, 4).Value = x2
End With
Next y
Application.ScreenUpdating = True
'//__Il est toujours préférable de remettre en place ce que l'on enlève//__
End SubCordialement
bonjour,
Indépendamment de ce qui est dit plus haut, on ne sait pas combien de lignes sont à traiter dans la boucle et peut importe mais :
Faire une boucle For... Next dans laquelle on risque d'ouvrir et de refermer 25 000 fois le même fichier est quelque peu... déraisonnable !
Je ne m'étonne pas dans ces conditions qu'Excel couine un peu !
Il eut été nettement préférable d'ouvrir le fichier avant la boucle et de le refermer après le Next...
A+
Re
Bonjour Galopin01
Bien d'accord, mais je pense que la boucle ouvre plusieurs fichiers:
For y = 3 To DLign
a = Sheets("Suivi").Cells(y, 2).Value
monfichier = a & ".xlsx" 'le fichier que je veux ouvrirLe y incrémente la ligne de la colonne B
Cordialement
C'est en effet un aspect qui m'avait échappé mais -bien que je ne sois pas du tout spécialiste de ce genre de gymnastique- je pense que c'est encore pire ! Parce que ouvrir 27 000 fichiers ni même 150 dans une boucle, je ne m'y risquerai pas... Il me semble qu'il y bien d'autres méthodes pour lire 2 cellules d'un classeur sans les ouvrir tous...
Bon enfin je dis ça j'ai rien dit : Si ta correction suffit c'est très bien. Mais je crains fort que...
A+
Bonjour à tous
personnellement j'utilisais la connexion sur fichier fermé pour récupérer le contenu de 2/3 cellules... dans un fichier appli diffusé à bon nombre d'utilisateurs... j'avais faits mes tests pour un fonctionnement sur office 2007-2010-2013 64b, et tout fonctionnait...
cette année le même fichier ne tourne pas sur un excel 2016..... et n'ayant pas moi même la version 2016 j'ai pas pu faire de dépannage de mon fichier....
donc même si c'est plus lent (même si dans certains cas j'attaque un dossier contenant plus de 1200 fichiers) je suis revenu à un fonctionnement archaïque c'est a dire : l'ouverture/copie/fermeture fichier car au moins cela marche quelque soit version d'office..
mais cela a le mérite de fonctionner tout le temps....
Fred
bonjour
pour des "copies" de 1 à 10 fichiers, toujours les mêmes, il est très facile d'utiliser de simples = dans les cellules
ce sont des "liaisons" au sens d'Excel
fiable, ultra simple, facile à modifier si on change les fichiers de place ou qu'on les renomme
pas de formule, pas de VBA
exempe :
un fichier BASE
un fichier EXPLOIT (exploitation), dans lequel on crée un onglet MIR (miroir de BASE) : copier tout BASE (disons la zone qui contient les données et encore plus de lignes si tu penses que BASE va grandir au fil des années) et aller en A1 de MIR et collage spécial avec liaison.
c'est tout !
Bonjour tous le monde,
Tout d'abord merci beaucoup pour vos réponses!
Effectivement il s'agit d'une boucle qui ouvre des fichiers au fur et à mesure (ce ne sont pas les mêmes fichiers à chaque fois) et le nom du fichier se trouve sur la colonne B de la feuille Excel et étant donné que ce sont des Devis il peut y en avoir pas mal.
Merci Efgé pour tes conseils, je les ai intégré à mon code, cependant le problème persiste.
Je me demandais s'il y avait un complémentaire VBA à activer lorsqu'on ouvre un fichier dans un code.
Ou si vous connaissez une autre méthode pour récupérer des données dans d'autres feuilles Excel (fermées).
Enfin bref je ne sais toujours pas pourquoi j'ai ce problème.