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 :

Mettre une condition pour eviter une erreur


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut Mettre une condition pour eviter une erreur
    Bonsoir à tous,

    J'ai un bouton sur lequel est attaché ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Private Sub Bouton_Click()
        If procedureEnCours Then
           Code1
            procedureEnCours = False
            Bouton.Caption = "Ouvrir le fichier"
        Else
           Code2
            procedureEnCours = True
            Bouton.Caption = "Modifications terminées"
        End If
    End Sub
    procedureEnCours est égale à vrai au départ.

    Donc lorsque je click sur le bouton.
    Le Code1 s’exécute.

    Je voudrais que dès lors qu'il y a une erreur et que le code 1 ne s’exécute pas jusqu’au bout, l'inscription du bouton reste "Ouvrir le fichier"(Bouton.Caption = "Ouvrir le fichier").

    Sauriez vous comment je dois m'y prendre, s'il vous plaît.
    Cordialement.

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonsoir,
    exemple ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub nanana()
    Bouton.Caption = "Modifications en cours"
    ...ton code
    Bouton.Caption = "Modifications terminées"
    end sub
    ça ne suffirait pas ?
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut
    Merci casefayere.

    Non.
    En fait lorsque je click pour une première fois sur le bouton.
    Le code 1 doit s'effectuer.
    Entre autre, je choisit un fichier à ouvrir et je le manipule.
    Mais si par exemple j'annule, le statut du bouton passe quand même à "Modifications terminées" et procedureEnCours passe à False.

    Je voudrais mettre une condition.
    Genre si le code1 ne s’exécute pas jusqu'au bout alors procedureEnCours reste à True et quand je reclickerais sur le bouton, ce ne sera pas le code 1 mais bien le code 2 qui sera exécuté.

    code 1 et code 2 sont des procédures que j'ai dans d'autre module.

    Cordialement.

  4. #4
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Excuses-moi de ne pas comprendre, mais :
    Mais si par exemple j'annule,...
    quelle est ta procédure pour annuler (éventuellement) ?
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut
    Voici un fichier Test,

    Ce sera beaucoup plus parlant.
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    C'est un peu tordu à mon sens comme façon de procéder mais bon, je ne saurai donner d'avis personnel.

    J'ai ajouté une variable publique booléenne Ouvert
    Module:
    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
    Public ProcedureEnCours As Boolean
    Public ClasseurOuvert As String
    Public Ouvert As Boolean
    'Chemin initial proposé à l'utilisateur quand il ouvre le fichier
    Private Const CHEMIN_FICHIERS As String = "C:\Documents and Settings\llolekal\Bureau"    'A PERSONNALISER !
     
     
    'Première partie de la macro
    'Ouverture du fichier, préparation et choix pour l'utilisateur des catégories
    Public Sub Code1()
    Dim wb1 As Workbook
    Dim ws1 As Worksheet
     
    Ouvert = OuvertureFichier(wb1, CHEMIN_FICHIERS)
    If Ouvert Then
        ClasseurOuvert = wb1.Name
        Set ws1 = wb1.Worksheets(1)
        MsgBox ClasseurOuvert
    End If
    End Sub
     
    Public Sub Code2()
     
    MsgBox "Voilà"
    End Sub
     
    Public Function OuvertureFichier(ByRef Wb As Workbook, ByVal CheminInitial As String) As Boolean
     
    With Application.FileDialog(msoFileDialogOpen)
        .Filters.Clear
        .Filters.Add "Fichier Excel", "*.xls; *.xlsx; *.xlsm"
        .AllowMultiSelect = False
        .InitialFileName = CheminInitial
        .Show
        If .SelectedItems.Count = 1 Then
            OuvertureFichier = True
            Set Wb = Workbooks.Open(.SelectedItems(1))
        Else
            MsgBox "Erreur à l'ouverture du fichier"
        End If
    End With
    End Function
    Bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub btnExecution_Click()
     
    If ProcedureEnCours Then
        Code2
        ProcedureEnCours = False
        btnExecution.Caption = "Ouvrir le fichier"
    Else
        Code1
        If Ouvert Then
            ProcedureEnCours = True
            btnExecution.Caption = "Modifications terminées"
        End If
    End If
    End Sub
    PS: J'ai pas trop cherché à comprendre le pourquoi
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut
    Bonjour à tous,

    Merci Mercadog.

    Mais la solution de me convient pas, dans le code1 ainsi que dans le code 2 il y a beaucoup de code.

    Est ce possible de mettre une condition le fait ou non que les codes 1 et 2 s’exécute jusqu'à la fin, dans quel cas je change mon Statut et la valeur de ma variable procedureEnCours.

    Cordialement.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 760
    Points : 28 618
    Points
    28 618
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'utilisation de la variable booléenne est la solution.
    La proposition de Mercatog est celle que j'aurais préconisée quant à tes procédures Code1 & Code2 tu écris ce que tu veux à l'intérieur. Ce n'est qu'un exemple qu'il t'a montré.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut
    Merci de ta réponse Corona.

    Voici le fichier complet en pièce jointe.
    Car je n'y parvient pas.

    Cordialement.

    Bonjour à tous,

    Quelqu'un aurait t-il une idée.
    Comme vous voyez dans le classeur ci dessous, lorsque l'on "click" sur le bouton, même si la première partie ne s’exécute, le statut est changé.

    Je voudrais éviter cela.
    Que si la première partie ne s’exécute pas correctement, le statut ne change pas et que lorsque l'on "reclickera" sur le bouton, ce soit la première partie qui soit appelé et non la deuxième.

    Cordialement.
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu avais la solution mais ne voulais peut être l'adapter pour ton code.
    cette fois, je le ferai

    Ci-joint les parties du code à changer
    1.
    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
    Public procedureEnCours As Boolean
    Public classeurOuvert As String
    Public Ouvert As Boolean
    'Chemin initial proposé à l'utilisateur quand il ouvre le fichier
    Private Const CHEMIN_FICHIERS As String = "D:\DONNEES"    'A PERSONNALISER !
    'La liste des choix pour l'utilisateur
    Private Const LISTE_DEROULANTE As String = "FRUIT,VIENNOISERIE,VIANDE"    'A PERSONNALISER !
     
    'Première partie de la macro
    'Ouverture du fichier, préparation et choix pour l'utilisateur des catégories
    Public Sub SuiviCash1()
    Dim wbExterne As Workbook
    Dim wsExterne As Worksheet
    Dim nbLignes As Long
    Dim typeObjet As String
    Dim rgCorres As Range
    Dim i As Long
     
    'Ouverture du fichier
    Ouvert = OuvertureFichier(wbExterne, CHEMIN_FICHIERS)
    If Ouvert Then
        classeurOuvert = wbExterne.Name
        Set wsExterne = wbExterne.Worksheets(1)
     
        'Compteur du nombre de ligne à balayer (ie: cellules pleines)
        nbLignes = wsExterne.Cells(65536, "C").End(xlUp).Row
     
        'On initialise la table de correspondance
        InitialiserTableCorrespondance rgCorres
     
        For i = 6 To nbLignes                        'Pour chaque ligne
            'On cherche le contenu
            wsExterne.Cells(i, 6).Value = TrouverCorrespondance(wsExterne.Cells(i, 3).Value, rgCorres)
        Next i
     
        'Autofit des colonnes du fichier ouvert
        wsExterne.UsedRange.EntireColumn.AutoFit
     
        'Tri par ordre alphabétique
        wsExterne.Range("A6:F" & nbLignes).Sort Key1:=wsExterne.Range("F6"), Order1:=xlAscending, Header:=xlNo
     
        'Création des listes déroulantes
        For i = 6 To nbLignes
            If wsExterne.Cells(i, 6).Value = "A CLASSER" Then
                With wsExterne.Cells(i, 6).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                         xlBetween, Formula1:=LISTE_DEROULANTE
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .ShowInput = True
                    .ShowError = True
                End With
            End If
        Next i
    End If
    End Sub
    2.
    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
    'Ouvre un fichier et l'attribue au paramètre wb. Renvoie FALSE si le fichier n'a pas pu être ouvert
    Public Function OuvertureFichier(ByRef Wb As Workbook, ByVal CheminInitial As String) As Boolean
     
    With Application.FileDialog(msoFileDialogOpen)
        .Filters.Clear
        .Filters.Add "Fichier Excel", "*.xls; *.xlsx; *.xlsm"
        .AllowMultiSelect = False
        .InitialFileName = CheminInitial
        .Show
        If .SelectedItems.Count = 1 Then
            OuvertureFichier = True
            Set Wb = Workbooks.Open(.SelectedItems(1))
        Else
            MsgBox "Erreur à l'ouverture du fichier"
        End If
    End With
    End Function
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub btnExecution_Click()
    If procedureEnCours Then
        SuiviCash2
        procedureEnCours = False
        btnExecution.Caption = "Ouvrir le fichier"
    Else
        SuiviCash1
        If Ouvert Then
            procedureEnCours = True
            btnExecution.Caption = "Modifications terminées"
        End If
    End If
    End Sub
    C'est le même code qui t'est proposé auparavant et avec les mêmes remarques.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 130
    Points : 65
    Points
    65
    Par défaut
    Merci Mercadog.

    Et surtout désolé.

    Cordialement.

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

Discussions similaires

  1. Lien dans un frame d'une cadre pour ouvrir une autre page sur une même fenêtre
    Par maelislah dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 27/06/2015, 20h39
  2. Réponses: 6
    Dernier message: 24/01/2010, 21h34
  3. faire une condition pour arrêter une macro
    Par db48752b dans le forum Access
    Réponses: 11
    Dernier message: 21/09/2006, 20h21
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. gerer les ' dans une chaine pour eviter erreur sql
    Par Malone dans le forum Langage
    Réponses: 3
    Dernier message: 24/08/2005, 14h27

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