Application.WorksheetFunction.Large sur plusieurs plage non contigues

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour
Est il possible de connaitre en VBA la plus grande valeur sur des plages non contiguës ?
Application.WorksheetFunction.Large(Plage1, plage2),1) 'ne marche pas
' 1 étant le rang
Merci
Carlos
 

Staple1600

XLDnaute Barbatruc
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Bonsoir à tous


Ce qui vaut pour la formule GRANDE.VALEUR vaut pour son emploi en VBA
(extrait de l'aide Excel)
La syntaxe de la fonction GRANDE.VALEUR contient les arguments (argument : valeur qui fournit des informations à une action, un événement, une méthode, une propriété, une fonction ou une procédure.) suivants :

matrice Obligatoire. Représente la matrice ou la plage de données dans laquelle vous recherchez la k-ième plus grande valeur.
k Obligatoire. Représente, dans la matrice ou la plage de cellules, la position de la valeur à renvoyer, déterminée à partir de la valeur la plus grande.
 

mromain

XLDnaute Barbatruc
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Bonsoir carlos, Staple, le forum :)

Ci-joint une solution pour contourner le problème : passer l'ensemble des valeurs dans un tableau et utiliser ce tableau avec la fonction Small.
Merci à Hervé pour l'astuce :)

Cette fonction prend des Range en paramètres et renvoi un tableau contenant l'ensemble des valeurs :
VB:
Public Function RangeToArray(ParamArray zones()) As Variant()
Dim iZone As Long, nbCells As Long, iRes As Long, iCell As Long, jCell As Long
Dim res() As Variant, tmpTab() As Variant
    For iZone = LBound(zones) To UBound(zones)
        If TypeName(zones(iZone)) <> "Range" Then Exit Function
        nbCells = nbCells + zones(iZone).Cells.Count
    Next iZone
    ReDim res(1 To nbCells): iRes = 0
    For iZone = LBound(zones) To UBound(zones)
        tmpTab = zones(iZone).Cells.Value
        For iCell = LBound(tmpTab, 1) To UBound(tmpTab, 1)
            For jCell = LBound(tmpTab, 2) To UBound(tmpTab, 2)
                iRes = iRes + 1
                res(iRes) = tmpTab(iCell, jCell)
            Next jCell
        Next iCell
    Next iZone
    RangeToArray = res
End Function

Et voici comment l'utiliser :
VB:
Dim plage1 As Range, plage2 As Range, plage3 As Range, tabVal() As Variant

'    Set plage1 = ...
'    Set plage1 = ...
'    Set plage1 = ...

    tabVal = RangeToArray(plage1, plage2, plage3)
    
    MsgBox Application.WorksheetFunction.Small(tabVal, 2)

A+
 

carlos

XLDnaute Impliqué
Supporter XLD
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Re
J'ai adapté avec mon projet et ca s'arrete sur TmpTab:

Function Note(APS1 As Range, APS2 As Range)
Dim tabVal() As Variant'
tabVal = RangeToArray(APS1, APS2)
MsgBox Application.WorksheetFunction.Small(tabVal, 2)
End Function

Public Function RangeToArray(ParamArray zones()) As Variant()
Dim iZone As Long, nbCells As Long, iRes As Long, iCell As Long, jCell As Long
Dim res() As Variant, tmpTab() As Variant
For iZone = LBound(zones) To UBound(zones)
If TypeName(zones(iZone)) <> "Range" Then Exit Function
nbCells = nbCells + zones(iZone).Cells.Count
Next iZone
ReDim res(1 To nbCells): iRes = 0
For iZone = LBound(zones) To UBound(zones)
tmpTab = zones(iZone).Cells.Value ' ''''''''''''''''''''''''''''''''''''''''''''''''''ICI
For iCell = LBound(tmpTab, 1) To UBound(tmpTab, 1)
For jCell = LBound(tmpTab, 2) To UBound(tmpTab, 2)
iRes = iRes + 1
res(iRes) = tmpTab(iCell, jCell)
Next jCell
Next iCell
Next iZone
RangeToArray = res
End Function
 

mromain

XLDnaute Barbatruc
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Re bonsoir carlos,

C'est étrange.
Ci-joint un exemple avec différents ranges (cellules, plages nommées et tableau) qui fonctionne.

Pour ton cas, il faudrait savoir à quoi correspondent APS1 et APS2 lorsque la macro bloque. Comment les initialises-tu ?

A+
 

Pièces jointes

  • Classeur1.xlsm
    17.7 KB · Affichages: 82
  • Classeur1.xlsm
    17.7 KB · Affichages: 92
  • Classeur1.xlsm
    17.7 KB · Affichages: 92

Regueiro

XLDnaute Impliqué
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Bonsoir à Tous

Code:
Sub MAx()
Dim zone As Range
Set zone = Application.Union(Range("C2:C5"), Range("E2:E5"))
[G3] = Application.WorksheetFunction.Large(zone, 1)
For i = 1 To 3
Range("H" & i) = Application.WorksheetFunction.Large(zone, i) 'La
Next i
A+
 

job75

XLDnaute Barbatruc
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Bonjour le fil, le forum,

Bien sûr puisque GRANDE.VALEUR et PETITE.VALEUR fonctionnent très bien sur des plages disjointes.

A+
 

Pièces jointes

  • GRANDE.VALEUR(1).xls
    24 KB · Affichages: 81

Discussions similaires

Réponses
11
Affichages
500
Réponses
46
Affichages
847

Statistiques des forums

Discussions
312 194
Messages
2 086 064
Membres
103 110
dernier inscrit
Privé