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 :

Fonction DO LOOP qui ne fonctionne pas [XL-2013]


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
    Ingénieur en exploitation des systèmes de production
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en exploitation des systèmes de production
    Secteur : Transports

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Par défaut Fonction DO LOOP qui ne fonctionne pas
    Bonjour, je suis nouveau sur le forum et je débute la programmation. J'ai fait un code très sommaire (et assez maladroit je pense vu mon niveau) qui devrait me permettre d'aller chercher des cellules dans un classeur préalablement sélectionné par l'utilisateur.

    le classeur source est toujours du même format, les onglets et les cellules reste les même, seul le nom et la localisation change (en fonction du mois)

    Chaque onglet représente un jour du mois et le nom est le numéro du jour (1,2,3...). Chaque onglet contient 3 tableaux représentant les commentaires de chaque chef d'équipe (3 équipes par jour).

    Pour l’analyse j'ai besoin de venir mettre des information les unes à la suite des autres alors je procédé par étape (précisés dans la macro).

    Mais voila pour ce faire j'ai besoin de faire appel à une boucle qui va venir extraire les données page par page (de 1 à 31).
    Sauf que quand je teste le programme sans la boucle avec un numéro d'onglet au hasard cela fonctionne bien mais quand j'incrémente une variable dans le numéro d'onglet avec la boucle "do loop" , plus rien, le programme se termine mais aucune données.

    Je pense que l'erreur ne doit pas être très grosse mais j'ai cherché par tout et pas moyen de trouver d'ou cela vient. (encore désolé pour l'écriture de ce programme je pense que certains experts vont être choqués )

    Voila le programme :

    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
    Sub ChoixFichier()
        'déclaration des variables
        Dim Fichier As String 'chemin du fichier
        Dim shA As Worksheet 'Feuille A
        Dim wB As Workbook 'Classeur
        Dim lignevide As Integer 'numero 1ere ligne vide
        Dim feuille As Integer 'numéro de boucle (attention bien mettre string et non integer)
     
     
        appel = MsgBox("Cette opération va aboutir à l'extration du rapport Tubing que vous allez selectionner", vbOKCancel + vbInformation, "Attention extration")
        If appel = vbOK Then 'demande à l'utilisateur s'il est sur de vouloir poursuivre et l'informe de ce que le programme va executer
     
        lignevide = Empty 'vide la variable qui trouve la premiere ligne vide
     
        feuille = 1 'commence à l'onglet jour 1
     
        Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") 'Affiche la boîte de dialogue "Ouvrir" et ouvre le fichier selectionné
        Application.DisplayAlerts = False 'désactive les boites de dialogue
        Set shA = Sheets("data") 'active l'onglet data
        Set wB = Workbooks.Open(Filename:=Fichier) 'active le fichier que l'on va extraire
     
        Do 'début de la boucle
        'poste 1
            Set shA = Sheets("data") 'active l'onglet data
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            Set wB = Workbooks.Open(Filename:=Fichier) 'active le fichier que l'on va extraire
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("c41:i68").Value 'copie la plage
            wB.Close False ' ferme sans sauve
            Set wB = Nothing
            Set shA = Nothing
        'poste2
            Set shA = Sheets("data") 'active l'onglet data
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            Set wB = Workbooks.Open(Filename:=Fichier) 'active le fichier que l'on va extraire
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("j41:p68").Value 'copie la plage
            wB.Close False ' ferme sans sauve
            Set wB = Nothing
            Set shA = Nothing
        'poste 3
            Set shA = Sheets("data") 'active l'onglet data
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            Set wB = Workbooks.Open(Filename:=Fichier) 'active le fichier que l'on va extraire
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("q41:w68").Value 'copie la plage
            wB.Close False ' ferme sans sauve
            Set wB = Nothing
            Set shA = Nothing
     
            feuille = feuille + 1 'passage à l'onglet suivant
     
        Loop While feuille = 31 'condition de fin de boucle
     
     
     
            Set wB = Nothing
            Set shA = Nothing
     
        Application.DisplayAlerts = True 'réactive les boites de dialogue
     
        MsgBox "Términé !" 'message qui confirme la fin de l'execution
     
        End If
     
    End Sub

  2. #2
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Bonjour

    Choqué, non, tout juste un peu étonné
    Tout d'abord, ton Do loop est inopérant car il ne peut fonctionner que si "feuille=31".
    N'hésites pas à traduire en français les termes VBA, tu verras que ça éclaircit pas mal :
    Do ... Loop While Feuille=31 ça donne : "Fais ... Tant que feuille=31" ............ est-ce vraiment ce que tu souhaites ?
    N'est ce pas plutot Tant que Feuille<31 ?

    D'autre part, si je peux me permettre, tu ouvres et tu fermes plusieurs fois le même fichier... pourquoi ? une fois suffit ! En faisant cela, tu allonges énormément le temps d'exécution.

    PS : La syntaxe : set X = W.sheets("Y") n'active absolument pas une feuille. Tu ne fais que créer une variable qui pointe vers cette feuille.
    Si tu veux vraiment activer une feuille : W.sheets("Y").activate !

    Cordialement

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur en exploitation des systèmes de production
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en exploitation des systèmes de production
    Secteur : Transports

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Par défaut
    Bonjour ylemasson, merci de t'être penché sur mon problème ! j'ai donc procédé aux modifications que tu m'as suggéré de faire et j'ai un peu épurer le programme, mais ca me marche toujours pas.

    J'ai du mal comprendre une de tes instructions concernant l'activation des documents en temps voulu (j'ai un peu de mal avec cette notion d'ailleurs )

    Le nouveau code est le suivant :

    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
    Sub ChoixFichier()
        'déclaration des variables
        Dim Fichier As String 'chemin du fichier
        Dim shA As Worksheet 'Feuille A
        Dim wB As Workbook 'Classeur
        Dim lignevide As Integer 'numero 1ere ligne vide
        Dim feuille As Integer 'numéro de boucle
     
     
        appel = MsgBox("Cette opération va aboutir à l'extration du rapport Tubing que vous allez selectionner", vbOKCancel + vbInformation, "Attention extration")
        If appel = vbOK Then 'demande à l'utilisateur s'il est sur de vouloir poursuivre et l'informe de ce que le programme va executer
     
        feuille = 1 'commence à l'onglet jour 1
     
        Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") 'Affiche la boîte de dialogue "Ouvrir" et ouvre le fichier selectionné
        Application.DisplayAlerts = False 'désactive les boites de dialogue
     
        Set shA = Sheets("data") 'pointe l'onglet data
        Set wB = Workbooks.Open(Filename:=Fichier) 'pointe le fichier que l'on va extraire
     
        Do 'début de la boucle
        'poste 1
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("c41:i68").Value 'copie la plage
     
        'poste2
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("j41:p68").Value 'copie la plage
     
        'poste 3
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "a").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("q41:w68").Value 'copie la plage
     
            feuille = feuille + 1 'passage à l'onglet suivant
     
        Loop While feuille < 31 'condition de fin de boucle
     
        wB.Close False ' ferme sans sauve
        Set wB = Nothing
        Set shA = Nothing
     
        Application.DisplayAlerts = True 'réactive les boites de dialogue
     
        MsgBox "Términé !" 'message qui confirme la fin de l'execution
     
        End If
     
    End Sub
    J'ai un fichier source dont les plages à extraites sont pleines mais rien ne se reporte dans mon onglet "data" ou cette macro est présente.

  4. #4
    Membre averti Avatar de ylemasson
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 52
    Par défaut
    Je ne vois rien qui incrémente la colonne "a" de l'onglet shA, est-ce normal ?
    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur en exploitation des systèmes de production
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en exploitation des systèmes de production
    Secteur : Transports

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Par défaut
    C'est bon je suis arrivé à le faire fonctionner !

    Tu as raison tu m'as mis sur la bonne piste, en effet quand je compte les lignes vides, je le fais à partir de la cellule de la colonne A alors que je n'incrémente rien dedans !!
    j'ai donc changé ce critère et déplacé dans la colonne B sur laquelle j'incrémente une valeure.

    Merci beaucoup ylemasson pour ton aide précieuse.

    Je mets le code si jamais quelqu'un voudrait le code qui fonctionne :

    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
    Sub ChoixFichier()
        'déclaration des variables
        Dim Fichier As String 'chemin du fichier
        Dim shA As Worksheet 'Feuille A
        Dim wB As Workbook 'Classeur
        Dim lignevide As Integer 'numero 1ere ligne vide
        Dim feuille As Integer 'numéro de boucle
     
     
        appel = MsgBox("Cette opération va aboutir à l'extration du rapport Tubing que vous allez selectionner", vbOKCancel + vbInformation, "Attention extration")
        If appel = vbOK Then 'demande à l'utilisateur s'il est sur de vouloir poursuivre et l'informe de ce que le programme va executer
     
        feuille = 1 'commence à l'onglet jour 1
     
        Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") 'Affiche la boîte de dialogue "Ouvrir" et ouvre le fichier selectionné
        Application.DisplayAlerts = False 'désactive les boites de dialogue
     
        Set shA = Sheets("data") 'pointe l'onglet data
        Set wB = Workbooks.Open(Filename:=Fichier) 'pointe le fichier que l'on va extraire
     
        Do 'début de la boucle
        'poste 1
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "B").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("c41:i68").Value 'copie la plage
     
        'poste2
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "B").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("j41:p68").Value 'copie la plage
     
        'poste 3
            ThisWorkbook.Sheets("data").Activate
            lignevide = Cells(Rows.Count, "B").End(xlUp).Row + 1 'donne le numero de la premiere ligne vide
            shA.Range(("B" & lignevide), ("H" & lignevide + 27)).Value = wB.Sheets(feuille).Range("q41:w68").Value 'copie la plage
     
            feuille = feuille + 1 'passage à l'onglet suivant
     
        Loop While feuille < 31 'condition de fin de boucle
     
        wB.Close False ' ferme sans sauve
        Set wB = Nothing
        Set shA = Nothing
     
        Application.DisplayAlerts = True 'réactive les boites de dialogue
     
        MsgBox "Términé !" 'message qui confirme la fin de l'execution
     
        End If
     
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    à la retraite
    Inscrit en
    Novembre 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Belgique

    Informations professionnelles :
    Activité : à la retraite

    Informations forums :
    Inscription : Novembre 2015
    Messages : 54
    Par défaut
    Bonjour,

    il ne serait pas plus logique d'écrire :

    If not appel = vbOK Then exit sub ?

    P.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur en exploitation des systèmes de production
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en exploitation des systèmes de production
    Secteur : Transports

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Par défaut
    Citation Envoyé par gosselien Voir le message
    Bonjour,

    il ne serait pas plus logique d'écrire :

    If not appel = vbOK Then exit sub ?

    P.
    Cette msgbox demande à l'utilisateur de faire un choix soit "ok" soit "annuler" du coup si "appel"=1 (ok) alors on exécute le reste du sub si il fait annuler le sub s’arrête directement (je l'ai testé et cela fonctionne) je pense que ça fait partie d'une des fonction de ce type de msgbox (le vbOKcancel).

  8. #8
    Invité
    Invité(e)
    Par défaut
    bonjour,
    je t'invite à ne pas traiter ta macro en un seul bloc mais de découper tes actions!

    1. ouvrir un fichier
    2. traiter ce fichier
    3. traiter ses onglet

    ainsi, si comme tu le dits, ta macro fonctionne sur un onglet, il te suffis de coller le code dans la méthode TraitementOnglet en lui fournissant l'ongle en question.

    ensuite tu remonte d'un cran et tu scan les 31 onglet en question.

    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
    Sub traitementClasseur()
    Dim wb As Workbook
    Set wb = OpenClasseur
    For i = 1 To 31
        TraitementOnglet wb.Sheets(CStr(i))
    Next
    wb.Close False: Set wb = Nothing
    End Sub
    Function OpenClasseur() As Workbook
     Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*") 'Affiche la boîte de dialogue "Ouvrir" et ouvre le fichier selectionné
     Set OpenClasseur = Workbooks.Open(Filename:=Fichier) 'active le fichier que l'on va extraire
    End Function
    Sub TraitementOnglet(ByRef sh As Worksheet)
     
     
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur en exploitation des systèmes de production
    Inscrit en
    Août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en exploitation des systèmes de production
    Secteur : Transports

    Informations forums :
    Inscription : Août 2017
    Messages : 20
    Par défaut
    Merci dysorthographie ! je n'avais pas pensé à faire cela ! C'est sur que cela sera beaucoup plus clair.

    Je vais faire comme tu m'as dit et ça devrait aller mieux (même dans le traitement j'imagine).

    cordialement

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/09/2013, 10h40
  2. Réponses: 2
    Dernier message: 07/01/2013, 12h08
  3. [Javascript] Fonction qui ne fonctionne pas sous Opera et Safari
    Par frechy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/02/2007, 11h04
  4. Fonction Quoted printable qui ne fonctionne pas.
    Par leCcsympas dans le forum C
    Réponses: 3
    Dernier message: 13/01/2007, 19h54
  5. Fonction While {} qui ne fonctionne pas
    Par zoom61 dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2006, 13h17

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