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 :

Tableaux et Variables tableaux


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Tableaux et Variables tableaux
    Bonjour à tous,

    Je reviens encore vers vous pour essayer de Passer mon code en tableau.
    J’ai construis (avec l’aide de tout le monde, mon niveau en VBA est faible) un programme qui fonctionne. Car contre il a l’inconvénient d’avoir un temps de traitement voisin de 7h, Certes la travail se fait de nuit mais c’est quand même trop long. J’ai commencé par lire les tutos à disposition traitant des tableaux et des variables tableaux mais j’avoue avoir du mal à comprendre. Apres une multitude d’essais, j’arrive juste a lancer une formule et réaliser quelques boucles simples, par contre je ne sais pas s’il est possible de réaliser les fonctions dont j’ai besoin pour mon programme (recherche du max et le nombre qui a donné ce max).
    Le plus gros consommateur de temps (je pense) est le test de la boucle de 1000 valeurs par colonne (For "a" ligne 40), je balaye la même formule de 0 à 1 avec un pas de 0.001 pour en déterminer le résultat maxi d’un test.

    Un grand merci par avance
    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
    Sub TestC1()
     
    Deb = Timer
     
       Application.ScreenUpdating = False
     
       Dim shtFrom As Worksheet, shtTo As Worksheet
       Dim a As Long, Str_Val_1 As String, Cel As Range
       Dim Moyx As Single
       Dim Moyy As Single
       Dim Moyz As Single
       Dim DSx As Single
       Dim DSy As Single
     
    Sheets("C").Range("A20:F3379").ClearContents
     
            For decal = 1 To 690
     
     
            Set shtTo = Worksheets("C")
            Set shtFrom = Worksheets("C")
     
    'La formule de la colonne a tester est glissée en derniere ligne
     
            Range("AX20").Offset(0, decal).Select
            Selection.AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
     
    'Copie successive des colonnes du tableau vers la colonne A20
     
            shtTo.Range("A20:A3379").Value = shtFrom.Range("AX20:AX3379").Offset(0, decal).Value
            Str_Val_1 = "=RC[-1]+sin(RC[-2]/R"
            Set Cel = Range("F1")
     
    'Pour gagner en mémoire, on efface la formule de la colonne a tester
     
            Range("AX21:AX3379").Offset(0, decal).ClearContents
     
    'La formule en A20 est testée de 0 à 1 avec un pas de 0.001 pour determiner le résultat max du test
     
                 For a = 20 To 1019
     
                 Range("C20").FormulaR1C1 = Str_Val_1 & a & "C7)"
                 Range("C20").AutoFill Destination:=Range("C20:C3379"), Type:=xlFillDefault
     
    'Test, évite de passer par Formule sur feuille Excel
     
                 Moyx = WorksheetFunction.Average(Range("C20:C2369"))
                 Moyy = WorksheetFunction.Average(Range("C2370:C3309"))
                 Moyz = WorksheetFunction.Average(Range("C20:C3309"))
                 DSx = WorksheetFunction.DevSq(Range("C20:C2369"))
                 DSy = WorksheetFunction.DevSq(Range("C2370:C3309"))
     
                 'Le résultat du test est copié dans la cellule en face de la valeur A
     
                 Range("E1") = 3288 * ((2350 * (Moyx - Moyz) ^ 2) + (940 * (Moyy - Moyz) ^ 2)) / (DSx + DSy)
                 Range("E1").Copy
                 Cel.Offset(a - 1, 0).PasteSpecial Paste:=xlPasteValues
     
                'Recalcul des données en fonction de la valeur max du test
     
                 Range("C20").FormulaR1C1 = Str_Val_1 & "1C7)"
                 Range("C20").AutoFill Destination:=Range("C20:C3379"), Type:=xlFillDefault
     
                 Next a
     
                 'Copie pour controler l'augmentation des resultats et incrémenter le test
     
                 'Evite de passer par Formule sur feuille Excel
     
            Range("G1").FormulaLocal = "=DECALER(F19;EQUIV(MAX(F20:F1019);F20:F1019;0);1)"
            Range("G1").Value = Range("G1").Value
     
            shtTo.Range("I1").Offset(decal - 1, 0).Value = shtFrom.Range("G1").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

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Supprime le Select et le Selection ce n'est absolument pas nécessaire et cela ralenti le process.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Range("AX20").Offset(0, decal).Select
    Selection.AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
    Par exemple, au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Range("A4").Select
    Selection.Value = "Toto"
    Ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("A4").Value = "Toto"
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    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 à tous,
    J’ai pris en compte la recommandation.
    J’ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Range("AX20").Offset(0, decal).Select
      Selection.AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("AX20").Offset(0, decal).AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
    Un grand merci pour la recommandation mais je pense que cela ne résoudra pas le temps de traitement de 7 heures.

    Cordialement.

  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 à tous,

    Je relance le post, quelqu'un peut-il me donner une piste pour passer en variables tableaux.

    Merci par avance.

  5. #5
    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,
    Pour tenter de t'aider, il faut déjà comprendre et y aller dans l'ordre.

    Tu as des variables non déclarées à moins qu'elle soient ailleurs en "Public" ? => "deb" et "decal"

    A la lecture du début de ton code, ces lignes m'ont sauté aux yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set shtTo = Worksheets("C")
    Set shtFrom = Worksheets("C")
    Pourquoi deux variables pour le même objet ?

    Maintenant, si on commence à décortiquer ta boucle, ci-dessous :
    qu' y a t'il dans "AX20" pour que tu fasses une recopie incrémentée, tu peux certainement te passer de la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("AX20").Offset(0, decal).AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
    Après reflexion, je comprends de moins en moins, ce n'est pas AX20 mais "Range("AX20").Offset(0, decal)", là expliques-toi
    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...)

  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 et merci de vous occuper de mon problème.

    Concernant les variables (Deb et decal), c’est un oubli qui est maintenant intégré bien que je ne sais pas exactement comment déclarer le Deb.
    Concernant Set shtTo et shtFrom, je reconnais que l’instruction est plus appropriée pour des copier/coller sur des feuilles différentes mais je suis néophyte en programmation et j’ai la mauvaise habitude de récupérer des bouts de code sur différents « posts » afin de l’adapter a mes besoins. Maintenant s’il existe une méthode plus appropriée, je suis preneur.
    Concernant :
    Range("AX20").Offset(0, decal).AutoFill Destination:=Range("AX20:AX3379").Offset(0, decal), Type:=xlFillDefault
    Petite explication. Les cellules AX20 à ABL20 possèdent une formule que je fais glisser en fonction du decal jusqu’en 3379, c’est un artifice qui me permet de faire baisser la taille en Ko du fichier. Je garde uniquement la ligne AX20 à ABL20 (690 colonnes de test) et efface AX21 à ABL3379.
    J’ai comparé un essai avec toutes les données et un avec uniquement la ligne AX20 à ABL20 et le temps de traitement est beaucoup plus long dans le premier cas.

    J’espère avoir été assez clair dans mes explications

    Trés cordialement

Discussions similaires

  1. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  2. Les tableaux et variables
    Par nemesys971 dans le forum C
    Réponses: 11
    Dernier message: 25/05/2006, 22h46
  3. Réponses: 12
    Dernier message: 03/04/2006, 19h08
  4. [Tableaux] Récuperer variable dans une fonction
    Par amarcil dans le forum Langage
    Réponses: 12
    Dernier message: 12/02/2006, 10h56
  5. variables tableaux
    Par kernel57 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/12/2005, 11h03

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