IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[BUG] Macros "imbriquées"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Par défaut [BUG] Macros "imbriquées"
    Bonjour Forum,

    J'ai un bug dans une de mes macros et je me demande si c'est corrigeable ou si c'est l'idée qui est carrément mauvaise...

    Je m'explique :

    - J'ai trois fichiers : BdD.xls, SuiviDOC.xls et RechercheCR.xls
    - Dans BdD.xls une macro avant fermeture appelle SuiviDOC.xls et y reporte des infos

    Voici une partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ' Private Sub Workbook_Open()
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
    Dim BDD As Workbook
    Set BDD = ActiveWorkbook
    BDD.Sheets(1).Activate
    Dim dlb As Integer
        dlb = BDD.Sheets(1).Range("A65536").End(xlUp).Row
     
    Application.DisplayAlerts = False
     
    Dim TABL As Workbook
    Set TABL = Workbooks.Open("T:\CHSF_Conception\Logiciels\SuiviDOC\SuiviDOC.xls")
    Dim dlt As Integer
       dlt = TABL.Sheets(1).Range("A65536").End(xlUp).Row + 1
     
     
    Dim cex As Boolean
    cex = True
     
    For j = 9 To dlt
    If (TABL.Sheets(1).Cells(j, 4) = BDD.Sheets(1).Cells(dlb, 4) & " n°" & BDD.Sheets(1).Cells(dlb, 11) And TABL.Sheets(1).Cells(j, 13) = BDD.Sheets(1).Cells(dlb, 6)) Then
    cex = False
    End If
    Next j
     
    If cex = True Then
            TABL.Sheets(1).Cells(dlt, 1) = BDD.Sheets(1).Cells(dlb, 7)
            TABL.Sheets(1).Cells(dlt, 2) = BDD.Sheets(1).Cells(dlb, 10)
     ' (...)
    End If
     
    TABL.Activate
    Application.Save
    TABL.Close
    End Sub
    Important : lorsque je lance à la main BdD et que je le ferme, la macro fonctionne parfaitement


    - Ma deuxième macro se trouve dans un formulaire de RechercheCR et appelle BdD pour y reporter des infos (ce triple appel est dû au fait que les fichiers sont publics et que différents intervenants sont susceptibles de changer différentes infos à différents stades du projet). Voici un extrait du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Private Sub CommandButton1_Click()
     
    Dim RECH As Workbook
    Set RECH = ActiveWorkbook
     
        Dim ProjectPath$
        ProjectPath = ActiveWorkbook.Path
     
         Application.DisplayAlerts = False
    ' (...)
     
    ' ETAT est un classeur associé à la base donnée et qui stocke les données de suivi
    Dim ETAT As Workbook
    Set ETAT = Workbooks.Open(ProjectPath & "\BdD.xls")
     
    ' (...)
    Dim lig As Integer
    lig = 6
        ETAT.Sheets(1).Cells(lig, 1).Value = lig - 1
    '(...)
     
    ETAT.Activate
    ETAT.Close
     
     
    SIGNET.Hide
    End Sub
    Le problème : quand j'execute cette macro, ça bug dans la macro BeforeClose() de la BdD.xls à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     dlt = TABL.Sheets(1).Range("A65536").End(xlUp).Row + 1
    avec ce msg d'erreur : variable d'objet ou variable de bloc With non définie
    ma question : peut-on corriger le problème ou est-ce la philosophie d'une macro BeforeClose() appellé par un UserForm dans un autre fichier qui coince?

    En vous remerciant,
    Marc

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TABL.activate
    With TABL.Sheets(1)
        dlt = .Range("A65536").End(xlUp).Row + 1
    End with
    A tout hasard, comme toi je ne comprends pas mais là, VBA aura le with qu'il réclame...
    Si ce n'est pas ça, tu dis, je ferai un test
    A+

    Teste aussi sans TABL.activate

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Par défaut
    Bonjour ousk

    Edit : après test de ta solution le bug est le même

    Sinon je pensais à une hypothèse : est-il possible que le programme n'attende pas la fin de l'execution du BeforeClode de BdD pour terminer la macro du Userform de RecherCR et donc planter?

    Edit 2 : je n'ai pas recopié tout mon code mais dans le userform de RechercheCR il y a un bloc With qui commande l'envoi d'un mail d'où mon hypothèse. Je vais tenter un temporisateur dans RechercheCR

    Edit 3 : après avoir mis un temporisateur après le ETAT.Close ça plante exactement pareil d'où mon hyptohèse qui tombe à la flotte

    j'oubliais un détail pourtant important : quand je passe la macro de BdD en excution automatique au démarrage du fichier et non à la fermeture, ça marche sans problème.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bon, je n'ai pas étudié ton code pour savoir exactement ce qu'il fait mais ton idée de tempo n'est pas si mauvaise que ça... J'explique.
    Quand tu ouvres, fermes, enregistres un fichier, le système a besoin d'un délai. Or, pendant ce temps là, la macro se poursuit. Pour pallier le pb, on utilise DoEvents placé après chaque intervention impliquant le system
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Workbooks.Open ....
    DoEvents
    ActiveWorkbook.save
    DoEvents
    ActiveWorkbook.Close trou ou false...
    DoEvents
    etc.
    Alors teste déjà ça.
    Je n'ai pas compris comment un code destiné à être placé à la fermeture d'un fichier pouvait fonctionner "parfaitement" à l'ouverture On en voit de ces choses sur ce forum
    A+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Par défaut
    Re,

    Alors, avec les DoEvents = même bug

    Ce que je voulais dire c'est qu'au démarrage, la macro fait la même chose (et fonctionne bien) mis à part qu'elle n'indice que les modifications faites dans RechercheCR lors du précédant enregistrement.
    Avec la macro au démarrage plutôt qu'à la fermeture, la BdD est mise à jour avec un train de retard si tu veux... mais elle marche

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je n'ai aucune idée, alors je vais t'en donner une...
    Met cancel = True
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = true
    'ton code
    Il y a un truc qui m'intrigue et que je n'avais pas vu. Tu mets
    TABL.Activate
    Application.Save
    TABL.Close
    C'est l'appli Excel que tu veux enregistrer ?
    Pour enregistrer un fichier lors de sa fermeture tu peux mettre simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TABL.Activate
    TABL.Close True
    Et je ne pense pas que "TABL.Activate" soit nécessaire ici...
    Teste déjà ça

Discussions similaires

  1. Gestion de quotes imbriquées
    Par arthur57 dans le forum Langage
    Réponses: 5
    Dernier message: 26/01/2015, 15h00
  2. Résolution macro entre simples quotes
    Par Filippo dans le forum Macro
    Réponses: 8
    Dernier message: 22/04/2010, 15h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo