[VBA/Excel] Trouver les grandes valeurs d'un

Fermé
apt - 29 mai 2012 à 17:42
 apt - 6 juin 2012 à 01:08
Bonjour à tous,

J'essaye de trouver les trois grandes valeurs pour une même données dans la colonne A (Noms) avec ce code, mais j'ai une erreur sur RedimPreserve :

Sub GrandesValeurs()
    Dim D(), R()

    Set d1 = CreateObject("Scripting.Dictionary")
    R = Range("A2:E" & [A65000].End(xlUp).Row)

    For Each c In Range("A2", [A65000].End(xlUp))
        temp = c.Value
        If Not d1.exists(temp) Then
            d1.Add temp, temp
        End If
    Next c
    D = Application.Transpose(d1.keys)
    
    'ICI ERREUR !!!
    ReDim Preserve D(UBound(D), UBound(R, 2) - 1)  '-1 colonne objet
    
    temp = 0    'NCS
    temp1 = 0    'QS
    temp2 = 0    'QT

    For i = LBound(D) To UBound(D)
        For j = LBound(R) To UBound(R)
            If D(i, 1) = R(j, 1) Then
                L1 = j: L2 = j
                If R(j, 4) > temp1 Then
                    temp1 = R(j, 4)
                    L1 = j
                End If
                If R(j, 5) > temp2 Then
                    temp2 = R(j, 5)
                    L2 = j
                End If
            End If
        Next j
        If R(L2, 2) > R(L1, 2) Then temp = R(L2, 2) Else temp = R(L1, 2)
        D(i - 1, 2) = temp: D(i - 1, 3) = temp1: D(i - 1, 4) = temp2
    Next i
    MsgBox "Val QS = " & temp1 & ", à la ligne L1=" & L1 & vbCrLf & _
           "Val QT = " & temp2 & ", à la ligne L2=" & L2 & vbCrLf & _
           "Val NCS = " & temp

    Range("G2").Resize(UBound(D), 4) = D
End Sub


Une correction ?

Merci d'avance.

15 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 30/05/2012 à 10:18
Bonjour

Apparement, il faudrait que tu appelles un 3° tableau (j'ai essayé une petite maquette)
dim tablo()  

ReDim Preserve tablo(1 to UBound(D), 1 to UBound(R, 2) - 1)  

mais je ne comprends pas bien ton UBound(R, 2): j'aurais tendance à écrire Ubound(R) mais je n'ai pas trop regardé le but ton code, donc...


Michel
1
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 289
Modifié par Bidouilleu_R le 1/06/2012 à 18:11
Type tabloStructure 
  Tab_1 As Integer 
  Tab_2 As Integer 
  Tab_3 As Integer 

End Type 
Sub test2() 
Dim monTablo() As tabloStructure 

ReDim monTablo(0) 
ReDim Preserve monTablo(3) 

monTablo(1).Tab_1 = 4 
monTablo(2).Tab_2 = 5 
monTablo(3).Tab_3 = 10 

MsgBox monTablo(1).Tab_1 
MsgBox monTablo(1).Tab_2 
MsgBox monTablo(1).Tab_3 
End Sub 




c'est une proposition, comme l'a fait remarquer michelM

moi aussi je pense qu'il te faut trois tableaux.

est comme tu n'as pas le droit de redimensionné un tableau triple.
il faut rusé avec un tableau structuré.

je t'ai laissé un exemple.

A+
1
Bonsoir à tous,

Pour ceux qui sont intéressés par ce sujet, voila un code qui fonction, et ne reste qu'à rectifier la mise en forme :


Sub MaxVal()
    Dim LastLg As Integer
    Dim LastRw As Integer

    With Sheets("feuil1")
        '.Range("J1:M" & .[A65000].End(xlUp).Row).Clear
        .Range("J1:M" & .[A65000].End(xlUp).Row).Delete Shift:=xlUp
        
        LastLg = .Range("A" & Rows.Count).End(xlUp).Row
        .Range("A1:A" & LastLg).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=.Range( _
                                                                                  "J1"), Unique:=True
        .[K1] = .[B1]
        .[L1] = .[F1]
        .[M1] = .[G1]

        With .Range("J1:M1")
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
        ' Ca ne marche pas encore !!
        .Range("J1:M1").Interior.ColorIndex = .[A1].Interior.ColorIndex

        LastRw = .Range("J" & Rows.Count).End(xlUp).Row

        ' Ca ne marche pas encore!!
        With .Range("J1:M" & LastRw)
            With .Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlHairline
            End With
        End With

        MsgBox " LastLg = " & LastLg

        .Range("A2:A" & LastLg).Name = "Objet"
        .Range("B2:B" & LastLg).Name = "NCS"
        .Range("F2:F" & LastLg).Name = "QS"
        .Range("G2:G" & LastLg).Name = "QT"
    End With

    'SI(J2<>"";MAX(MAX(SI((A$2:A$33=J2)*(F$2:F$33=L2);B$2:B$33));MAX(SI((A$2:A$33=J2)*(G$2:G$33=M2);B$2:B$33)));"")
    Range("K2").FormulaArray = _
    "=IF(J2<>"""",MAX(MAX(IF((Objet=J2)*(QS=L2),NCS)),MAX(IF((Objet=J2)*(QT=M2),NCS))),"""")"
    Range("K2").AutoFill Destination:=Range("K2:K" & LastLg)

    'SI($J2<>"";MAX(SI(($A$2:$A$33=$J2)*($B$1:$G$1=L$1);$B$2:$G$33));"")
    Range("L2").FormulaArray = _
    "=IF($J2<>"""",MAX(IF((Objet=$J2)*($B$1:$G$1=L$1),$B$2:$G$" & LastLg & ")),"""")"
    Range("L2").AutoFill Destination:=Range("L2:L" & LastLg)

    '=SI($J2<>"";MAX(SI(($A$2:$A$33=$J2)*($B$1:$G$1=M$1);$B$2:$G$33));"")
    Range("M2").FormulaArray = _
    "=IF($J2<>"""",MAX(IF((Objet=$J2)*($B$1:$G$1=M$1),$B$2:$G$" & LastLg & ")),"""")"
    Range("M2").AutoFill Destination:=Range("M2:M" & LastLg)

    Range("L2:L" & LastLg).NumberFormat = "0.00%"
    Range("M2:M" & LastLg).NumberFormat = "0.00%"

End Sub


:)
1
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
29 mai 2012 à 17:47
Tu définis D comme type Variant pour ensuite le redéfinir en tableau avec le mot clé Preserve.
Preserve est utilisé pour garder les données d'un tableau tout en changeant sa taille.
Essaie de définir D la première fois en tant que tableau et non en type Variant, cela devrait fonctionner.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonsoir linkcr15,

Et :

Dim D()

ne suffisait-elle pas pour dire à Excel que c'est un tableau, ou il y a d'autres définitions ?
0
Bonjour,

Voila un exemple pour le test :

http://cjoint.com/?BEFiEIj1y5Z
0
Salut,

Personne n'a essayer cet exemple :

http://cjoint.com/?BEFiEIj1y5Z
0
Bonsoir,

J'attends toujours une solution.

Merci.
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 216
Modifié par eriiic le 2/06/2012 à 01:29
Bonsoir,

perso je n'ai pas d'erreur sur le redim de ton fichier exemple, vu que tu l'as renommé tbl...

Sur ton post 1 :
D = d1.Keys 'Obtient les éléments
ReDim Preserve D(1 To UBound(D), 1 To UBound(R, 2) - 1)
D n'a qu'une seule dimension et tu cherches à redimensionner la 2nde.

Dans ton code ça passe mais :
D = d1.Keys 'Obtient les éléments, D a 1 dimension
ReDim Preserve Tbl(1 To UBound(D), 1 To UBound(R, 2) - 1) , Tbl a 2 dimensions
Tbl = D ' Tbl repasse à 1 dimension

