Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 conversion de fonction à macro

zozo

XLDnaute Occasionnel
Bien le bonsoir à tous les membres,

Je sollicite votre aide pour convertir la fonction suivante en macro dont le fichier joint :

=INDEX(BARESULTAT!$C$2:$S$500;EQUIV('CHGE-DIRECT'!E$10;BARESULTAT!$A$2:$A$500;0);EQUIV('CHGE-DIRECT'!$A11;BARESULTAT!$C$1:$S$1;0))

Mon classeur contient 2 feuilles, BARESULTAT et CHGE-DIRECT, la fonction est au niveau de la feuille CHGE-DIRECT.

Merci pour toute solution et efforts de votre part.
 

Pièces jointes

  • CHARGES.xlsm
    233.7 KB · Affichages: 8
Solution
Bonjour,
Ceci peut-être..
VB:
Sub testJJ()
    With Feuil4.[b11:l27]
        .Formula = "=INDEX(BARESULTAT!$C$2:$S$500,MATCH(B$10,BARESULTAT!$A$2:$A$500,0),MATCH($A11,BARESULTAT!$C$1:$S$1,0))"
        .Value = .Value
    End With
End Sub

Jacky67

XLDnaute Barbatruc
Bonjour,
Ceci peut-être..
VB:
Sub testJJ()
    With Feuil4.[b11:l27]
        .Formula = "=INDEX(BARESULTAT!$C$2:$S$500,MATCH(B$10,BARESULTAT!$A$2:$A$500,0),MATCH($A11,BARESULTAT!$C$1:$S$1,0))"
        .Value = .Value
    End With
End Sub
 

Pièces jointes

  • CHARGES.xlsm
    237.8 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @zozo , @Jacky67

Voici une fonction personnalisée plus générique:
Function TableItem ( Table , dansPremCol , dansPremLig , SiAbsent , PresentMaisVide )

  • Table est la plage du tableau dans lequel on va rechercher un élément
  • dansPremcol est la valeur recherchée dans la première colonne de Table
  • dansPremligne est la valeur recherchée dans la première colonne de Table
  • SiAbsent est la valeur renvoyée si au moins une des deux valeurs cherchées est absente
  • PresentMaisVide est la valeur renvoyée si l'élément a été trouvé et s'il est vide

Exemple d'utilisation en cellule b11 de la feuille "CHGE-DIRECT":
=TableItem ( BARESULTAT!$A$1:$T$144 ; B$10 ; $A11 ; 0 ; "" )
On retourne 0 si on n'a pas pas trouvé une des deux valeurs B$10 ou $A11.
On retourne "" si les deux valeurs ont été trouvé mais si la valeur du tableau est 'vide'.

Pour l'exemple, la cellule C24 dans le tableau a été mise à vide (au lieu de la formule =somme(...))

Code de la fonction dans Module1:
VB:
Function TableItem(Table As Range, ByVal dansPremCol, ByVal dansPremLig, ByVal SiAbsent, ByVal PresentMaisVide)
Dim t, i&, j&, y
   t = Table
   For i = 1 To UBound(t)
      If dansPremCol = t(i, 1) Then Exit For
   Next i
   If i >= UBound(t) Then TableItem = SiAbsent: Exit Function
   For j = 1 To UBound(t, 2)
      If dansPremLig = t(1, j) Then Exit For
   Next j
   If j >= UBound(t, 2) Then TableItem = SiAbsent: Exit Function
   y = Table(i, j)
   If y = "" Then TableItem = PresentMaisVide Else TableItem = y
End Function
 

Pièces jointes

  • zozo- CHARGES- v1.xlsm
    232.6 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
Salut @Staple1600

La même mais beaucoup moins gourmande en ressource mémoire. On ne stocke plus en mémoire vive le tableau dans sa totalité mais uniquement sa 1ère colonne puis sa 1ère ligne.

Exemple : un tableau de 1 000 colonnes et 50 000 lignes.
  • Première méthode : 50 000 000 de valeurs à stoker en mémoire
  • Deuxième méthode : on stocke d'abord 50 000 valeurs en mémoire remplacées ensuite par 1000 valeurs en mémoire soit 50 000 valeurs au maximum.

VB:
Function TableItem(Table As Range, ByVal dansPremCol, ByVal dansPremLig, ByVal SiAbsent, ByVal PresentMaisVide)
'recherche le rang i de la valeur "dansPremCol" au sein de la 1ère colonne du tableau Table à partir de 2ème élément.
'recherche le rang j de la valeur "dansPremLig" au sein de la 1ère ligne du tableau Table à partir de 2ème élément.
'Si au moins une des 2 valeurs (i, j) n'est pas trouvée alors on retourne la valeur "SiAbsent"
'Sinon on retient la valeur y à l'intersection de la ligne i et de la colonne j
'NOTA: si y est vide alors on retourne la valeur "PresentMaisVide" sinon on retourne y
Dim t, i&, j&, y
   t = Table.Columns(1)
   For i = 1 To UBound(t)
      If dansPremCol = t(i, 1) Then Exit For
   Next i
   If i >= UBound(t) Then TableItem = SiAbsent: Exit Function
   t = Table.Rows(1)
   For j = 1 To UBound(t, 2)
      If dansPremLig = t(1, j) Then Exit For
   Next j
   If j >= UBound(t, 2) Then TableItem = SiAbsent: Exit Function
   y = Table.Cells(i, j)
   If y = "" Then TableItem = PresentMaisVide Else TableItem = y
End Function
 
Dernière édition:

zozo

XLDnaute Occasionnel
Bonjour,

Bonjour,
Merci, pour ton aide.
 

Discussions similaires

Réponses
7
Affichages
773
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…