Tblo recherche Min et Max par paquets

erics83

XLDnaute Impliqué
Bonjour,

J'essaye d'utiliser des tableaux pour aller plus vite....je cherche à rechercher les mini et les maxi. J'ai fait
Code:
Sub es()
Dim min As Long
Dim max As Long


Set f = Feuil1
  Set MonDico = CreateObject("Scripting.Dictionary")
  a = f.Range("A1:C" & f.[B65000].End(xlUp).Row)
  min = Now
 
  For i = LBound(a) To UBound(a)
   If a(i, 2) <= min Then min = a(i, 2)
   If a(i, 2) >= max Then max = a(i, 2)
  
  Next i
  Cells(1, 5) = min
    Cells(1, 6) = max
   

End Sub
pas très "orthodoxe", notamment dans le
Code:
min=Now
qui pourrait me jouer des tours....(si par exemple les dates de la colonne B sont supérieures à aujourd'hui......) donc si vous avez un petit truc, je suis preneur....lol

Mon problème est le suivant : j'aimerai avoir le mini et le maxi par rapport aux données de la colonne C : donc avoir pour "Besoin1", le mini et le maxi, pour "Besoin2", le mini et le maxi, etc....et de lister en colonne D.....
Et je trouve pas comment faire.....

Merci pour votre aide,
 

Pièces jointes

  • Classeurtest.xlsm
    15.4 KB · Affichages: 29

vgendron

XLDnaute Barbatruc
un essai avec un vrai tableau.. et la bonne syntaxe pour les fonctions Min et Max.. qui sont des fonctions.. et pas des variables


VB:
Sub es()
Dim mini As Long
Dim maxi As Long

Dim a() As Variant
Set f = Feuil1
  a = f.Range("A2:C" & f.[B65000].End(xlUp).Row).Value
  mini = Now

  For i = LBound(a) To UBound(a)
   mini = WorksheetFunction.min(mini, a(i, 2))
   maxi = WorksheetFunction.max(maxi, a(i, 2))
   
  Next i
  Cells(2, 5) = mini
    Cells(2, 6) = maxi
   

End Sub
 

vgendron

XLDnaute Barbatruc
pour les besoins
VB:
Sub es()
Dim mini As Long
Dim maxi As Long

Dim a() As Variant
Dim besoins() As Variant
With Sheets("Feuil1")
    FinA = .Range("A" & .Rows.Count).End(xlUp).Row
    FinBesoins = .Range("D" & .Rows.Count).End(xlUp).Row
    a = .Range("A2:C" & FinA).Value
    .Range("E2:F" & FinBesoins).ClearContents
    besoins = .Range("D2:F" & FinBesoins).Value
   
   
    For i = LBound(besoins, 1) To UBound(besoins, 1)
    besoins(i, 2) = Now
        For j = LBound(a) To UBound(a)
            If a(j, 3) = besoins(i, 1) Then
                besoins(i, 2) = WorksheetFunction.min(besoins(i, 2), a(j, 2))
                besoins(i, 3) = WorksheetFunction.max(besoins(i, 3), a(j, 2))
            End If
        Next j
    Next i
   
    .Range("D2:F" & FinBesoins) = besoins
   
End With
End Sub

sinon.. autre solution par formule MATRICIELLE
en E2 = MIN(SI($C$2:$C$65=D2;$B$2:$B$65;""))
en F2 =MAX(SI($C$2:$C$65=D2;$B$2:$B$65;""))

il faut valider les deux formules par Ctrl + Maj + Entrée
et tu peux tirer vers le bas
 

erics83

XLDnaute Impliqué
Merci vgendron,

Simple, efficace et comme toujours (pour moi) en regardant le code on se dit : "évidemment.....", sauf que je n'avais pas pensé faire comme ça....lol

Super merci !!!

Et, juste pour ma culture générale, comment trouver le "mini" sans passer par "Now", car comme je le disais, si les dates de la colonne B (=mini) sont > à Now, " besoins(i, 2) = Now" ne fonctionne pas.....

Merci pour votre aide,
Eric,
 

erics83

XLDnaute Impliqué
Merci mapomme,

Comme je le disais, je cherche à m'entrainer à faire des Tblo, pour mieux comprendre le fonctionnement et l'écriture, car actuellement, je fais pas mal de codes et j'utilise des "Feuilx.cells(x,x)=", et comme tu me l'as déjà fait remarqué (nous avons déjà eu des post communs), ces "écritures" dans les feuilles font perdre du temps...donc j'essaye de m'améliorer.

A ce propos, dans le même style, comment classer par ordre chronologique par "besoins" ? un peu comme si on faisait un tri par "besoin" et ensuite par date chrono. Actuellement, comme j'inscrivais mes données dans les feuilles, c'était "facile" puisque j'appliquais les tris style
champ.Sort Key1:=besoin, Order1:=xlAscending/XlDescending,
Key2:=date, Order2:=xlAscending/XlDescending,
Mais dans le cadre d'un Tblo, j'ai essayé différentes choses en imbriquant les boucles, mais c'est toujours le tri que je n'arrive pas à faire......

Une petite piste ? ou je fais un nouveau post car cette demande n'est pas en lien direct avec le sujet initial ?

En vous remerciant
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

Pour le tri par besoin puis par date, essayez :
VB:
Option Explicit

Sub Test()
Dim derlig&, T, i&

    derlig = Cells(Rows.Count, "c").End(xlUp).Row
    T = Range("b2:c" & derlig)
    ReDim u(1 To UBound(T))
    For i = 1 To UBound(T): u(i) = T(i, 2) & Format(T(i, 1), "yyyy-mm-dd"): Next i
    QuickSort u, LBound(u), UBound(u)
    For i = 1 To UBound(u)
        T(i, 1) = CDate(Right(u(i), 10))
        T(i, 2) = Left(u(i), Len(u(i)) - 10)
    Next i
    Range("e:f").Clear
    Range("e2").Resize(UBound(T), 2) = T
    Range("e1:f1") = Range("b1:c1").Value
End Sub

Sub QuickSort(a, gauc, droi)
Dim ref, g, d, temp
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call QuickSort(a, g, droi)
  If gauc < d Then Call QuickSort(a, gauc, d)
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 287
Messages
2 086 829
Membres
103 398
dernier inscrit
alya34030