Puisque tu as les formules, pourquoi ne fais-tu pas application.max(....) ou evaluate(formule) ?

eric
0
Bonsoir Bidouilleu_R, eriic

Bidouilleur : Ou est le fichier exemple pour voir ?

eriic : C'est ça solutionne mon problème, qu'elle soit la bienvenu

;)
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 216
2 juin 2012 à 02:05
et le problème du nombre de dimensions ne t'interpelle pas ?
eric
0
Re,

eriiic : j'aimerais avoir les deux plus grandes valeurs pour la colonne F et G pour un même objet.

Pour la colonne B, elle ne sera déterminée qu'après avoir eu le max de la colonne F et G et connaitre les valeurs de NCS correpondantes pour extraire la plus grande valeur entre eux.

Voila !
0
Bonsoir,

Un essai avec encore des erreurs :

Sub GrandesValeurs()
    Dim D() As Variant, R() As Variant
    Dim d1 As Object
    Dim C As Range    '! Single, #DOuble
    Dim temp$, temp1!, temp2!, L1%, L2%, i As Byte, j As Byte
    Dim temp11!, temp22!, NS$
    Dim Tbl() As tabloStructure

    Set d1 = CreateObject("Scripting.Dictionary")
    R = Range("A2:G" & [A65000].End(xlUp).Row)

    For Each C In Range("A2", [A65000].End(xlUp))
        temp = C.Value
        If Not d1.exists(temp) Then
            d1.Add temp, temp
        End If
    Next C
    D = d1.keys    'Obtient les éléments

    ReDim Tbl(0)
    ReDim Preserve Tbl(4)
    temp = 0    'NCS
    temp1 = 0    'QS
    temp2 = 0    'QT
    NS = ""
    L1 = 1: L2 = 1
    
    For i = 0 To UBound(D)
        For j = LBound(R) To UBound(R)
            If D(i) = R(j, 1) Then
                L1 = j: L2 = j
                If R(j, 6) >= temp1 Then
                    temp11 = temp1
                    temp1 = R(j, 6)
                    'L1 = j
                    NS = NS & "|" & R(j, 2)
                End If
                If R(j, 7) >= temp2 Then
                    temp22 = temp2
                    temp2 = R(j, 7)
                    'L2 = j
                    NS = NS & "|" & R(j, 2)
                End If
            End If
        Next j
        Dim N$()
        N = Split(NS, "|")
        temp = Application.Max(UBound(N))

        Tbl(i + 1).Tab_1 = temp: Tbl(i + 1).Tab_2 = temp1: Tbl(i + 1).Tab_3 = temp2

    Next i
    Range("K2").Resize(d1.Count + 1) = Application.Transpose(d1.keys)
    'Range("K2").Resize(UBound(Tbl), 4) = Tbl
End Sub
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 216
Modifié par eriiic le 2/06/2012 à 22:19
Re,

Au post 15 tu n'as pas mis la définition du type de structure pour tabloStructure.

Pour la colonne B, elle ne sera déterminée qu'après avoir eu le max de la colonne F et G et connaitre les valeurs de NCS correpondantes pour extraire la plus grande valeur entre eux
Les formules en K sont fausses ou j'ai raté qcq chose ?
C'est pour brouiller les pistes ?

Les objets sont toujours regroupés ?
Peut-on trier pour s'en assurer et qu'ils soient déjà classés ??

eric
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 216
3 juin 2012 à 11:06
Et est-ce que le nombre de relevé par objet est toujours 4 ?
Sinon est-il toujours le même nombre pour chaque objet ?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 216
3 juin 2012 à 14:40
Abandon du suivi, comme tu n'as pas la politesse de signaler poster sur plusieurs forums.
Voir ici
eric
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 09:06
Elle suffisait mais je sais que certaines fonctions ne fonctionne pas quand on définit le paramètre en type Variant (le type par défaut). Essaie donc de le définir en tant que tableau avant le redéfinition, cela réglera peut-être ton problème (je ne peux pas tester désolé).
-3