Application.WorksheetFunction.Large sur plusieurs plage non contigues

  • Initiateur de la discussion Initiateur de la discussion carlos
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

carlos

XLDnaute Impliqué
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
 
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.
 
Re : Application.WorksheetFunction.Large sur plusieurs plage non contigues

Bonsoir Staple1600
J' ai tenté ceci avec des parentheses mais ca ne marche toujours pas:
Application.WorksheetFunction.Large({Plage1, plage2},1)
Cordialement
 
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+
 
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
 
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

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+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour