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 :

Conditionner l'utilisation d'une Sub


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut Conditionner l'utilisation d'une Sub
    Bonjour à tous,

    Je voudrais savoir si il est possible de faire quelque chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub 1
    'instructions
    Si Sub 2 est vraie
    'instructions
    fin de si[/INDENT]
    'instructions
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub 2
     
    'instructions
     
    End Sub 2
    Si on peut le faire, pouvez-vous me dire quelle est la syntaxe pour la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Si Sub 2 est vraie
    'Instructions
    fin de si
    J'ai essayé plusieurs syntaxes et ça ne fonctionne jamais !

    Merci d'avance.

    Alfred

  2. #2
    Membre éclairé Avatar de Runsh63
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Mars 2011
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 476
    Par défaut
    Bonjour Alfred23,

    Le mieux à mon avis est encore de passer par l'appel de fonctions.

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Bonjour Runsh,

    Merci pour ta réponse.

    Est-ce que tu peux m'en dire un peu plus sur l'appel de fonction ?

    Mon code est déjà écrit et j'ai mes deux procédures ; la seconde est un BoutonClic, et je voudrais remettre une variable à zéro dans la première procédure SI la seconde procédure est exécutée.

    Cordialement,
    Alfred

  4. #4
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut
    Bonjour Alfred,

    Pour completer ce que dis très justement Runsh63 :
    En terme d'analyse, la proposition 'Si Sub 2 est vraie' est incohérente car par nature une procédure ne renvoit rien , elle permet d'exécuter un traitement . A la limite la procédure peut mettre à jour une variable globale ( booleen dans ton cas ) .

    La fonction renvoit quelquechose , elle peut renvoyer par exemple un boolean donnant la valeur d'un test.

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Merci pour ces explications CodeFacile !

    Je vais essayer d'être plus précis dans ma demande parce que je ne sais pas si ce que je veux faire est faisable.

    Voici mon 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Dim Tableau(1 To 10, 1 To 2)
    Dim I As Integer
     
     
    Sub Worksheet_change(ByVal Target As Range)
     
        'On déclare la variable ligneModif
        Dim ligneModif As Long
     
        'Si on modifie une cellule de la colonne 'C' (N° 3)
        If Target.Column = 3 Then
     
            'On récupère le numéro de ligne de la cellule modifiée
            ligneModif = Target.Row
     
            I = I + 1
     
            'Si il y a plus de 6 lignes de modifiées
            If I = 6 Then
     
                If MsgBox("Vous avez modifié 6 lignes. Veuillez recopier ces données sinon elles seront perdues.", vbOKOnly, vbinfo) = vbOK Then
                    'On met les données de la dernière ligne modifiée dans le tableau
                    Tableau(I, 1) = Range("A" & ligneModif).Value
                    Tableau(I, 2) = Range("C" & ligneModif).Value
     
                    I = 0
                    Exit Sub
                End If
     
            End If
     
            'On met les données de la ligne modifiée dans le tableau
            Tableau(I, 1) = Range("A" & ligneModif).Value
            Tableau(I, 2) = Range("C" & ligneModif).Value
     
     
        End If
     
     
    End Sub
     
     
    Sub BoutonClic()
     
    Dim I As Integer
     
    'On ouvre le fichier dans lequel on veut coller les données copiées
    Workbooks.Open ThisWorkbook.Path & "\Fichier1.xls"
     
    'On restitue les données dans la feuille excel
    For I = 1 To UBound(Tableau, 1)
     
        With Sheets("Feuil1").UsedRange: NoDeLaDernLig = .Cells(.Rows.Count, .Columns.Count).Row: End With
     
        Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 4).Value = Tableau(I, 1)
        Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 2).Value = Tableau(I, 2)
     
    Next I
     
    Erase Tableau()
     
    I = 0
     
     
    End Sub
    Et voici mon problème :
    Si je modifie 6 lignes d'un coup, I est réinitialisé à zéro : tout va bien !
    Mais si je modifie seulement 2 lignes et que j'envoie les données par l'intermédiaire de la procédure BoutonClic, I ne se réinitialise pas ! De fait, lorsque je modifie à nouveau des lignes, mon message apparait non pas au bout de 6 lignes modifiées, mais dès la 4ème ligne modifiée (2+4=6).
    Je voudrais que mon I s'initialise à zéro chaque fois que les données sont envoyées par la procédure BoutonClic.

    Cordialement,
    Alfred

  6. #6
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Bonjour à tous !

    Souhaitez-vous que je reformule ma question ou que j'apporte des précisions ? N'hésitez pas à me dire si je ne suis pas clair !

    Bonne journée.

    Cordialement,
    Alfred

  7. #7
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour,

    je ne comprend personnellement pas l'évolution de tes explications et de ta demande qui part d'une Sub avec valeur de retour à vrai pour arriver avec une variable I à remettre à 0 en cas d'appel par Bouton_clic , alors qu'à mon sens à chaque exécution de Worksheet_Change, I est remis à zéro puisqu'il est défini localement dans cette procédure.

    Je t'invite à t'interroger d'abord sur ton objectif, formulable en Français sans nécessairement du code, et à répondre par une formulation aussi claire que possible de ton besoin.

    Un problème mal défini où une analyse inaboutie ne conduit jamais à une solution viable.

    pour ton info une appel de fonction est qqchose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function tafonction( param_1 as type_param_1, param_2 as Type_param_2, ....) as Type_fonction
    et au cas où tu voudrais le tenter, Worksheet_Change est un Sub prédéfinie et ne peut pas être convertie en Fonction.

    Mais .... la ruse est l'arme du persévérant...

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    C'est un problème de chevauchement : tu utilises I à la fois comme variable globale(définie pour tout ton module, en haut), et comme variable locale de bouton_clic(définie au début de bouton_clic).

    Ca ne peut pas marcher. Tu dois renommer ta variable globale, par exemple I2, et utiliser I2 partout ou tu t'en sert. Un truc du genre :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Dim Tableau(1 To 10, 1 To 2)
    Dim I2 As Integer
     
     
    Sub Worksheet_change(ByVal Target As Range)
     
        'On déclare la variable ligneModif
        Dim ligneModif As Long
     
        'Si on modifie une cellule de la colonne 'C' (N° 3)
        If Target.Column = 3 Then
     
            'On récupère le numéro de ligne de la cellule modifiée
            ligneModif = Target.Row
     
            I2 = I2 + 1
     
            'Si il y a plus de 6 lignes de modifiées
            If I2 = 6 Then
     
                If MsgBox("Vous avez modifié 6 lignes. Veuillez recopier ces données sinon elles seront perdues.", vbOKOnly, vbinfo) = vbOK Then
                    'On met les données de la dernière ligne modifiée dans le tableau
                    Tableau(I2, 1) = Range("A" & ligneModif).Value
                    Tableau(I2, 2) = Range("C" & ligneModif).Value
     
                    I2 = 0
                    Exit Sub
                End If
     
            End If
     
            'On met les données de la ligne modifiée dans le tableau
            Tableau(I2, 1) = Range("A" & ligneModif).Value
            Tableau(I2, 2) = Range("C" & ligneModif).Value
     
     
        End If
     
     
    End Sub
     
     
    Sub BoutonClic()
     
    Dim I As Integer
     
    'On ouvre le fichier dans lequel on veut coller les données copiées
    Workbooks.Open ThisWorkbook.Path & "\Fichier1.xls"
     
    'On restitue les données dans la feuille excel
    For I = 1 To UBound(Tableau, 1)
     
        With Sheets("Feuil1").UsedRange: NoDeLaDernLig = .Cells(.Rows.Count, .Columns.Count).Row: End With
     
        Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 4).Value = Tableau(I, 1)
        Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 2).Value = Tableau(I, 2)
     
    Next I
     
    Erase Tableau()
     
    I2 = 0
     
     
    End Sub
    non testé, il y a probablement des améliorations à faire.....


    EDIT : grillé. Globalement d'accord de toutes façons, l'important est de savoir ce que l'on veut faire exactement. Et puis I et I2, c'est pas propre, mieux vaut des noms parlants, comme LigneTableau et LigneActuelle.....

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/07/2011, 16h10
  2. Réponses: 3
    Dernier message: 26/09/2009, 00h06
  3. ADODB.Command utiliser une sub d'un module Access
    Par didoboy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/09/2009, 14h51
  4. Réponses: 3
    Dernier message: 17/04/2008, 15h56
  5. Réponses: 2
    Dernier message: 07/08/2007, 09h35

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