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 :

Mélange d'appels "Call" [XL-2000]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 545
    Par défaut Mélange d'appels "Call"
    Bonjour,
    Je travaille sur une "application" (d'amateur) qui compose de la musique. Ma musique passe d'une tonalité à l'autre (exemple: fa, sib, fa, sib, mib, sib, fa).
    A l'arrivée, il manque du texte (musical) et je soupçonne qu'au retour d'un "Call" ma moulinette revient à un autre appel Call homonyme. Par exemple, après le premier appel à fa, au retour le programme confond (je pense) ce premier appel à fa avec l'un des autres et saute ce qui se trouve entre les deux.
    Deux questions: est-ce que mon hypothèse de "mélange" des Call lors du retour est juste ?
    Si oui, comment éviter cette confusion entre appels identiques ?
    Extrait du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Call Module2.cree_motifs_soprano1_doM
    Call Module4.cree_motifs_soprano1_faM
    Call Module2.cree_motifs_soprano2_doM
    Call Module4.cree_motifs_soprano2_faM
    Call Module2.cree_motifs_soprano3_doM
    Call Module4.cree_motifs_soprano3_faM
    Call Module2.cree_motifs_soprano4_doM
    Call Module4.cree_motifs_soprano4_faM
    Ce code résulte d'une transformation consistant à modifier les sub homonymes pour éviter le "mélange" mais ça alourdit énormément le programme (exemple ci-dessus: pour la même tonalité de do majeur on a 3 exemplaires de la même sub numérotées différemment)
    J'ai pensé qu'au retour du deuxième appel à fa M(ajeur) (ligne 3) le retour se faisaitt au mauvais endroit (ligne 5 ou 7), d'où la modification opérée sur ce code.
    Merci d'avance de vos lumières.
    Et tous mes voeux pour 2017
    Cordialement
    Pierre
    P.S. Je sais que ce type d'usage de VBA est contraire aux principes énoncés dans la discussion "VBA est-il un langage professionnel" mais je suis (très modestement) amateur et en outre je ne connais pas d'autre langage !

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Bonjour, tu devrais testé le mode pas à pas (F8) pour voir si ton programme "saute" des call

  3. #3
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 545
    Par défaut melange-dappels-call
    Bonjour Halaster et merci,
    je voulais justement éviter ça si possible parce que le fichier fait près de 4000 K, ce qui représente une montagne de lignes de code à parcourir avec F8, mais s'il n'y a que ce moyen...
    Merci et bonne soirée
    Pierre
    J'aime bien ton leit-motiv. Par où on passe pour aller en Théorie ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 35
    Par défaut Stop et Debug.Print
    Bonjour pierruel,

    Vous pouvez utiliser l'instruction Stop pour arrêter le code à un endroit précis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Exemple()
     
        Stop
     
    End Sub
    Sinon n'hésitez par à utiliser la fenêtre d'exécution (affichage -> fenêtre exécution) pour y écrire du contenu lors de l'exécution du programme, afin de détecter le lieu de l’erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Exemple_Debug()
     
        Debug.Print "Salut"
     
    End Sub

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par pierruel Voir le message
    Bonjour,
    est-ce que mon hypothèse de "mélange" des Call lors du retour est juste ?
    Je ne pense pas. Ceci dit VB6-VBA et Visual Studio .net ont une fenêtre (très) sous-utilisée; du moins à mon avis. Tellement que je ne me souviens pas d'avoir "entendu" personne en parler sur Développez. Il s'agit de la Pile des appels, qui permet de retracer, au moins en partie (pas dans le code-machine) la séquence d'exécution des instructions du programme, et, en quelque sorte, refaire le chemin parcouru en sens contraire.

    Tu peux aussi essayer le "truc" suivant:

    TU mets un point d'arrêt, (F9) sur tes End Sub et tu fais un bout au pas-à-pas pour voir à quel endroit tu aboutis en sortant de la sub.

    Des boutons, à avoir sur ta barre d'outils. Au besoin, tu les rajoutes.

    Exécuter jusqu'au curseur. (Place un point d'arrêt temporaire sur la ligne, ou se trouve ton curseur.) Cela fonctionne même quand tu es arrêté sur un point d'arrêt et que tu veux voir ce qui s'est passé 5 ou 6 lignes plus bas, sans les faire au pas-à-pas.

    Définir l'Instruction suivante. Permet de pas exécuter quelques lignes et de repartir plus loin. Ou encore, de reprendre une boucle à zéro sans relancer tout le programme.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Mon intervention s'arrêtera à rappeler que VBA est tel qu'il est impossible de "passer la main" à une procédure n+2 depuis une procédure n tant que la procédure n+1 n'est pas arrivée à son terme.
    Maintenant :! nous voyons bien que sont appelées tour à tour des procédures n, puis n+1, puis n+2, etc ..., mais nous ne voyons pas ce qu'elles font. Il est clair que si l'une ou plusieurs d'entre elles reprend tout depuis le début, TOUT est alors repris depuis ce début. Et je vois vraiment mal que l'on puisse "reprendre" autrement de manière simple et sans "repère" préalablement fixé et passé en paramètre d'une procédure à l'autre.
    Si ce que je dis est du chinois, disons que c'est du chinois et n'en parlons plus.

    J'ajoute ceci (sait-on jamais ..) à mon message précédent avant d'aller faire dodo :
    Si les modifications apportées par la procédure n+ 1 sont telles que les "critères" ou "occurences" conditionnels d'exécution de la procédure n+2 ne sont pas vérifiés, on passera tout ,naturellement "en silence" à la procédure n+ 3 (et pour cause ..).
    Bonne nuit.

  7. #7
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 545
    Par défaut Mélange d'appels "Call"
    Bonsoir,
    Voilà toute une série de nouveaux intervenants, merci à elles eux tous. Dans l'intervalle, j'ai suivi le conseil d'Halaster et trouvé une masse d'erreurs que j'ai presque fini de corriger. Si ça coince encore j'appliquerai les autres méthodes, dont je connais la plupart mais un merci particulier à ClémentMarcotte pour la mention de la pile des appels à laquelle en effet je ne pense jamais.
    Je donne des nouvelles dès que je suis tiré d'affaire.
    Dans un second temps je tâcherait de simplifier tout mon programme, car je pense en effet que ClémentMarcotte a raison et que le retour des Call se fait exactement à l'endroit d'où est parti chaque appel. J'ai pu vérifier quelques cas.
    A unparia, je dis ceci: j'ai lu ton chinois et suis d'un avis opposé sur la possibilité de passer la main à une procédure située dans un autre module: je l'ai fait sans problème dans ce cas précis (mais peut-être que je ne comprends pas si bien que ça ce que tu as voulu dire
    En tout cas les apports de ce forum sont souvent excellents, comme ce soir.
    Cordialement
    Pierre

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    mais peut-être que je ne comprends pas si bien que ça ce que tu as voulu dire
    enlève le "peut-être que" et ce sera exact.
    possibilité de passer la main à une procédure située dans un autre module: je l'ai fait sans problème
    Bien évidemment. Et où ai-je dit le contraire ? J'ai dit :
    VBA est tel qu'il est impossible de "passer la main" à une procédure n+2 depuis une procédure n tant que la procédure n+1 n'est pas arrivée à son terme.
    Si tu as réussi à le faire : montre-nous donc une petite démo (code) de la chose

  9. #9
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour

    je comprend pas ta réflexion unparia
    Citation Envoyé par unparia Voir le message
    VBA est tel qu'il est impossible de "passer la main" à une procédure n+2 depuis une procédure n tant que la procédure n+1 n'est pas arrivée à son terme.
    Si tu as réussi à le faire : montre-nous donc une petite démo (code) de la chose
    Voici un code (a mettre dans un module quelconque) qui permet la chose ou alors j'ai pas compris ce que tu voulais dire

    Lancer Macro_Niv0
    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
    37
    38
    39
    40
    41
    Option Explicit
     
    Public Titre As String
    Public NomMacro As String
    Public Niv As Byte
     
     
    Sub Macro_Niv0()
        Titre = "test 3 niveaux"
        NomMacro = "Macro_Niv0"
        Niv = 0
        Call Macro_Niv1
        NomMacro = "Macro_Niv0"
        MsgBox "Vous avez quitté le Niveau " & Niv & vbCrLf & "Vous êtes dans la macro " & NomMacro, , Titre
     
    End Sub
     
     
    Sub Macro_Niv1()
        Niv = Niv + 1
        NomMacro = "Macro_Niv1"
        Call Macro_Niv2
        NomMacro = "Macro_Niv1"
        MsgBox "Vous avez quitté le Niveau " & Niv & vbCrLf & "Vous êtes dans la macro " & NomMacro, , Titre
        Niv = Niv - 1
    End Sub
     
    Sub Macro_Niv2()
        Niv = Niv + 1
        NomMacro = "Macro_Niv2"
        Call Macro_Niv3
        NomMacro = "Macro_Niv2"
        MsgBox "Vous avez quitté le Niveau " & Niv & vbCrLf & "Vous êtes dans la macro " & NomMacro, , Titre
        Niv = Niv - 1
    End Sub
     
    Sub Macro_Niv3()
        Niv = Niv + 1
        NomMacro = "Macro_Niv3"
        MsgBox "Vous êtes au niveau le plus haut niveau " & Niv & " dans la macro " & NomMacro, , Titre
    End Sub

    Je pense qu'effectivement j'ai mal lu et pas compris dsl

    et oui je suis d'accord avec toi

+ Répondre à la discussion
Cette discussion est résolue.

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