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 :

Compiler des codes [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Par défaut Compiler des codes
    Bonjour.

    Voilà, j'ai réussi ( ) à faire deux codes qui fonctionnent à date et que j’appellerai getCalendar() et getPrice().

    Je veux réaliser un code qui "compile" tout ça sous la forme suivante :

    SI condition1 ALORS faire getCalendar() puis getPrice()
    SI condition2 ALORS faire seulement getPrice()

    Mais étant débutant, je suis passé du côté obscur de la force et j'ai utilisé les (apparemment) bannis "GoTo">

    Pourriez-vous m'aider ou me conseiller pour rebasculer sur un code plus "propre"?
    De plus, je vais avec beaucoup de lignes à traiter avec ce code ( environ 20 000 -_-) donc j'aimerai l'optimiser afin de pas devoir laisser la machine tourner 4 jours à chaque fois que j'appuie sur le bouton...

    Voilà LA CHOSE :

    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
    Sub getCashFlow()
     
    Dim i As Integer
    Dim j As Integer
    Dim f As Integer
    Dim start As Single
    Dim a As Integer
    Dim b As Integer
     
    start = Timer
     
    For i = 13 To 25 'vérifier valeur max de i'
            For j = 16 To 380 'vérifier valeur max de j'
     
            If Cells(i, 13).Value = 0 Or Cells(i, 13).Value <> Cells(i, 12).Value Then 'Si condition 1 (colonne "check" = 0 ou colonne "check"<>calendar), alors faire getCalendar puis getPrice'
     
                GoTo getCalendar
                GoTo getPrice
     
            Else: Cells(i, 13).Value = Cells(i, 12).Value 'Si condition 2 (colonne "check"= colonne "calendar"), alors SEULEMENT getPrice'
     
                GoTo getPrice
     
        End If
     
        Next j
    Next i
     
     
    getCalendar:
     
    For i = 13 To 25 'vérifier valeur max de i'
        For j = 16 To 380 'vérifier valeur max de j'
         If Cells(i, 12).Value = "A" Then f = 2
         If Cells(i, 12).Value = "B" Then f = 3
         If Cells(i, 12).Value = "C" Then f = 4 'différentes valeurs de f à màj'
            Cells(i, j).Value = Application.VLookup(Cells(12, j), Sheet2.Range("D6:G370"), f, True) 'vérifier limite du tableau pour le vlookup'
        Next j
    Next i
     
     
    getPrice:
     
    For a = 13 To 25 'vérifier valeur max de a'
        For b = 16 To 380 'vérifier valeur max de b'
     
            If Cells(12, b).Value >= WorksheetFunction.Min(Cells(a, 9).Value, Cells(a, 10).Value) And Cells(12, b).Value <= WorksheetFunction.Max(Cells(a, 9).Value, Cells(a, 10).Value) And Cells(a, b).Value <> 1 Then 'vérifier que cette ligne utilise bien les colonnes "Start Date" (Cells(a, 9).Value) et "Finish Date" (Cells(a,10)'
            Cells(a, b).Value = Cells(a, 14).Value 'vérifier que cette ligne renvoie bien à la colonne "Daily Price"'
     
            Else: Cells(a, b).Value = Cells(a, b).Value
     
            End If
     
        Next b
    Next a
     
    For i = 13 To 25 'vérifier valeur max de i'
     
    Cells(i, 13) = Cells(i, 12)
     
    Next i
     
    MsgBox "durée du traitement : " & Timer - start & "secondes"
     
     
    End Sub
    Merci beaucouuuup! Bye

  2. #2
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,

    j'ai mis en forme ton code qui doit te servir d'exemple,
    car je n'ais pas terminé le travail...
    à toi de finir et de nous montrer ton code modifié,

    en premier : getCalendar() est devenu un petit programme indépendant
    on peut l'appeler autan de fois que l'on veux avec : "Call"

    getCalendar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub getCalendar()
        For i = 13 To 25 'vérifier valeur max de i'
            For j = 16 To 380 'vérifier valeur max de j'
                If Cells(i, 12).Value = "A" Then f = 2
                If Cells(i, 12).Value = "B" Then f = 3
                If Cells(i, 12).Value = "C" Then f = 4 'différentes valeurs de f à màj'
                Cells(i, j).Value = Application.VLookup(Cells(12, j), Sheet2.Range("D6:G370"), f, True) 'vérifier limite du tableau pour le vlookup'
            Next j
        Next i
    End Sub
    le test IF et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub getCashFlow()
        'à titre d'exemple
        If Cells(i, 13).Value = 0 Or Cells(i, 13).Value <> Cells(i, 12).Value Then
            Call getCalendar
        Else
            Cells(i, 13).Value = Cells(i, 12).Value 'Si condition 2 (colonne "check"= colonne "calendar"), alors SEULEMENT getPrice'
        End If
    End Sub
    getCalendar n'est plus dans getCashFlow
    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Par défaut
    Bonjour mjpmjp et merci pour ta réponse.

    J'ai donc codé la chose comme suit mais j'ai l'impression que le code tourne en boucle (je suis obligé de l'arrêter de force et les cellules se remplissent et se vident). Ai-je oublié une instruction de "fin"?

    Merci !

    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
    81
    82
    83
    84
    85
    86
    Sub getCashFlow()
     
    Dim i As Integer
    Dim j As Integer
    Dim f As Integer
    Dim start As Single
    Dim a As Integer
    Dim b As Integer
     
    start = Timer
     
     
    For i = 13 To 25 'VERIFIER valeur max de i'
            For j = 16 To 380 'VERIFIER valeur max de j'
     
            If Cells(i, 13).Value = 0 Or Cells(i, 13).Value <> Cells(i, 12).Value Then 'Si condition 1 (check = 0), alors faire getCalendar puis getPrice'
     
                Call getCalendar
                Call getPrice
     
     
            Else: Cells(i, 13).Value = Cells(i, 12).Value 'Si condition 2 (check=calendar), alors SEULEMENT getPrice'
     
                Call getPrice
     
            End If
     
     
        Next j
    Next i
     
     
    For i = 13 To 25 'VERIFIER valeur max de i'
    Cells(i, 13) = Cells(i, 12)
    Next i
     
    MsgBox "durée du traitement : " & Timer - start & "secondes"
     
    End Sub 'Fin du programme'
     
     
     
     
    Sub getCalendar()
     
    For i = 13 To 25 'vérifier valeur max de i'
            For j = 16 To 380 'vérifier valeur max de j'
     
     
            If Cells(12, j).Value >= WorksheetFunction.Min(Cells(i, 9).Value, Cells(i, 10).Value) And Cells(12, j).Value <= WorksheetFunction.Max(Cells(i, 9).Value, Cells(i, 10).Value) Then 'VERIFIER que cette ligne utilise bien les colonnes "Start Date" (Cells(a, 9).Value) et "Finish Date" (Cells(a,10)'
                If Cells(i, 12).Value = "A" Then f = 2
                If Cells(i, 12).Value = "B" Then f = 3
                If Cells(i, 12).Value = "C" Then f = 4 'différentes valeurs de f à màj'
                Cells(i, j).Value = Application.VLookup(Cells(12, j), Sheet2.Range("D6:G370"), f, True) 'vérifier limite du tableau pour le vlookup'
     
     
            Else: Cells(i, j).Value = Cells(i, j).Value
     
            End If
     
     
            Next j
        Next i
     
    End Sub
     
     
     
     
     
    Sub getPrice()
     
    For a = 13 To 25 'VERIFIER valeur max de a'
        For b = 16 To 380 'VERIFIER valeur max de b'
     
            If Cells(12, b).Value >= WorksheetFunction.Min(Cells(a, 9).Value, Cells(a, 10).Value) And Cells(12, b).Value <= WorksheetFunction.Max(Cells(a, 9).Value, Cells(a, 10).Value) And Cells(a, b).Value <> 1 Then 'VERIFIER que cette ligne utilise bien les colonnes "Start Date" (Cells(a, 9).Value) et "Finish Date" (Cells(a,10)'
            Cells(a, b).Value = Cells(a, 15).Value 'VERIFIER que cette ligne renvoie bien à la colonne "Daily Price"'
     
            Else: Cells(a, b).Value = Cells(a, b).Value
     
            End If
     
        Next b
    Next a
     
    End Sub

  4. #4
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    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
    For i = 13 To 25 'VERIFIER valeur max de i'
        For j = 16 To 380 'VERIFIER valeur max de j' 
            If Cells(i, 13).Value = 0 Or Cells(i, 13).Value <> Cells(i, 12).Value Then 'Si condition 1 (check = 0), alors faire getCalendar puis getPrice' 
                Call getCalendar
                Call getPrice 
            Else
                Cells(i, 13).Value = Cells(i, 12).Value 'Si condition 2 (check=calendar), alors SEULEMENT getPrice' 
                Call getPrice 
            End If 
        Next j
    Next i
    pour cette partie:
    n'écrit pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Else: Cells(i, 13).Value = Cells(i, 12).Value 'Si condition 2 (check=calendar), alors SEULEMENT getPrice'
    fait attention à bien aligner les boucles (ici, "For j" n'était pas aligné)

    c'est très important (pour contrôler et comprendre)

    tu as donc 2 boucles imbriquées i et j
    dans cette partie on pourrait croire que "j" n'est pas utilisé, mais c'est faux car "j" est utilisé par getCalendar

    MAIS getCalendar utilise ses propres boucles !!! il faut SUPRIMER ces boucles et vérifier si à l’intérieur de getCalendar "i" et "j" on la même valeur des boucles du programme getCashFlow qui l’appelle.

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  5. #5
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,

    il faut SUPRIMER ces boucles...
    celles de getCalendar...
    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 11
    Par défaut
    J'ai corrigé le code (la partie ELSE) mais j'ai essayé de sortir les variables pour les rendre globales et coder ainsi :
    Mais évidemment ca ne marche pas

    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
    Option Explicit
    Dim i As Integer
    Dim j As Integer
    Dim f As Integer
     
    Sub getCashFlow()
     
    Dim start As Single
     
    start = Timer
     
    For i = 13 To 14 'VERIFIER valeur max de i'
            For j = 16 To 380 'VERIFIER valeur max de j'
     
            If Cells(i, 13).Value = 0 Or Cells(i, 13).Value <> Cells(i, 12).Value Then 'Si condition 1 (colonne "check" = 0) ou condition 2 (colonne "check"<>colonne "calendar"), alors faire getCalendar puis getPrice'
     
                Call getCalendar
                Call getPrice
     
            Else 'Sinon (colonne "check"= colonne "calendar"), alors SEULEMENT getPrice'
     
                Call getPrice
     
            End If
     
        Next j
    Next i
     
    For i = 13 To 25 'VERIFIER valeur max de i'
    Cells(i, 13) = Cells(i, 12)
    Next i
     
    MsgBox "durée du traitement : " & Timer - start & "secondes"
     
    End Sub 'Fin du programme'
     
     
    Sub getCalendar()
     
            If Cells(12, j).Value >= WorksheetFunction.Min(Cells(i, 9).Value, Cells(i, 10).Value) And Cells(12, j).Value <= WorksheetFunction.Max(Cells(i, 9).Value, Cells(i, 10).Value) Then 'VERIFIER que cette ligne utilise bien les colonnes "Start Date" (Cells(a, 9).Value) et "Finish Date" (Cells(a,10)'
                If Cells(i, 12).Value = "A" Then f = 2
                If Cells(i, 12).Value = "B" Then f = 3
                If Cells(i, 12).Value = "C" Then f = 4 'différentes valeurs de f à màj'
                Cells(i, j).Value = Application.VLookup(Cells(12, j), Sheet2.Range("D6:G370"), f, True) 'vérifier limite du tableau pour le vlookup'
     
     
            Else: Cells(i, j).Value = Cells(i, j).Value
     
            End If
     
    End Sub
     
     
    Sub getPrice()
     
            If Cells(12, j).Value >= WorksheetFunction.Min(Cells(i, 9).Value, Cells(i, 10).Value) And Cells(12, j).Value <= WorksheetFunction.Max(Cells(i, 9).Value, Cells(i, 10).Value) And Cells(i, j).Value <> 1 Then 'VERIFIER que cette ligne utilise bien les colonnes "Start Date" (Cells(a, 9).Value) et "Finish Date" (Cells(a,10)'
            Cells(i, j).Value = Cells(i, 15).Value 'VERIFIER que cette ligne renvoie bien à la colonne "Daily Price"'
     
            Else: Cells(i, j).Value = Cells(i, j).Value
     
            End If
     
    End Sub
    Aurais-tu une idée?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/05/2009, 01h36
  2. Compilation des code behind en dll
    Par phpieur dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/09/2007, 13h37
  3. Compiler des sources KjAPI sous Code::Blocks
    Par ThomasCh dans le forum Code::Blocks
    Réponses: 18
    Dernier message: 17/11/2006, 22h30
  4. [javac] code pour lancer la compilation des classes
    Par viena dans le forum Général Java
    Réponses: 6
    Dernier message: 19/07/2004, 17h41

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