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 :

Explication instruction "Flag"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 62
    Par défaut Explication instruction "Flag"
    Bonjour,

    J'ai trouvé le code suivant sur un forum, mais je ne comprends pas la signification de l'instruction flag = 0, puis flag = 1. Quelqu'un pourrait m'expliquer?

    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
    Sub Consolidation_fichiers()
     
    Dim f, fa As Worksheet, fv As Worksheet
    Dim i&, lgn&, flag&
     
        Set fa = ActiveWorkbook.ActiveSheet
        fa.Range("A1").CurrentRegion.Offset(1, 0).ClearContents
        f = Application.GetOpenFilename(, , , , True)
        On Error GoTo fin
        flag = 0
        For i = 1 To UBound(f)
            Workbooks.Open (f(i))
            Set fv = ActiveSheet
            lgn = fa.Range("A" & Rows.Count).End(xlUp)(2).Row
            If flag = 0 Then
                fv.Range("A1:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A1")
                flag = 1
            Else
                fv.Range("A2:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A" & lgn)
            End If
            ActiveWindow.Close
        Next i
    fin:
    End Sub

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Comme on le voit dans les déclarations (Dim) du code, flag est une simple variable.
    flag = 0 c'est simplement assigner 0 à cette variable.

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Commençons au début :
    L'instruction Dim i&, lgn&, flag& déclare 3 variables de type Long (entier long) ; i, lgn et flag.
    L'instruction Flag = 0 affecte la valeur 0 (zéro) à la variable flag.
    L'instruction Flag = 1 affecte la valeur 1 (un) à la variable flag.
    Les instructions If flag = 0 Then testent si la valeur de flag est égale à 0 et :
    - si c'est le cas, poursuit par les instruction situées après cette ligne et avant l'instruction Else.
    - si ce n'est pas le cas, c'est-à-dire quand la value de flag n'est pas égale à 0, poursuit par les instructions située aprés Else et avant End If.

    Ce que j'en pense :
    1. utiliser un nom générique (comme flag) n'aide pas à la compréhension du code.
    2. déclarer en type long une variable qui ne prend que les 2 valeurs 0 et 1, c'est très largement surdimensionné, byte (0 à 255) aurait largement suffit, mais ...
    3. vu l'utilisation de cette variable, un variable de type booléen est plus adaptée

    Ton code deviendrais plus simple à comprendre :

    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
    Sub Consolidation_fichiers()
     
    Dim f, fa As Worksheet, fv As Worksheet
    Dim i&, lgn&, PremiereLigneDejaCopiee As Boolean
     
        Set fa = ActiveWorkbook.ActiveSheet
        fa.Range("A1").CurrentRegion.Offset(1, 0).ClearContents
        f = Application.GetOpenFilename(, , , , True)
        On Error GoTo fin
        PremiereLigneDejaCopiee = False  ' cette ligne est inutile c'est simplement pédagogique
        For i = 1 To UBound(f)
            Workbooks.Open (f(i))
            Set fv = ActiveSheet
            lgn = fa.Range("A" & Rows.Count).End(xlUp)(2).Row
            If Not PremiereLigneDejaCopiee Then
                fv.Range("A1:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A1")
                PremiereLigneDejaCopiee = True
            Else
                fv.Range("A2:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A" & lgn)
            End If
            ActiveWindow.Close
        Next i
    fin:
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 62
    Par défaut
    Bonjour,

    Je vous remercie pour votre explication détaillée du code. C'est beaucoup plus clair !

    Concrètement cette variable "Flag" ou "PremiereLigneDejaCopiee" est liée au code suivant, qui efface les cellules en dessous de la 1ère ligne? C'est bien cela? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fa.Range("A1").CurrentRegion.Offset(1, 0).ClearContents
    Mais si j'efface directement toutes les données, sans garder la 1ère ligne (en enlevant le Offset(1,0)), je peux modifier mon code en enlevant la variable "flag" et la suite du code après Else? Ou celui ci est nécessaire pour consolider des fichiers, tout en gardant la 1ère ligne de titre du premier fichier, et en supprimant celle des autres ?

  5. #5
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par lou93 Voir le message
    Concrètement cette variable "Flag" ou "PremiereLigneDejaCopiee" est liée au code suivant, qui efface les cellules en dessous de la 1ère ligne? C'est bien cela? :
    fa.Range("A1").CurrentRegion.Offset(1, 0).ClearContents.
    Mais si j'efface directement toutes les données, sans garder la 1ère ligne (en enlevant le Offset(1,0)), je peux modifier mon code en enlevant la variable "flag" et la suite du code après Else?
    Non, je n'avais répondu qu'à ce qui concerne la variable flag, car ce code est, a mon avis, un concerté de tout ce qu'il ne faut pas faire pour avoir une code propre et sûr.

    Comme je l'ai fait pour flag, je pourrais détailler tout ce qui ne va pas et le justifier mais chaque ligne est à revoir.

    A commencer par la première : Set fa = ActiveWorkbook.ActiveSheet.
    Je ne comprends pas que le classeur et la feuille ne soient pas définis nommément, en particulier dans ce cas !
    Par exemple Set fa = Workbooks("ClasseurConsolidation").Worksheets("Consolidation").

    Revenons à ta dernière question :
    - la ligne que tu cites efface effectivement toutes les valeur (mais pas les formats) de tout le tableau sauf la ligne 1.
    - mais la ligne fv.Range("A1:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A1") copie les cellules (données et formats) de la feuille active (fv) du premier fichier ouvert, vers A1 de la feuille fa et donc écrase la ligne 1 qui avait été conservée !!! Et il reste sur la feuille fa les formats précédents qui n'ont pas étés écrasés (ceux au-delà du tableau copié).

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 62
    Par défaut
    Bonjour,

    C'est avec ce type de situation que je réalise que mes connaissances en macro sont encore très limitées ! J'étais persuadé que ce code était particulièrement bien construit...

    Du coup, comment faire pour effacer les données et les formats de mon onglet "consolidation" ? Je me demande si la variable Flag, et le code qui suit Else est nécessaire étant donné que je souhaite supprimer toutes les données lors de l’exécution de la macro ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fv.Range("A2:BY" & fv.Range("A" & Rows.Count).End(xlUp).Row).Copy fa.Range("A" & lgn)
    C'est en fait à moi de changer manuellement la valeur de la variable Flag selon que la 1ère ligne est copiée ou non? False si je n'ai pas de ligne de titre présente dans mon fichier de consolidation, et True si c'est le cas?

    Serait ce abusé de vous demander de m'aider à reconstruire ce code de sortes à ce qu'il réponde, de manière optimisée, à ma problématique : Sélectionner des fichiers, puis les consolider dans un seul et même onglet, en gardant la ligne de titre du 1er fichier, et en effaçant celle des autres fichiers sélectionnés.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 166
    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 : 13 166
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Serait ce abusé de vous demander de m'aider à reconstruire ce code de sortes à ce qu'il réponde, de manière optimisée, à ma problématique : Sélectionner des fichiers, puis les consolider dans un seul et même onglet, en gardant la ligne de titre du 1er fichier, et en effaçant celle des autres fichiers sélectionnés.
    Sur le même sujet de regroupement de liste des données se trouvant dans des feuilles différentes et à regrouper sur une seule
    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

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 62
    Par défaut
    Bonjour Philippe Tulliez,

    Je suis désolé mais les codes présents dans les liens envoyés sont beaucoup trop complexes pour le débutant que je suis...

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    Essaies 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
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Option Explicit
     
    Sub Consolidation_fichiers()
    ' Consolidation des fichiers sélectionnés
    '
    Dim f As Variant      'Tableau des noms complets des fichiers sélectionnés
    Dim wbS As Workbook   'Classeur source
    Dim wbC As Workbook   'Classeur cible
    Dim shC As Worksheet  'Onglet cible
    Dim msg As String     'Message d'erreur
    Dim i As Long         'Index
     
      ' Choisir les classeurs sources
      f = Application.GetOpenFilename(, , , , True)
      If IsArray(f) Then
        ' Créer un nouveau classeur et définir l'onglet cible
        With Workbooks.Add(xlWBATWorksheet)
          Set shC = .Worksheets(1)
        End With
        shC.Name = "Consolidation"
        ' Compiler le premier onglet de chaque classeur
        For i = LBound(f) To UBound(f)
          On Error Resume Next
          Set wbS = Workbooks.Open(f(i))
          On Error GoTo 0
          If Not wbS Is Nothing Then
            If i = LBound(f) Then
              ' premier classeur
              Call CompilerOnglet(wbS.Worksheets(1), shC, , True)
            Else
              ' autres classeurs
              Call CompilerOnglet(wbS.Worksheets(1), shC, 2, True)
            End If
            wbS.Close False
          Else
            msg = msg & vbCrLf & "- " & Mid(f(i), InStrRev(f(i), Application.PathSeparator) + 1)
          End If
        Next i
        If msg > "" Then
          MsgBox "Erreur à l'ouverture des fichiers suivants : " & msg & vbCrLf & vbCrLf & _
                 "Il n'ont pas été consolidés."
        End If
      End If
     
    End Sub
     
    Private Sub CompilerOnglet(wshSource As Worksheet, wshCible As Worksheet, _
        Optional ligneDebutSource As Long = 1, Optional allFormat As Boolean = False)
    ' Ajoute les données sources dans la feuille cible
    Dim src As Range
    Dim dst As Range
    Dim rng As Range
    Dim drC As Long
    Dim noC As Long
     
      With wshCible
        Set rng = .Cells.Find("*", , , , xlByRows, xlPrevious)
        If rng Is Nothing Then
          Set dst = .Range("A1")
        Else
          Set dst = .Range("A" & rng.Row).Offset(1)
        End If
      End With
      With wshSource
        Set rng = .Cells.Find("*", , , , xlByRows, xlPrevious)
        If Not rng Is Nothing Then
          Set src = .Range(.Rows(ligneDebutSource), .Rows(rng.Row))
          If allFormat Then
            Application.ScreenUpdating = False
            src.Copy Destination:=dst
            drC = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
            For noC = 1 To drC
              wshCible.Columns(noC).ColumnWidth = wshSource.Columns(noC).ColumnWidth
            Next noC
            Application.ScreenUpdating = True
          End If
          dst.Resize(src.Rows.Count, src.Columns.Count).Value = src.Value
        End If
      End With
    End Sub

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 62
    Par défaut
    Bonjour,

    Je vais regarder ce code dans le détail afin d'essayer de le comprendre !

    Encore merci pour votre aide

Discussions similaires

  1. explication instructions c
    Par masoum dans le forum Débuter
    Réponses: 6
    Dernier message: 14/02/2015, 11h51
  2. explication instruction if
    Par totot dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2014, 14h11
  3. [AC-2010] Gestion du quote dans instruction SQL
    Par fclus dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/12/2013, 11h34
  4. Explications instructions C#
    Par momento85 dans le forum C#
    Réponses: 3
    Dernier message: 19/08/2010, 16h48

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