VBA Excel et Access - Plantage mystère

Résolu
Phoenellion Messages postés 131 Statut Membre -  
Phoenellion Messages postés 131 Statut Membre -
Bonjour,

j'ai codé une petite macro qui s'exécute depuis access et effectue des manipulations dans excel et access, iren de méchant, si ce n'est la grandeur des bases de données.

la macro fonctionne très bien en pas à pas(F8), mais si je la lance la macro (F5) elle plante.
Cependant, si je l'initie avec F8 puis faits quelques lignes en pas à pas puis la laisse finir en appuyant sur F5, elle se termine sans aucun problème.

J'ai le même problème avec une aurtre macro, plus consistante celle là, qui ne s'exécute qu'en pas à pas, et l'astuce du F8 puis F5 ne fonctionne pas, donc je suis encore plus dépité.

besoin que je copie le code ou cette description évoque quelque chose à quelqu'un ?

@+
Phoe

2 réponses

  1. Phoenellion Messages postés 131 Statut Membre 33
     
    Bonjour,

    comment régler le problème d'après toi ? ajouter un wait ? Je sais que pour internet explorer (depuis excel) tu peux demander à la macro d'attendre la fin du chargement de la page
    Il y a quelque chose de similaire pour Excel et Access ?
    (pas trouvé pour l'instant)

    @+
    Phoe
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour

      envoie plutôt ton code (entre balises <>: voir bouton en haut à droite du message)
      0
    2. Phoenellion Messages postés 131 Statut Membre 33
       
      voici le code pour ce qui est de la petite macro.
      étrangement, elle vient de fonctionner sans problème...
      mais à toutes fins utiles, je péréfère que tu jettes un coup d'oeil, il y a surement des améliorations à apporter pour la rendre plus stable.

      Sub Prepa_Ent()  
      
      Set xlApp = CreateObject("Excel.Application")  
      
      Entrees = "Entrees.dbf"  
      Chemin_Gestock = "C:\Users\NHBC\Documents\Travaux Gestion Stocks\Compilations tables\AcImport\"  
      
      For Compteur = 1 To 10  
          If Compteur = 1 Then Store = "DC"  
          If Compteur = 2 Then Store = "BD"  
          If Compteur = 3 Then Store = "SDN"  
          If Compteur = 4 Then Store = "DT"  
          If Compteur = 5 Then Store = "KD"  
          If Compteur = 6 Then Store = "SDN-II"  
          If Compteur = 7 Then Store = "MB"  
          If Compteur = 8 Then Store = "MD"  
          If Compteur = 9 Then Store = "PBT"  
          If Compteur = 10 Then Store = "PD"  
      
          Chemin_DBF = "D:\DATA\XLPM2\" & Store & "\"  
          xlApp.Workbooks.Open FileName:=Chemin_DBF & Entrees  
          xlApp.DisplayAlerts = False  
          ColMax = Cells(1, 1).End(xlToRight).Column  
          y = 1  
          For z = 1 To ColMax  
              If Not xlApp.Cells(1, y) <> "" Then Exit For  
              If Not ((xlApp.Cells(1, y) = "NART") Or (xlApp.Cells(1, y) = "ARRIVEE")) Then  
              xlApp.Columns(y).Delete  
              Else: y = y + 1  
              End If  
          Next z  
      
          xlApp.Cells.Sort Key1:=Cells(1, 2), Order1:=xlDescending, Header:=xlYes  
          xlApp.Cells.Sort Key1:=Cells(1, 1), Order1:=xlAscending, Header:=xlYes  
      
          ' Mise en TabEntrée de Entrees  
          LigMax = xlApp.Cells(1, 1).End(xlDown).Row  
          ColMax = Cells(1, 1).End(xlToRight).Column  
          TabEntrée = Range(Cells(1, 1), Cells(LigMax, ColMax)).Value  
          ReDim TabSortie(LigMax, ColMax) As Variant  
          x2 = 1  
          For x1 = 1 To UBound(TabEntrée, 1) - 1  
              If Not TabEntrée(x1 + 1, 1) = TabEntrée(x1, 1) Then  
                  TabSortie(x2, 1) = TabEntrée(x1 + 1, 1)  
                  TabSortie(x2, 2) = TabEntrée(x1 + 1, 2)  
                  x2 = x2 + 1  
              End If  
          Next x1  
                
          ' Restitution de TabSortie  
          Range(Cells(2, 1), Cells(LigMax, ColMax)).Delete  
          Columns(1).NumberFormat = "@"  
          For x = 1 To UBound(TabSortie, 1)  
              If TabSortie(x, 1) = "" Then Exit For  
              For y = 1 To UBound(TabSortie, 2)  
                  Cells(x + 1, y).Value = TabSortie(x, y)  
              Next y  
          Next x  
          Cells(1, 1).Select  
          ActiveWorkbook.SaveAs FileName:=Chemin_Gestock & "AcImport Ent " & Store & ".xlsx"  
          ActiveWorkbook.Close  
          xlApp.Quit  
      Next Compteur  
      End Sub

      petite observations :
      - la partie "restitution TabSortie" est un peu lente vu que je complète les cellules une à une, il n'y a pas un moyen plus rapide ?
      - j'ai beau mettre un "xlApp.Quit", le processus excel ne se termine pas pour autant, je ne dois pas m'y prendre correctement...

      Merci d'avance pour ton aide
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour

      1/ Tu écris
      xlApp.DisplayAlerts = False mais tu ne le remets pas à false, donc Excel resta à DisplayAlert=false jusqu'à la fin de la session Office ==> risque probable de gros soucis
      D'autre part, à quoi sert ce DisplayAlert ?

      2/ restitution tabsortie
      tu peux te dispenser de boucle
      Cells(2,1).resize(ubound(tabsortie),2)=Tabsortie  
      ou peut-^tre (a voir si ...)  
      Cells(2,1).resize(ubound(tabsortie),2)=application.transpose(Tabsortie)


      3/ tu n'as pas mis le blocage du défilement de l'écran
      Application.screenupdating=false (tu n'as pas besoin de le remettre à true à la fin): gain de temps, confort de l'utilisateur

      4/ pas indispensable mais...
      plutôt que la série de If....Store, j'aurais écris
      store=choose(compteur,"DC","BD","SDN"...........)  
      


      5/quant à xlapp.quit, essaies avec set xlapp=nothing (pas sûr de moi) mais peut-^tre mettre cette ligne après next compteur
      ou alors mettre
      Set xlApp = CreateObject("Excel.Application") dans la boucle
      ce point n° 5 demande à faire des essais ( là aussi, pas sûr de moi)

      6/ enfin, déclare tes variables, surtout que tu manipules des données volumineuses d'après tes dires
      0
    4. Phoenellion Messages postés 131 Statut Membre 33
       
      Salut Michel, merci pour cette réponse !
      je vais aussi répondre point par point :
      1/ en effet, ici inutile, en fait j'ai pris l'habitude de déclarer ce paramètre car j'en ai régulièrement besoin. mais comme tu le dis, je peux m'en passer, donc je vais le virer.

      2/ J'avais essayé cells(2,1)=TabSortie mais en voyant ta proposition je comprends pourquoi ça ne marchait pas. En effet, la méthode est bien plus rapide, j'ai juste du modifier la boucle qui complète tabsortie car j'avais mal codé, j'écrivais dans les colonnes 1 et 2 de tabsortie alors qu'un variable tableau commence par 0... ah ces débutants !
      En tout cas merci pour le tuyau !

      3/ par défaut, le paramètre visible de l'application est false quand on la lance depuis un createobject, donc je pensais (peut être à tord) que je pouvais me dispenser du désactiver le screen updating.
      Je vais corriger, ça ne coute rien !

      4/ je prends !! j'ai ce gros if en début de chacune de mes macro et c'est ... indigeste à la longue.

      5/ j'ai fais divers essai dans ce sens déjà, ça ne change rien hélas... au mieux le processus excel se termine quand je ferme access, ce que ne me va pas car cette macro est la 4ème sub du module mais pas la dernière donc access continue de tourner après celle-ci.

      6/ tu l'as surement compris dans le 5, cette macro fait partie d'un module de plusieurs sub, et j'utilise toujours les mêmes variables, donc je les déclare en public et en option explicit.

      Je modifie mon code comme il faut, je refais des tests et je te tiens au jus
      merci encore
      @+
      Phoe
      0
    5. Phoenellion Messages postés 131 Statut Membre 33
       
      Me revoilà

      alors c'est très bizzare : en retirant xlApp.Displayalerts = False j'ai eu tout d'un coup beaucoup d'erreurs de syntaxe détectées dans l'éditeur de macro car j'oubliais de mettre "xlApp." devant des instructions Excel.

      J'ai donc corrigé toutes ces fautes et maintenant la macro s'exécute sans aucun problème.
      En plus avec tes auters astuce, la rapidité d'exécution est redoutable ! j'ai même plus le temps d'aller fumer !!

      alors dans quelle mesure l'instruction xlApp.Displayalerts = False pourtant donnée pour excel, avait un impacté sur Access et le déboggage, mystère absolu !
      0
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Suivant tes explications et une BD assez importante, tes macros ne laissent pas le temps nécessaire pour terminer les requêtes.
    A+
    -1