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 :

Correction d’un apprenti en VBA [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Correction d’un apprenti en VBA
    Bonjour à tous,

    J’ai besoin que quelqu’un me corrige mon code, en effet je suis en apprentissage et j’aimerai progresser. De plus le temps de travail est de 500 s pour ce petit fichier, je pense que j’ai écris quelques maladresse qui ralentisse le travail.
    Pour améliorer la procédure j’ai passé plusieurs heures sur les tutos de SilkyRoad et Didier Gonard concernant les variables tableaux, et j’avoue que si les exemples sont bien faits, par contre je n’arrive pas à l’appliquer sur ma procédure. Je pense qu’il me faudrait plus d’exemple avec des boucles pour comprendre le fonctionnement.

    Merci par avance

    Cordialement
    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
    Sub TestABCDE()
     
    Deb = Timer
       Application.ScreenUpdating = False
    'definition des variables
       Dim shtFrom As Worksheet, shtTo As Worksheet
       Dim A As Long, B As Long, X As Integer, Str_Val_1 As String, Str_Val_2 As String, Cel As Range
    'initialisation du tableau
         Sheets("A").Range("a20:c79").ClearContents
    ' I = NB DE COLONNES A RAPATRIER
           For i = 1 To 150
            decal = 1 * i
     'copie successive des colonnes du tableau Z vers la colonne A20
      Set shtTo = Worksheets("A")
         Set shtFrom = Worksheets("A")
            shtTo.Range("A20:A79").Value = shtFrom.Range("L20:L79").Offset(0, decal).Value
               For X = 1 To 1
        Select Case X
            Case 1
                Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
                Set Cel = Range("F1")
        End Select
    ' la formule est bouclée sur la totalité des valeurs de 20 à 59: A = Nb de N° a tester
          For A = 20 To 360
            Range("C20").FormulaR1C1 = Str_Val_1 & A & "C7)"
               Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
    'le résultat du test est copié dans la cellule en face de la valeur A
         Range("C12").Copy
              Cel.Offset(A - 1, 0).PasteSpecial Paste:=xlPasteValues
    ' recalcul des données en fonction de la valeur max tableau
        Str_Val_2 = "=RC[-1]+sin(RC[-2]/R"
            Set Cel = Range("F1")
                  For B = 17 To 17
        Range("C20").FormulaR1C1 = Str_Val_1 & B & "C6)"
          Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
            Next B
        Next A
    Next X
    'copie des résultats (en J pour controler l'augmentation des resultats, en I pour la valeur max)
       shtTo.Range("I1").Offset(i - 1, 0).Value = shtFrom.Range("F17").Value
          shtTo.Range("J1").Offset(i - 1, 0).Value = shtFrom.Range("F18").Value
             shtTo.Range("b20:b79").Value = shtFrom.Range("c20:c79").Value
    Next i
       Application.ScreenUpdating = True
     MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,

    Je me suis arrété en plein code qui me parait illogique, j'irai plus loin quand tu auras répondu aux remarques que j'ai faites dans cette partie :
    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
    Sub TestABCDE()
     
    Deb = Timer
    Application.ScreenUpdating = False
    'definition des variables
    Dim shtFrom As Worksheet, shtTo As Worksheet
    Dim A As Long, B As Long, X As Integer, Str_Val_1 As String, Str_Val_2 As String, Cel As Range
    'initialisation du tableau
    Sheets("A").Range("a20:c79").ClearContents
    ' I = NB DE COLONNES A RAPATRIER
    For i = 1 To 150
       decal = 1 * i 'donc decal = i donc inutile
       Set shtTo = Worksheets("A")
       Set shtFrom = Worksheets("A") 'pourquoi 2 variables pour même feuille ?
       shtTo.Range("A20:A79").Value = shtFrom.Range("L20:L79").Offset(0, i).Value
       For X = 1 To 1 'inutile
       Select Case X 'inutile
          Case 1 'inutile
             Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
             Set Cel = Range("F1")
       End Select'inutile
    ......
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    un autre point qui semble excessif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For B = 17 To 17
         Range("C20").FormulaR1C1 = Str_Val_1 & B & "C6)"
         Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
    Next B
    exactement équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("C20").FormulaR1C1 = Str_Val_1 & "17C6)"
    Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
    En outre, tes indentations me semblent mauvaises. J'espère que dans ton code tu as bien ton qui commence exactement dans la même colonne que le correspondant. Si ça n'est pas le cas, je te conseille de bien aligner les terminateurs avec les commençeurs.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Bonjour,

    Merci pour avoir regardé mon petit bout d’essai
    J’ai modifié en fonction des remarques de casefayere et el slapper
    Le code semble plus léger maintenant, je suis prés pour la suite des remarques

    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
     Sub TestABCDE()
     
    Deb = Timer
       'Application.ScreenUpdating = False
    'definition des variables
       Dim shtFrom As Worksheet, shtTo As Worksheet
       Dim A As Long, B As Long, X As Integer, Str_Val_1 As String, Str_Val_2 As String, Cel As Range
    'initialisation du tableau
         Sheets("A").Range("a20:c79").ClearContents
     ' i = NB DE COLONNES A RAPATRIER
           For i = 1 To 50 ' compte le nombre de colonne a rapatrier
            decal = 1 * i 'si absence de cette ligne, alors la colonne n'est pas copiée
     'copie successive des colonnes du tableau Z vers la colonne A20
      Set shtTo = Worksheets("A")
         Set shtFrom = Worksheets("A")
            shtTo.Range("A20:A79").Value = shtFrom.Range("L20:L79").Offset(0, decal).Value
                        '          For X = 1 To 1 merci le code fonctionne tres bien sans X
                        '   Select Case X
                        '      Case 1
                Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
                Set Cel = Range("F1")
                            '   End Select
    ' la formule est bouclée sur la totalité des valeurs de 20 à 100: A = Nb de N° a tester
          For A = 20 To 100
            Range("C20").FormulaR1C1 = Str_Val_1 & A & "C7)"
               Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
    'le résultat du test est copié dans la cellule en face de la valeur A
         Range("C12").Copy
              Cel.Offset(A - 1, 0).PasteSpecial Paste:=xlPasteValues
    ' recalcul des données en fonction de la valeur max tableau
        Str_Val_2 = "=RC[-1]+sin(RC[-2]/R"
            Set Cel = Range("F1")
    Range("C20").FormulaR1C1 = Str_Val_1 & "17C6)"
    Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
                      '  For B = 17 To 17
                       ' Range("C20").FormulaR1C1 = Str_Val_1 & B & "C6)"
                      ' Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
                      '  Next B
           Next A
                       'Next X
    'copie des résultats (en J pour controler l'augmentation des resultats, en I pour la valeur max)
       shtTo.Range("I1").Offset(i - 1, 0).Value = shtFrom.Range("F17").Value
          shtTo.Range("J1").Offset(i - 1, 0).Value = shtFrom.Range("F18").Value
             shtTo.Range("b20:b79").Value = shtFrom.Range("c20:c79").Value
    Next i
      ' Application.ScreenUpdating = True
     MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Il me semble que certains offsets sont en trop.

    En particulier, quand tu as un offset sur une case statique(qui a ses coordonnées en dur dans le programme), il ne sert à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shtTo.Range("I1").Offset(i - 1, 0)
    c'est pareil que

    Et tu en as d'autres.


    Tu as aussi le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          For i = 1 To 50 ' compte le nombre de colonne a rapatrier
            decal = 1 * i 'si absence de cette ligne, alors la colonne n'est pas copiée
    (.../...)
    Next i
    comme tu ne te sers pas de i ailleurs, autant faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For decal = 1 To 50
    (.../...)
    next decal
    en faisant sauter la ligne de calcul de decal.



    Et sinon, pourquoi tu as mis en commentaires les screenupdating? Ils me semblent, eux, parfaitement utiles. Et j'en oublie sans doute encore pas mal.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Bonjour el slapper,

    Merci pour les remarques et commentaires.
    J’ai testé, et je constate que toutes les copies sont en H1 et non pas en descendant en fonction du décal. Ou alors je ne comprends pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     shtTo.Range("H1").Value = shtFrom.Range("F17").Value
    La remarque concernant le decal est pris en compte et le code est modifié en conséquence.
    Le screenupdating est involontairement mis en commentaire.

    Un grand merci par avance pour la suite.
    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
     Sub TestABCDE()
     
    Deb = Timer
       Application.ScreenUpdating = False
    'definition des variables
       Dim shtFrom As Worksheet, shtTo As Worksheet
       Dim A As Long, Str_Val_1 As String, Str_Val_2 As String, Cel As Range
    'initialisation du tableau
         Sheets("A").Range("a20:c79").ClearContents
     
          For decal = 1 To 50
     
     'copie successive des colonnes du tableau Z vers la colonne A20
      Set shtTo = Worksheets("A")
         Set shtFrom = Worksheets("A")
            shtTo.Range("A20:A79").Value = shtFrom.Range("L20:L79").Offset(0, decal).Value
     
                Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
                Set Cel = Range("F1")
     
    ' la formule est bouclée sur la totalité des valeurs de 20 à 100: A = Nb de N° a tester
          For A = 20 To 100
            Range("C20").FormulaR1C1 = Str_Val_1 & A & "C7)"
               Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
     
    'le résultat du test est copié dans la cellule en face de la valeur A
         Range("C12").Copy
              Cel.Offset(A - 1, 0).PasteSpecial Paste:=xlPasteValues
     
    ' recalcul des données en fonction de la valeur max tableau
        Str_Val_2 = "=RC[-1]+sin(RC[-2]/R"
            Set Cel = Range("F1")
     
    Range("C20").FormulaR1C1 = Str_Val_1 & "17C6)"
    Range("C20").AutoFill Destination:=Range("C20:C79"), Type:=xlFillDefault
     
           Next A
     
                   'copie des résultats (en J pour controler l'augmentation des resultats, en I pour la valeur max)
         shtTo.Range("I1").Offset(decal - 1, 0).Value = shtFrom.Range("F17").Value
          shtTo.Range("J1").Offset(decal - 1, 0).Value = shtFrom.Range("F18").Value
     
             shtTo.Range("b20:b79").Value = shtFrom.Range("c20:c79").Value
     
    Next decal
       Application.ScreenUpdating = True
     MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    Il me semble que certains offsets sont en trop.

    En particulier, quand tu as un offset sur une case statique(qui a ses coordonnées en dur dans le programme), il ne sert à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shtTo.Range("I1").Offset(i - 1, 0)
    c'est pareil que

    Attention aux conseils donnés...
    A chaque valeur de i, l'offset fera descendre d'une ligne.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Bonjour et bonne fête à tous,

    Un grand merci pour les conseils. Le code a probablement trouvé une certaine logique grâce a vous, mais reste toujours aussi lent, il doit encore rester quelques maladresses
    Apres plusieurs essais, je me retrouve avec ce nouveau code.

    Cordialement.
    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
    Sub TestB1()
    Deb = Timer
       Application.ScreenUpdating = False
    'Definition des variables
       Dim shtFrom As Worksheet, shtTo As Worksheet
       Dim A As Long, Str_Val_1 As String, Cel As Range
    'Initialisation du tableau
         Sheets("A").Range("A20:C3379").ClearContents
            For decal = 1 To 690
     'Copie successive des colonnes du tableau vers la colonne A20
      Set shtTo = Worksheets("A")
         Set shtFrom = Worksheets("A")
            shtTo.Range("A20:A3379").Value = shtFrom.Range("AD20:AD3379").Offset(0, decal).Value
                Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
                    Set Cel = Range("F1")
    ' La formule est bouclée sur la totalité des valeurs selectionnées
          For A = 20 To 469
            Range("C20").FormulaR1C1 = Str_Val_1 & A & "C7)"
               Range("C20").AutoFill Destination:=Range("C20:C3379"), Type:=xlFillDefault
    'Le résultat du test est copié dans la cellule en face de la valeur A
         Range("C12").Copy
              Cel.Offset(A - 1, 0).PasteSpecial Paste:=xlPasteValues
    'Recalcul des données en fonction de la valeur max tableau
         Range("C20").FormulaR1C1 = Str_Val_1 & "17C6)"
             Range("C20").AutoFill Destination:=Range("C20:C3379"), Type:=xlFillDefault
           Next A
    'Copie pour controler l'augmentation des resultats et incrémenter le test
         shtTo.Range("I1").Offset(decal - 1, 0).Value = shtFrom.Range("F17").Value
             shtTo.Range("B20:B3379").Value = shtFrom.Range("C20:C3379").Value
                 shtTo.Range("T20:T3379").Value = shtFrom.Range("C20:C3379").Value
          Next decal
              ActiveWorkbook.Save
                  Application.ScreenUpdating = True
                      MsgBox "J'ai bossé " & Timer - Deb & " seconde"
    End Sub

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour Pascal et bonjour à toutes et tous,

    J'ai un peu modifié ton dernier code mais je n'ai rien testé. Essai et dis moi si il y a une ammélioration. A mon avis, se sont tes copies de plages successives et l'insersion des formules qui prennent du temps, dans ce cas, je me demande si tu ne devrais pas te tourner vers des tableaux pour effectuer tous tes calculs et ensuite coller les résultats obtenus dans un range ? Enfin, c'est mon avis mais il te faudrais revoir tout ton 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
     
    Sub TestB1()
     
        Dim Fe As Worksheet
        Dim PlgTo As Range
        Dim PlgFrom As Range
        Dim A As Long
        Dim Str_Val_1 As String
        Dim Deb As Long
     
        Deb = Timer
     
        Application.ScreenUpdating = False
     
        Set Fe = Worksheets("A")
     
        With Fe
     
            Set PlgTo = .[A20:A3379]
            Set PlgFrom = .[AD20:AD3379]
     
            PlgTo.ClearContents
     
            'le début de la formule étant le même, il ne sert à rien de la
            'reconstruire 690 fois
            Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
     
            For decal = 1 To 690
     
                'Copie successive des colonnes du tableau vers la colonne A20
                PlgTo = PlgFrom.Offset(0, decal).Value
     
                'La formule est bouclée sur la totalité des valeurs selectionnées
                For A = 20 To 469
     
                    .[C20].FormulaR1C1 = Str_Val_1 & A & "C7)"
                    .[C20].AutoFill .[C20:C3379]
     
                    'Le résultat du test est copié dans la cellule en face de la valeur A
                    .[C12].Copy .Range("F" & A - 1)
     
                    'Recalcul des données en fonction de la valeur max tableau
                    .[C20].FormulaR1C1 = Str_Val_1 & "17C6)"
                    .[C20].AutoFill .[C20:C3379]
     
                Next A
     
                'Copie pour controler l'augmentation des resultats et incrémenter le test
                .[I1].Offset(decal - 1, 0).Value = .[F17].Value
     
                .[B20:B3379] = .[C20:C3379]
                .[T20:T3379] = .[C20:C3379]
     
            Next decal
     
        End With
     
        ActiveWorkbook.Save
        Application.ScreenUpdating = True
     
        MsgBox "J'ai bossé " & Timer - Deb & " seconde"
     
    End Sub
    Hervé.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Re,
    Bonjour et merci pour la proposition,

    J’ai essayé de « bidouiller » le code pour le faire fonctionner, mais je n’ai pas le niveau pour le faire. J’ai ajouté qqes commentaires mais je pense, comme vous le suggérez, je vais me tourner vers les variables tableaux.
    J’ai sortie les tutos « Conceptualisation des variables tableaux, Utiliser les variables tableaux et programmer efficacement VB-VBA » pour essayer de comprendre la programmation.
    Je clos le post et reviendrais par la suite si je bloque. Un grand merci à vous tous.
    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
    Sub TestB21()
     
        Dim Fe As Worksheet
        Dim PlgTo As Range
        Dim PlgFrom As Range
        Dim A As Long
        Dim Str_Val_1 As String
        Dim Deb As Long
     
        Deb = Timer
     
        Application.ScreenUpdating = False
     
        Set Fe = Worksheets("A")
     
        With Fe
     
            Set PlgTo = .[A20:A3379]
            Set PlgFrom = .[AD20:AD3379]
     
            PlgTo.ClearContents
     
            'le début de la formule étant le même, il ne sert à rien de la
            'reconstruire 690 fois
            Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
     
            For decal = 1 To 690
     
                'Copie successive des colonnes du tableau vers la colonne A20
                '1 seule colonne est rapatriée
                PlgTo = PlgFrom.Offset(0, decal).Value
     
                'La formule est bouclée sur la totalité des valeurs selectionnées
                For A = 20 To 469
     
                    .[C20].FormulaR1C1 = Str_Val_1 & A & "C7)"
                    .[C20].AutoFill .[C20:C3379]
     
                    'Le résultat du test est copié dans la cellule en face de la valeur A
                    'Ce n'est pas Le résultat du test mais la formule de C12 qui est copiée dans la cellule en face de la valeur A
                    .[C12].Copy .Range("F" & A)
     
                    'Recalcul des données en fonction de la valeur max tableau
                    .[C20].FormulaR1C1 = Str_Val_1 & "17C6)"
                    .[C20].AutoFill .[C20:C3379]
     
                Next A
     
                'Copie pour controler l'augmentation des resultats et incrémenter le test
                'Aucune copie n'est réalisée (pour controler l'augmentation des resultats et incrémenter le test)
                .[I1].Offset(decal - 1, 0).Value = .[F17].Value
     
                .[B20:B3379] = .[C20:C3379]
                .[T20:T3379] = .[C20:C3379]
     
            Next decal
     
        End With
     
        ActiveWorkbook.Save
        Application.ScreenUpdating = True
     
        MsgBox "J'ai bossé " & Timer - Deb & " seconde"
     
    End Sub

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Attention aux conseils donnés...
    A chaque valeur de i, l'offset fera descendre d'une ligne.
    Oooops, mille excuses

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

Discussions similaires

  1. [AC-2010] Help : dde correction formulaire avec code Vba/Sql
    Par anopaname dans le forum Access
    Réponses: 0
    Dernier message: 24/03/2014, 13h14
  2. [XL-2007] Correction d’un code
    Par apt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/09/2012, 21h55
  3. Correction de mon code vba svp
    Par njinkeu.mbakob dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2008, 12h21
  4. [VBA-E] Amelioration dun code
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 06/06/2007, 13h51
  5. VBA Excel- Modification des datalabels d´un graphe
    Par doringen dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/12/2006, 10h02

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