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 :

Aide pour macro VBA : boucles


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
    Août 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 35
    Par défaut Aide pour macro VBA : boucles
    Bonjour à tous

    Je souhaite obtenir de l'aide concernant une macro avec deux boucles.
    Je vais vous joindre un fichier excel pour vous aider à bien comprendre car cela n'est pas facile d'expliquer ce que je souhaiterais.

    Sur mon classeur, j'ai deux onglets : un nommé Feuille_entree et l'autre Feuil1.

    Onglet Feuille_entree :
    J'ai un tableau dont les données sont saisies (la dimension n'est pas connue) : temps en colonne A et volume en colonne B.

    Onglet Feuil1 :
    J'ai aussi un tableau avec des valeurs intermédiaires qui se remplit avec une macro.

    Le principe est le suivant :

    ligne 3 feuille_entree : temps 0 s et volume 35 m3
    ligne 4 feuille_entree : temps 20 s et volume 32 m3

    Je veux savoir ce qui se passe entre ces 2 points. Et une fois que c'est terminé, on passe à la ligne suivante : 40 s et 32 m3.

    Le fichier joint est explicité avec ces 2 cas.
    J'ai aussi fait une partie de la macro : je pense que mon code n'est pas très développé et pas du tout propre mais je compte sur votre aide et votre indulgence pour m'aider un peu. J'avais pensé à deux boucles for peut-être imbriquées...

    Classeur1.xlsm

    Merci
    Cordialement,

    Romhain

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Pour des raisons de sécurité, la plupart des membres de ce forum n'ouvrent pas les pièces jointes.
    Si vous voulez obtenir de l'aide il est préférable de fournir une description des traitements que vous souhaitez appliquer à vos données et les bouts de code que vous utilisez actuellement.

    D'après ce que j'ai compris de votre problème, il est probable que vous soyez amenés à utiliser une structure du type :
    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
    Public Sub TraiterLesDonnees()
        Dim LignE As Long, LignF As Long, t0 As Double, t1 As Double, tF As Double
        With ThisWorkbook.Sheets("Feuille_entree")
            LignE = 4
            LignF = 3
            t0 = .Cells(LignE - 1, 1).Value
            t1 = .Cells(LignE, 1).Value
            Do While t1 <> 0
                With ThisWorkbook.Sheets("Feuil1")
                    tF = .Cells(LignF, 1).Value
                    Do While tF < t1 And tF <> 0
                        <traiter_la_donnée_intermédiaire>
                        LignF = LignF + 1
                        tF = .Cells(LignF, 1).Value
                    Loop
                    LignF = LignF - 1
                End With
                LignE = LignE + 1
                t0 = t1
                t1 = .Cells(LignE, 1).Value
            Loop
        End With
    End Sub
    Il ne s'agit là que d'une proposition (très préliminaire). Le code qu'il vous faudra effectivement utiliser dépendra de l'organisation de vos données et des traitements que vous souhaitez mettre en œuvre.

    Cordialement,

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 35
    Par défaut
    Merci de ta réponse.

    Voilà le bout de 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
    Sub Module1()
     
    Dim Dlig2 As Long
    Dim nb_intervalles, dv, dt, i, l As Long
     
    With Sheets("Feuille_entree")
        Dlig2 = .Range("R" & Rows.Count).End(xlUp).Row
    End With
     
    With Sheets("Feuil1")
        Dlig = .Range("A" & Rows.Count).End(xlUp).Row
    End With
     
    dt = (100 * Sheets("Feuil1").Range("AN3").Value) / 100
     
    For l = 3 To Dlig2
     
    If dt <> 0 Then
    nb_intervalles = ((Sheets("Feuille_entree").Range("A" & l + 1).Value) - (Sheets("Feuille_entree").Range("A" & l).Value)) / dt
    End If
     
    If nb_intervalles <> 0 Then
    dv = ((Sheets("Feuille_entree").Range("B" & l + 1).Value) - (Sheets("Feuille_entree").Range("B" & l).Value)) / nb_intervalles
    End If
     
    For i = Dlig + 1 To nb_intervalles + 3 'pour commencer à la bonne ligne
     
    'volL(l) = volL(l+1) : constant
    If (Sheets("Feuille_entree").Range("B" & l).Value) = (Sheets("Feuille_entree").Range("B" & l + 1).Value) Then
        Sheets("Feuil1").Range("B" & i).Value = Sheets("Feuil1").Range("B" & i - 1).Value
    End If
     
    'volL(l)> volL(l+1) : baisse
    If ((Sheets("Feuille_entree").Range("B" & l).Value) > (Sheets("Feuille_entree").Range("B" & l + 1).Value)) Then
        Sheets("Feuil1").Range("B" & i).FormulaLocal = "=B" & (i - 1) & "-" & dv & ")"
    End If
     
    'volL(l)< volL(l+1) : hausse
    If ((Sheets("Feuille_entree").Range("B" & l).Value) < (Sheets("Feuille_entree").Range("B" & l + 1).Value)) Then
        Sheets("Feuil1").Range("B" & i).FormulaLocal = "=B" & (i - 1) & "+" & dv & ")"
    End If
     
    'temps
    Sheets("Feuil1").Range("A" & i).FormulaLocal = "=A" & (i - 1) & "+" & dt & ")"
     
    ' Comment passer à la ligne suivante ?
    End Sub
    Merci d'avance.
    Romhain

  4. #4
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Pas d'utilisation des balises code ; code non indenté.
    Je ne m'ennuie pas assez pour prendre le temps de déchiffrer tout cela alors que vous ne prenez pas le temps de mettre en forme vos messages

    Avis aux courageux !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 35
    Par défaut
    Voilà pour le 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
     
    Sub Module1()
         Dim Dlig2 As Long
         Dim nb_intervalles, dv, dt, i, l As Long
         With Sheets("Feuille_entree")
              Dlig2 = .Range("R" & Rows.Count).End(xlUp).Row
         End With
              With Sheets("Feuil1")
                   Dlig = .Range("A" & Rows.Count).End(xlUp).Row
              End With
              dt = (100 * Sheets("Feuil1").Range("AN3").Value) / 100
              For l = 3 To Dlig2
                   If dt <> 0 Then
                          nb_intervalles = ((Sheets("Feuille_entree").Range("A" & l + 1).Value) - (Sheets("Feuille_entree").Range("A" & l).Value)) / dt
                   End If
                   If nb_intervalles <> 0 Then
                          dv = ((Sheets("Feuille_entree").Range("B" & l + 1).Value) - (Sheets("Feuille_entree").Range("B" & l).Value)) / nb_intervalles
                   End If
              For i = Dlig + 1 To nb_intervalles + 3 'pour commencer à la bonne ligne
              'volL(l) = volL(l+1) : constant
                   If (Sheets("Feuille_entree").Range("B" & l).Value) = (Sheets("Feuille_entree").Range("B" & l + 1).Value) Then
                          Sheets("Feuil1").Range("B" & i).Value = Sheets("Feuil1").Range("B" & i - 1).Value
                   End If
              'volL(l)> volL(l+1) : baisse
                   If ((Sheets("Feuille_entree").Range("B" & l).Value) > (Sheets("Feuille_entree").Range("B" & l + 1).Value)) Then
                          Sheets("Feuil1").Range("B" & i).FormulaLocal = "=B" & (i - 1) & "-" & dv & ""
                   End If
              'volL(l)< volL(l+1) : hausse
                   If ((Sheets("Feuille_entree").Range("B" & l).Value) < (Sheets("Feuille_entree").Range("B" & l + 1).Value)) Then
                          Sheets("Feuil1").Range("B" & i).FormulaLocal = "=B" & (i - 1) & "+" & dv & ""
                   End If  
              'temps
              Sheets("Feuil1").Range("A" & i).FormulaLocal = "=A" & (i - 1) & "+" & dt & ""
     
    Next l
    Next i
     
    End Sub
    Mon problème est que je voudrais qu'Excel lise la ligne 4 en Feuille_entree, exécute les formules jusqu'à ce qu'à nb_intervalles et les note en Feuil1 puis recommence à la ligne 5 etc
    Merci d'avance de l'aide que vous pourrez m'apporter.

  6. #6
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Vous pourriez envisager quelque chose dans ce style :
    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
    Sub Module1()
        Dim Dlig As Long, Dlig2 As Long, v0 As Double, v1 As Double, t0 As Double, t1 As Double
        Dim nb_intervalles As Long, dv As Double, dt As Double, i As Long, l As Long
        dt = (100 * Sheets("Feuil1").Range("AN3").Value) / 100
        Dlig = 3  'cela suppose que la première ligne intéressante dans 'Feuil1' est la 3ème
        With Sheets("Feuille_entree")
            Dlig2 = .Range("R" & Rows.Count).End(xlUp).Row
            For l = 3 To Dlig2 - 1
                t0 = .Range("A" & l).Value
                t1 = .Range("A" & l + 1).Value
                If dt <> 0 Then
                    nb_intervalles = (t1 - t0) / dt
                Else
                    nb_intervalles = 0
                End If
                v0 = .Range("B" & l).Value
                v1 = .Range("B" & l + 1).Value
                If nb_intervalles <> 0 Then _
                    dv = (v1 - v0) / nb_intervalles
                For i = 1 To nb_intervalles
                    'volL(l) = volL(l+1) : constant
                    If v0 = v1 Then _
                        Sheets("Feuil1").Range("B" & Dlig + i).Value = Sheets("Feuil1").Range("B" & Dlig + i - 1).Value
                    'volL(l)> volL(l+1) : baisse
                    If v0 > v1 Then _
                        Sheets("Feuil1").Range("B" & Dlig + i).FormulaLocal = "=B" & (Dlig + i - 1) & "-" & dv
                    'volL(l)< volL(l+1) : hausse
                    If v0 < v1 Then _
                        Sheets("Feuil1").Range("B" & Dlig + i).FormulaLocal = "=B" & (Dlig + i - 1) & "+" & dv
                    End If
                    'temps
                    Sheets("Feuil1").Range("A" & Dlig + i).FormulaLocal = "=A" & (Dlig + i - 1) & "+" & dt
                    Dlig = Dlig + 1
                Next i
            Next l
        End With
    End Sub
    Cependant, ce code ne peut être utilisé en l'état. Seul vous connaissez les contraintes applicables à vos données et il est vraisemblable qu'une adaptation soit nécessaire.

Discussions similaires

  1. Aide pour Macro VBA copie lignes entre 2 classeur
    Par magicsismic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/03/2015, 21h13
  2. [Debutant] Aide pour macro VBA
    Par sousou94 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/09/2010, 06h07
  3. [VBA-E][débutant]aide pour macro sous excel
    Par julyBL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/06/2006, 22h42
  4. [VBA-E] aide pour macro sur excel
    Par letoulouzin31 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 24/05/2006, 11h29
  5. [VBA-E]besoin d'aide pour faire une boucle
    Par mikazounette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 14h04

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