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 d'optimisation (boucle/structure de données) [XL-2007]


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
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par défaut Problème d'optimisation (boucle/structure de données)
    Bonjour à toutes et à tous,

    Je précise que je débute sur VBA et les macros (j'ai réalisé ma première macro la semaine passée).
    Ma première macro fonctionne comme je le souhaite, elle applique une série de calculs à une feuille excel et les insère dans un PowerPoint.

    Mon problème aujourd'hui est d'optimiser le code de ma macro dans la mesure où les calculs réalisés s'appliquent plusieurs fois à différents "sites" (notre variable). Une bonne partie du code au niveau des calculs est commun à tous les sites et est répété inutilement quelque part. Cependant une partie variable à chaque site intervient aussi dans le code.

    Un petit exemple:

    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
    'On filtre selon les sites (ici Argenteuil)
        ActiveSheet.Range("$A$1:$R$123785").AutoFilter Field:=13, Criteria1:= _
            "=*Argenteuil*", Operator:=xlAnd
           
            
    'On filtre selon le SSID
        ActiveSheet.Range("$A$1:$R$123785").AutoFilter Field:=14, Criteria1:= _
            "=DALocal", Operator:=xlOr, Criteria2:="=PRT-Oper"
           
            
    'On sélectionne les colonnes SNR et RSSI qu'on copie dans une nouvelle sheet
        Columns("Q:R").Select
        Selection.Copy
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Paste
        Application.CutCopyMode = False
      
     'On applique une formule excel pour obtenir le nombre total de case
        Range("E2").Select
        ActiveCell.FormulaR1C1 = "=COUNT(C[-4])"
       
     'On filtre le RSSI
        Columns("A:B").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$B$925492").AutoFilter Field:=2, Criteria1:="<=-73" _
            , Operator:=xlAnd
           
      'On copie les données filtrés dans une sheet2
        Selection.Copy
        Columns("H:H").Select
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Paste
       
        Range("E6").Select
        Application.CutCopyMode = False
       
     'On applique une autre formule avec condition pour savoir sur le nombre de cellule ayant RSSI<-73dBm combien ont un SNR<=20
        ActiveCell.FormulaR1C1 = "=COUNTIF(C[-4],""<=12"")"
        Sheets("Feuil1").Select
        Range("E39:E40").Select
        Range("E40").Activate
        Sheets("Feuil2").Select
        Selection.Copy
        Sheets("Feuil1").Select
        Range("E3").Select
       
     'On copie la valeur obtenue dans la sheet précédante
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("G3").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = "Mauvais"
    
    [etc suite d'instructions dans la même idée]
    Ici pour un site précis (Argenteuil) on a une partie de calculs commune à tous les 6 sites et une partie en rouge propre à ce site.

    Pour résoudre ceci j'ai pensé à créer autant de structures que de sites avec les informations propres à chaque site contenues dedans. Les informations qui diffèrent selon les sites sont principalement des critères de filtres, des ranges et des feuilles.
    Ensuite l'idéal serait d'appliquer une boucle qui parcourt ces structures et les injecte dans le "code commun". Je rappelle que je suis vraiment novice et je ne sait pas si c'est une solution possible, ni comment l'implémenter pour l'instant, quelle syntaxe etc...

    Voila je ne sais pas si vous avez des idées pour résoudre ce problème, je recherche des confirmations/infirmations sur une méthode qui marcherait... Quelques pistes seraient vraiment bienvenues.

    Je vous remercie de m'avoir lu, et j'espère pouvoir vous lire à mon tour!


    [edit] cette discussion a été vu une petite trentaine de fois pour l'instant sans que je reçoive la moindre réponse...
    Je voulais savoir si personne n'avait eu d'idées ou de pistes à proposer pour mon problème, ou si je l'ai mal exposé, si vous voulez plus d'informations, de précisions... etc

    Merci

    Antoine

  2. #2
    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,

    Un début à tester fait à partir de 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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
       Dim site As String, crit1 As String, crit2 As String, oper As Long
        site = "Argenteuil"
        crit1 = "=DALocal"
        crit2 = "= PRT-Oper"
        oper = xlOr
     
        'On filtre selon les sites (ici Argenteuil)
        ActiveSheet.Range("$A$1:$R$123785").AutoFilter Field:=13, Criteria1:= _
                                                       "=*" & site & "*", Operator:=xlAnd
     
     
        'On filtre selon le SSID
        ActiveSheet.Range("$A$1:$R$123785").AutoFilter Field:=14, Criteria1:= _
                                                       crit1, Operator:=oper, Criteria2:=crit2
     
     
        'On sélectionne les colonnes SNR et RSSI qu'on copie dans une nouvelle sheet
        Columns("Q:R").Select
        Selection.Copy
        Select Case site
        Case "Argenteuil", "Bezons"
            Sheets.Add After:=Sheets(Sheets.Count)
            ActiveSheet.Paste
            Application.CutCopyMode = False
        Case "Paris"
            ' …
        End Select
     
        'On applique une formule excel pour obtenir le nombre total de case
        Range("E2").Select
        ActiveCell.FormulaR1C1 = "=COUNT(C[-4])"
     
        'On filtre le RSSI
        Columns("A:B").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$1:$B$925492").AutoFilter Field:=2, Criteria1:="<=-73" _
                                                                            , Operator:=xlAnd
     
        'On copie les données filtrés dans une sheet2
        Selection.Copy
        Columns("H:H").Select
        Sheets.Add After:=Sheets(Sheets.Count)
        ActiveSheet.Paste
     
        Select Case site
        Case "Argenteuil", "Bezons"
            Range("E6").Select
        Case "Paris"
            ' …
        End Select
        Application.CutCopyMode = False
     
        'On applique une autre formule avec condition pour savoir sur le nombre de cellule ayant RSSI<-73dBm combien ont un SNR<=20
        ActiveCell.FormulaR1C1 = "=COUNTIF(C[-4],""<=12"")"
        Select Case site
        Case "Argenteuil", "Bezons"
            Sheets("Feuil1").Select
            Range("E39:E40").Select
            Range("E40").Activate
            Sheets("Feuil2").Select
            Selection.Copy
            Sheets("Feuil1").Select
            Range("E3").Select
        Case "Paris"
            ' …
        End Select
     
        'On copie la valeur obtenue dans la sheet précédante
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                                                        :=False, Transpose:=False
        Select Case site
        Case "Argenteuil", "Bezons"
            Range("G3").Formula = "Mauvais"
        Case "Paris"
            ' …
        End Select
        Application.CutCopyMode = False
     
        [etc suite d    'instructions dans la même idée]
    Mais le mieux serait que tu fasses une feuille Paramètres avec toutes les données variables des sites.
    Il te suffit de chercher la ligne de ton site, ensuite tu récupères le paramètre dont tu as besoin dans sa colonne.
    Le plus souvent .select est inutile, regarde sur Range("G3")

    eric

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par défaut
    Bonjour,

    J'ai essayé la méthode Select case mais il se trouve que elle ne s'adapte pas vraiment à mon code (puisqu'il faut effectuer les calculs pour tous les sites, on commence par filtrer les sites pour ensuite faire les calculs. La linéarité des cases ne permet pas cela, ou je m'y suis mal pris mais à priori je ne crois pas...)

    Eric quand tu parles de feuille paramètre, tu parles bien d'une feuille excel où toutes les infos des sites seraient renseignées?


    Sinon l'idéal, j'essaye d'avancer là dessus, ce serait une boucle for each appliquée sur les sites.

    Et pour cela j'aimerais que chaque site ne soit pas un string mais une structure (ou classe, ou tableau..?) je ne sais pas si c'est le bon mot, mais le but est que chaque site contienne les infos qui lui sont propres.
    Par exemple, dans la classe Argenteuil on aurait les critères de filtres, les ranges à appliquer, les numéros de sheets etc.

    Ainsi on pourrait avec cette boucle parcourir tous les sites, et pour les sheets et range on met une variable dans la boucle, dont la valeur pour chaque site est renseignée dans chaque "classe?".

    Pensez vous cette méthode applicable? Et peut etre que l'objet à utiliser est une classe de type personnalisée? (je viens de voir le tuto à ce sujet)

    Merci par avance

    Antoine


    [edit] Après avoir lu ce très bon tuto sur les classes, je vais partir sur un Type personnalisé.

    Voici le début:

    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
     'On définit le type
    Public Type Sites
    Nom As String
    Data As String
    Voix as String
     
    etc...
     
    End Type
     
    'Puis dans un tableau on renseigne les caractéristiques pour ce type
     
    Sub DefinirSites()
     
    Dim Site(5) As Sites
     
    With Site(0)
    .Nom = "Argenteuil"
    .Data = "<>*TelephonieWifi*"
    .Voix = "*TelephonieWifi*"
     
    etc
     
    End With
     
    End Sub
     
    'Puis on arrive à l'implémentation
     
    Sub BonMoyenMauvais()
     
    For each i in Sites
     
    et là...
    Mon problème est sur la boucle, je vais me renseigner davantage, mais j'ai peur de ne pas pouvoir faire certaines choses.
    Et niveau syntaxe si je veux utiliser un critère du tableau, je dois écrire Site(i).Nom par exemple?
    Une dernière question, la boucle for each s'applique bien à un seul i à la fois?

  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,

    un exemple avec une feuille Paramètres.
    eric
    Fichiers attachés Fichiers attachés

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Par défaut
    Bonjour,

    Merci pour ton aide Eric, je vois l'idée mais je ne pense pas que la feuille paramètre colle avec ce que je veux comme optimisation.

    Antoine

  6. #6
    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,

    mettre les paramètres sur une feuille est plus souple en cas d'évolution. Pas besoin d'aller dans le code pour modifier.
    Et tu vois qu'on peut tout aussi bien récupérer des valeurs, ou bien les interpréter en tant que ranges.
    Mais bon, c'est toi qui juge ce qui est le mieux pour ton projet.

    eric

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

Discussions similaires

  1. problème lecture fichier avec structures de données
    Par hannibal007 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2013, 19h51
  2. Réponses: 2
    Dernier message: 09/08/2008, 13h30
  3. Réponses: 1
    Dernier message: 10/07/2008, 15h01
  4. Problème structure de données
    Par cocol dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 17/04/2008, 13h30
  5. [VBA E] Problème de boucles - Structure de code
    Par proutfailelap1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/04/2007, 07h12

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