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 Sub

Cordialement

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 ouvrir

Le 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.

Rechercher des sujets similaires à "plante execution code"