VBA Excel et Access - Plantage mystère

Résolu/Fermé
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - Modifié par Phoenellion le 2/02/2012 à 06:22
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 - 8 févr. 2012 à 21:50
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
A voir également:

2 réponses

Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 33
3 févr. 2012 à 06:37
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
3 févr. 2012 à 09:04
Bonjour

envoie plutôt ton code (entre balises <>: voir bouton en haut à droite du message)
0
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 33
Modifié par Phoenellion le 7/02/2012 à 01:13
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 7/02/2012 à 09:18
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
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 33
Modifié par Phoenellion le 7/02/2012 à 22:31
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
Phoenellion Messages postés 116 Date d'inscription dimanche 14 septembre 2008 Statut Membre Dernière intervention 30 août 2012 33
7 févr. 2012 à 23:04
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
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
2 févr. 2012 à 09:01
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