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 Max VBA [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Par défaut Problème Max VBA
    Bonjour à tous,

    j'ai créé un petit utilitaire me permettant de traiter des bases de données.

    Sur cette base de données (en PJ), se trouve plusieurs type de données sur lesquelles j'effectue des opérations différentes;
    Le but étant de recréer un tableau mensuel avec chaque données:

    Pour les valeurs de type "h" "kWh", on fait la somme mensuelle (si la valeur est comprise entre 2 dates spécifiées, on l'ajoute à la case correspondante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            If Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) >= 43435 _
            And Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) < 43465 _
            And (Sheets("ENEDIS").Cells(2 + j, 6) <> "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) <> "W") Then
     
                With Cells(2 + j, 91)
                    .Value = .Value + Cells(2 + j, 7 + i * 3)
                End With
    Pour les valeurs de type "VA" "W", je voudrai récupérer la max (si la valeur est comprise entre 2 dates spécifiées, on récupère la valeur max).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ElseIf Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) >= 43435 _
            And Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) < 43465 _
            And (Sheets("ENEDIS").Cells(2 + j, 6) = "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) = "W") Then
     
                With Cells(2 + j, 91)
                    .Value = WorksheetFunction.Max(Cells(2 + j, 91), Cells(2 + j, 7 + i * 3))
                End With
    Le but étant de récupérer la première valeur qui se rajoutera dans le tableau, et si une seconde valeur dans la même plage de temps (le même mois) est supérieur, de la comparer à la valeur précédente et de la remplacer. Et ainsi de suite.
    Le problème, c'est que cette formule réalise une somme des valeurs... et je n'arrive pas à comprendre pourquoi...

    J'espère avoir été suffisamment claire,

    Merci par avance
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    J'ai pas bien compris la fin de ta demande mais concernant la somme et le max pourquoi n'utilises-tu pas les formules BD : BDSOMME, et BDMAX répondent parfaitement à ta demande

    Peux-tu donner plus de détail concernant ce que tu as dis

    Le but étant de récupérer la première valeur qui se rajoutera dans le tableau, et si une seconde valeur dans la même plage de temps (le même mois) est supérieur, de la comparer à la valeur précédente et de la remplacer. Et ainsi de suite.
    Le problème, c'est que cette formule réalise une somme des valeurs... et je n'arrive pas à comprendre pourquoi...
    A bientôt

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 419
    Par défaut
    Bonjour,

    Un code amélioré:
    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    Sub Traitement_masse_ENEDIS()
       Dim i As Long, j As Long, k As Long
       Dim nb_rows As Integer, nb_col As Long
       Dim nb_sites As Integer
       Dim Liste_RAE As Range
       Dim Liste_RAE_ENEDIS As Range
       Dim dDate As Date
       '--- recopie feuille active avant traitement avec ENEDIS comme nom
       ActiveSheet.Copy after:=ActiveSheet
       ActiveSheet.Name = "ENEDIS"
       '---
       nb_rows = ActiveSheet.UsedRange.Rows.Count
       For k = 1 To 10
          For i = 1 To nb_rows * 1.5
             If Cells(i, 5) = "DQ" Then
                Rows(i).Delete             '--- supprime ligne contenant DQ en colonne 5
                i = i - 1                  '--- remonter d'une ligne (pour supprimer ligne suivante avec DQ)
                Debug.Print "ligne " & i & " supprimée"
             End If
          Next i
       Next k
       '--- Separation des groupes
       Cells(1, 1).Activate
       nb_rows = ActiveSheet.UsedRange.Rows.Count
       For i = 2 To nb_rows             '--- commence en ligne 2, 1er groupe
          If Cells(i, 1) <> Cells(1 + i, 1) And Cells(i, 1) <> 0 Then
             ActiveSheet.Rows(i + 1).Insert
          End If
       Next i
       '--- Creation Tableau
       nb_rows = ActiveSheet.UsedRange.Rows.Count
       nb_col = ActiveSheet.UsedRange.Columns.Count
       Range(Cells(2, 4), Cells(nb_rows, 4)).Copy _
          Destination:=Range(Cells(2, 90), Cells(nb_rows, 90))  '--- copie colonne 4
       '---
       For j = 2 To nb_rows             '--- commence à la ligne 2
          For i = 7 To nb_col Step 3    '--- commence en colonne 7 et avance par pas de 3: 7,10,13, ...
             dDate = Cells(j, i + 1)                            '--- en colonne 8,11, 14,...
             'Debug.Print dDate, Month(dDate), Year(dDate)
             If Year(dDate) = 2018 Then                         '--- uniquement année 2018
                k = 103 - Month(dDate)                          '--- colonne du mois
                If Cells(j, 6) = "VA" Or Cells(j, 6) = "W" Then
                   Cells(j, k) = WorksheetFunction.Max(Cells(j, k), Cells(j, i))  '--- max
                Else
                   Cells(j, k) = Cells(j, k) + Cells(j, i)                        '--- cumul
                End If
             End If
          Next i
       Next j
       '--- titre tableau
       Range("CM1") = "Decembre"
       Range("CN1") = "Novembre"
       Range("CO1") = "Octobre"
       Range("CP1") = "Septembre"
       Range("CQ1") = "Aout"
       Range("CR1") = "Juillet"
       Range("CS1") = "Juin"
       Range("CT1") = "Mai"
       Range("CU1") = "Avril"
       Range("CV1") = "Mars"
       Range("CW1") = "Fevrier"
       Range("CX1") = "Janvier"   '--- colonne 102
       Range("CY1") = "Total"     '--- colonne 103
       '---
       For i = 2 To nb_rows
          '--- colonne 103: "Total"
          If Cells(i, 6) = "Wh" Then
             Cells(i, 103) = Application.WorksheetFunction.Sum(Range(Cells(i, 91), Cells(i, 102))) / 1000
             Cells(i, 104) = "k" & (Cells(i, 6))
          ElseIf Cells(i, 6) = "W" Or Cells(i, 6) = "VA" Then
             Cells(i, 103) = Application.WorksheetFunction.Max(Range(Cells(i, 91), Cells(i, 102))) / 1000
             Cells(i, 104) = "k" & (Cells(i, 6))
          ElseIf Cells(i, 6) <> "" Then
             Cells(i, 103) = Application.WorksheetFunction.Sum(Range(Cells(i, 91), Cells(i, 102)))
             Cells(i, 104) = (Cells(i, 6))
          End If
       Next
       Stop           '--- instruction à supprimer après vérification
       '--- DEL base ------- pourquoi à la fin et pas avant de faire les calculs ?
       For k = 2 To nb_rows
          If Cells(k, 3) = "DI000001" _
             And (Cells(k + 1, 3) = "FC000010" Or Cells(k + 1, 3) = "FC000023") Then
             '--- attention aux parenthèses
             '--- If X and (Y or Z)  n'est pas la même chose que  If X and Y or Z
             '--- exemple If True and True or False ci dessous
             If Cells(k - 1, 103) <= Cells(k, 103) Then      '--- 103 = colonne CY
                '--- pas d'erreur ?
                Cells(k - 1, 3).EntireRow.Delete      '--- supprime ligne au-dessus de "DI000001"
             Else
                '--- pas d'erreur ?
                Cells(k, 3).EntireRow.Delete  '--- supprime ligne "DI000001"
                Cells(k, 3).EntireRow.Delete  '--- supprime ligne "FC000010" ou "FC000023"
             End If
          End If
       Next k
    End Sub
    Je n'ai pas compris la dernière partie DEL base. A vérifier.

    Pour le reste, il faut exploiter l'option Step dans l'instruction For (exemple: For k = 1 To n Step 3) et faire attention aux instructions IF avec des AND et OR. Il est souvent préférable de les décomposer en plusieurs IF successifs que de tout mettre sur une ligne.

    Bonne continuation.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre habitué
    Femme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Par défaut
    Bonjour,

    Merci pour le retour.

    Pour essayer de faire plus simple :

    En colonne F ("Grandeur Physique"), j'ai plusieurs type de valeurs récurrentes : "h", "kWh", "VA" et "W".

    A partir de la colonne G , on retrouve des valeurs mesurés sur une période donnée (exemple pour G7 : 1 620 kWh du 07/12/2018 au 07/01/2019 - les colonnes H et I indiquant la période de mesure, et ainsi de suite).


    Mon but est de recupérer ces valeurs mesurées et de les synthetiser dans un tableau mois par mois (G7 correspondra au mois de Décembre par exemple - Colonne CM une fois la macro lancée).

    Le premier problème, est que sur certains Groupes (Colonne A), on peut avoir plusieurs mesures pour un même mois. Il faut donc les additionner dans la même cellule du tableau de synthèse.

    J'ai plus ou moins contourné le probème avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            If Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) >= 43435 _
            And Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) < 43465 _
            And (Sheets("ENEDIS").Cells(2 + j, 6) <> "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) <> "W") Then
     
                With Cells(2 + j, 91)
                    .Value = .Value + Cells(2 + j, 7 + i * 3)
                End With
    A comprendre : Si la cellule 2 + j, 8+i*3) est supérieure ou égale à 43435 (date numérique équivalente au 01/12/2018) et inférieure à 43465 ((date numérique équivalente au 31/12/2018), et que la valeur de la colonne G est différente de "VA" ou "W", alors on additionne la valeur selectionnée à la valeur de la cellule du tableau de synthèse.
    Ainsi si plusieurs valeurs sont dans la même plage de temps (ici comprise entre le 01/12 et le 31/12), elles seront additionnées.


    Le problème, c'est que pour les valeurs de type "VA" et "W", je ne veux pas faire une somme si il y a a plusieurs valeurs pour un même mois, mais récupérer la valeur maximale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ElseIf Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) >= 43435 _
            And Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) < 43465 _
            And (Sheets("ENEDIS").Cells(2 + j, 6) = "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) = "W") Then
     
                With Cells(2 + j, 91)
                    .Value = WorksheetFunction.Max(Cells(2 + j, 91), Cells(2 + j, 7 + i * 3))
                End With
    A comprendre : Si la cellule 2 + j, 8+i*3) est supérieure ou égale à 43435 (date numérique équivalente au 01/12/2018) et inférieure à 43465 ((date numérique équivalente au 31/12/2018), et que la valeur de la colonne G est égale à "VA" ou "W", alors on récupère la valeur max entre la cellule selectionnée et la cellule du tableau de synthèse maximum (qui normalement aura récupéré la valeur maximum précédente.

    Exemple groupe L : Cellule AN 153 = 449 000 W (du 06/02 au 01/03). On compare à la valeur du tableau de synthèse (CW153) (qui commence à 0) 449 000 > 0, donc CW153 devient 449 000.
    La prochaine plage de mesure est du 01/02 au 06/02, donc encore en février. On récupère la valeur (AQ153 = 459 000) et on compare à nouveau à la cellule du tableau de synthèse (CW153). 459 000 > 449 000, donc CW153 devient 459 000.
    Et ainsi de suite, jusqu'à ce qu'il n'y ai plus de valeur mesurée dans le même mois (dans ce cas on passe au suivant)

    Le problème et que cette ligne de code ne fonctionne pas et m'additionne les valeurs du même mois au lieux de récupérer le max...

    Merci !

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bonjour,
    Doublon: https://www.developpez.net/forums/d1.../#post10801810

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And (Sheets("ENEDIS").Cells(2 + j, 6) <> "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) <> "W") Then
    est toujours vrai, donc tu ne passes jamais dans le ElseIf qui suit.
    Peut-être que remplacer le Or par And résoudrait ton problème (valeur différente de VA ET différente de W)...

  6. #6
    Membre habitué
    Femme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2019
    Messages : 10
    Par défaut
    Merci pour les différents retours !

    EricDgn, ton code fonctionne, je te remercie.

    Je ne connaissais pas la procédure Step, d'où mon "bricolage" sur la boucle. Je ne saisie pas encore bien toutes les formules que tu as utilisé mais je vais me pencher plus en détail dessus afin de comprendre la syntaxe.
    Concernant la partie "DEL BASE", c'est une partie de la suite de la macro, qui me permet de pousser un peu plus le traitement de la base de données. Je ne l'ai pas intégrée entièrement car celle ci fonctionne et ne voulait pas alourdir la demande.



    Zenpbb, je m'excuse pour le doublon, c'est une mauvaise manip' de ma part ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And (Sheets("ENEDIS").Cells(2 + j, 6) <> "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) <> "W") Then
    Il est possible que j'ai mal écrit mon code, mais si la cellule ciblée (en l'occurence (2+j,6) est différente de "VA" ou "W", comme par exemple des valeurs "h" ou kWh", le code devrait se déclencher ? de la forme suivante : X and (Y or Z)



    Encore merci, bonne journée

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 242
    Par défaut
    Bonsoir,
    As-tu un exemple de valeur de la cellule Sheets("ENEDIS").Cells(2 + j, 6) pour laquelle l'expression suivante est fausse ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("ENEDIS").Cells(2 + j, 6) <> "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) <> "W"
    Ça ne correspond pas à vraiment à
    X and (Y or Z)
    car ici Y et Z sont liés, il y a toujours au moins un des un des deux qui est vrai.

    Quand tu dis
    ...et que la valeur de la colonne G est différente de "VA" ou "W"
    , tu devrais dire
    ...et que la valeur de la colonne G est différente de "VA" et différente de "W"
    Pour simplifier, tu peux modifier ton code ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) >= 43435 _
        And Sheets("ENEDIS").Cells(2 + j, 8 + i * 3) < 43465 Then
            If (Sheets("ENEDIS").Cells(2 + j, 6) = "VA" Or Sheets("ENEDIS").Cells(2 + j, 6) = "W") Then
                ... ' cas "VA" ou "W"
            Else 
                .... 'cas complémentaire : ni "VA" ni "W" (c'est à dire pas "VA" ET pas "W")
            End If
    End If

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

Discussions similaires

  1. Problème Max VBA
    Par askorps dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/03/2019, 10h23
  2. Problème EXCEL VBA
    Par olivierm34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/03/2007, 23h52
  3. Problème valeurs[VBA]
    Par Yanmeunier dans le forum Access
    Réponses: 1
    Dernier message: 18/05/2006, 15h17
  4. Problème de VBA de passage de 2000 à 2002
    Par Oberown dans le forum Access
    Réponses: 9
    Dernier message: 10/05/2006, 14h51
  5. problème avec VBA
    Par Delph dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2002, 13h15

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