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 :

Problème de boucle For each . Next


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Problème de boucle For each . Next
    Bonjour à tous,

    ça fait un moment que je cherche une solution à mon problème, et j'en suis arrivée au stade ou je ne sais plus quoi faire...
    Pourtant c'est un truc tout simple je pense...
    Alors je vous explique:
    D'abord mon fichier :
    - un classeur avec plusieurs onglets, tous les mois de l'année, et dans toutes les feuilles j'ai "quasiment" les mêmes "présentations" de données, sauf l'ordre et le nombre des colonnes qui pourraient être variable donc j'ai voulu l'intégrer dans le programme en disant en gros "cherche la cellule qui contient...", et la dernière ligne est variable (par soucis de confidentialité j'ai supprimé toutes les colonnes inutiles à la compréhension).

    Ce que je souhaite faire :
    - Multiplier A2 et B2 en C2
    - Faire la somme de la colonne C en C i (i étant la dernière ligne de ma colonne)
    - Passer à l'onglet suivant et c'est là où ça bloque..., il ne passe pas à l'onglet suivant mais à la colonne suivante.

    Ce que j'ai fait:
    - J'ai fait une boucle For each pour parcourir l'ensemble des onglets
    - J'ai fait une boucle Do whille Aj non vide (j'avais fait une boucle for j=2 to i-1 au début et j'avais le même problème

    Bref je ne sais plus, je suis perdue, si quelqu'un voulait bien y jeter un œil, ça serait super!!

    Merci beaucoup
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Désolé, mais je n'ouvre pas les fichiers joints avec macros...
    Peux-tu mettre le code que tu as concernant ces boucles ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Code
    Bonjour,

    Voici le code saisi:

    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
    Option Explicit
    Dim DernCol As Integer
    Dim Onglet As Worksheet
    Dim i As Single
    Dim j As Single
    Dim Cel1 As Range, Cel2 As Range
     
    Private Sub Workbook_Open()
     
    For Each Onglet In ActiveWorkbook.Sheets
     
        Cells(1, 1).Select
        ActiveSheet.UsedRange.Cells(ActiveSheet.UsedRange.Rows.Count, 1).Select
        i = ActiveCell.Row
     
        DernCol = Range("A1").End(xlToRight).Column
        Cells(1, DernCol + 1) = "Quantité"
     
    j = 2
    Do While Cells(j, DernCol) <> ""
        Set Cel1 = Cells.Find(What:="QteFactureeFact")
        Set Cel2 = Cells.Find(What:="PartPrixOuvrage")
     
        Cells(j, DernCol + 1).FormulaLocal = "=" & Cells(j, Cel1.Column) & "*" & Cells(j, Cel2.Column)
        j = j + 1
     
    Loop
     
        Cells(i, DernCol + 1) = Application.Sum(Range(Cells(2, DernCol + 1), Cells(i - 1, DernCol + 1)))
     
    Next Onglet
     
    End Sub

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    pour commencer ça plante à l'ouverture.

    Des variables publique doivent être déclarée dans un module standard.
    Et ne doivent être publiques ou globales que les variables le nécessitant. Je ne pense pas i, j, DernCol etc en fassent partie.
    D'autant plus que tu n'as qu'une seule macro. Donc toutes les variable doivent être déclarées dans cette proc.

    C'est quoi l'intérêt de recalculer tout ça à chaque ouverture ???
    Si rien à changé c'est inutile, par contre si une modif le nécessite tu fermes et rouvres ton fichier pour que la maj se fasse ?
    il y a un manque de logique certain je trouve.

    Du coup j'ai à peine regardé ton code.
    Les .select sont inutiles dans 99% des cas. Alors que dire de 2 .select successifs

    eric

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ALACO Voir le message
    Bonjour,

    A tester.

    Pièce jointe 309500

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ALACO Voir le message
    Cette version supprime le recalcul automatique des formules pendant la mise à jour des onglets

    Pièce jointe 309517

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Comme tu boucles les feuilles, tu dois spécifier leur nom.
    Par exemple, ceci (et je suis d'accord avec eriiic sur les Select...)
    Mais c'est juste pour une compréhension...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each Onglet In ActiveWorkbook.Sheets
     
     Onglet.Cells(1, 1).Select
     Onglet.UsedRange.Cells(Onglet.UsedRange.Rows.Count, 1).Select
    .........

  8. #8
    Membre à l'essai
    Femme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Super! Merci beaucoup pour votre réponse!
    Je n'ai pas encore essayé mais dès que je le fais, je vous tiens au courant.
    J'aurai du préciser au début que je suis complètement novice, la première fois que j'ai utilisé VBA c'était en juillet, donc je n'ai pas (encore, je l'espère) les bons réflexes, ni même toute la logique que VBA exige. Mais à chaque nouveau programme, je m'améliore un peu!

  9. #9
    Invité
    Invité(e)
    Par défaut
    bonjour,
    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
    Sub test()
    GestionClasseur ThisWorkbook
    End Sub
    Sub GestionClasseur(ByRef wb As Workbook)
    Dim Onglet As Worksheet
    For Each Onglet In wb.Sheets
        GestionOnglet Onglet
    Next
    End Sub
     
     
    Sub GestionOnglet(ByRef Onglet As Worksheet)
    Dim Colonnes, Rg As Range
    Set Rg = Onglet.UsedRange
    Set Colonnes = GestionColonnes(Rg)
    For i = 2 To Rg.Rows.Count
        Debug.Print Rg(i, Colonnes("A")), Rg(i, Colonnes("C"))  'Debug.Print Rg(i, Colonnes("QteFactureeFact")), Rg(i, Colonnes("PartPrixOuvra"))  dans ton cas!
    Next
    End Sub
    Function GestionColonnes(plage As Range)
    Dim c As Integer, Col
    Set Col = CreateObject("Scripting.Dictionary")
    With plage(1, 1)
    For c = 0 To plage.Columns.Count - 1
    Debug.Print .Offset(0, c).Value
        Col(.Offset(0, c).Value) = c + 1
    Next
    End With
    Set GestionColonnes = Col
    End Function
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 06/09/2017 à 15h22.

Discussions similaires

  1. [XL-2007] Boucles For Each Next: problème de défilement des feuilles avec lenteur d'exécution
    Par camelia.w dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/12/2011, 20h08
  2. [XL-2003] boucle For each Next
    Par facteur dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/11/2009, 16h41
  3. boucle for each next : sauter une valeur
    Par scavenger dans le forum VBScript
    Réponses: 1
    Dernier message: 18/02/2009, 10h15
  4. Boucle For Each Next non entrée
    Par Kareg dans le forum VBA Access
    Réponses: 9
    Dernier message: 21/05/2008, 14h35
  5. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47

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