XL 2016 RESOLU :échec de transformation d'une macro VBA en Fonction personnalisée

Wotan75012

XLDnaute Nouveau
Supporter XLD
bonjour à tous les membres du Forum.

j'ai créé une macro nommée IndexVecteur qui retour l'index souhait d'une valeur au sein d'un vecteur ou tableau, qui fonctionne bien.

j'ai besoin de transformer cette macro en Fonction Excel personnalisé nommée FnctIndexVecteur, mais comme je suis débutant, je n'arrive pas à la faire fonctionner ! (voir fichier VBA joint SVP)

Est ce que quelqu'un aurait une idée pour m'aider SVP ?

Merci d'avance et bonne journée à tous :)

Wotan75012
 

Pièces jointes

  • Fonction IndexVecteur.xlsm
    22.5 KB · Affichages: 6
Dernière édition:

Dranreb

XLDnaute Barbatruc
Vous ne pouvez pas définir comme tableau un argument susceptible de recevoir un Range. Il faut :
VB:
Function FnctIndexVecteur(ByVal MonTableau As Variant, ByVal K As Long, ByVal M As Long, ByVal j As Integer)
   If TypeOf MonTableau Is Range Then MonTableau = MonTableau.Value
Notez que ça ne le transforme pas en tableau, mais en Variant contenant un tableau.
Mais l'accès aux éléments peut y être programmé de la même façon.
 
Dernière édition:

Wotan75012

XLDnaute Nouveau
Supporter XLD
Bonjour

peux tu expliquer ce que fait ta macro (et donc ta fonction) ?
dans ta macro, tu demandes trois éléments.. mais on ne sait pas ce qu'on est censé rentrer, et ce qu'est censée donner ta macro..
Bonjour VGendron , Merci de regarder ce problème.

La macro et la fonction renvoient un index de ligne par rapport à un tableau, dont j'aimerai indiquer la ligne initiale et la colonne initiale dans la fonction. Voilà j'espère que ça éclaire le sujet.
 

Dranreb

XLDnaute Barbatruc
Toujours pas clair. Un index d'une ligne contenant une valeur cherchée ?
Ne voulez vous pas plutôt dire la valeur contenue à une ligne d'index donné ?
Mais dans ce cas je ne vois vraiment pas à quoi sert votre fonction qui aurait le même usage que l'INDEX d'Excel.
Alors si c'est juste pour savoir comment on l'écrirait :
VB:
Function FnctIndexVecteur(ByVal MonTableau As Range, ByVal L As Long, ByVal C As Long)
   FnctIndexVecteur = MonTableau(L, C).Value
   End Function
Mais il y a un paramètre de trop dans votre exemple. Je ne vois pas à quoi il pourrait servir.
 
Dernière édition:

vgendron

XLDnaute Barbatruc
C'est bien ce que je pressentais..
ta macro sert à remplacer la fonction index...
si la valeur ajoutée de la macro c'est l'identification du tableau par l'utilisateur
specifier une ligne et une colonne, ca revient à spécifier une cellule: tu peux la demander directement

ca donnerait ces codes
VB:
Option Base 0
Option Explicit

Sub IndexVecteur() 'Cette macro VBA donne, pour un vecteur donné, qui commence en ligne K et en Colonne M,  la valeur du vecteur situé à l'indice j
Dim CelDeb As Range
Dim Tablo As Range 'Zone Range du tableau'
Dim indice As Integer ' Numéro d'indice à chercher.

Set CelDeb = Application.InputBox("Selectionnez la première cellule du tableau", Type:=8)
indice = InputBox("Quel est l'indice de la valeur recherchée j, SVP ?")

Set Tablo = Range(CelDeb, CelDeb.End(xlDown))
Range("F" & indice + CelDeb.Row - 1) = Application.WorksheetFunction.Index(Tablo, indice)

End Sub

Function FnctIndexVecteur(CelDeb As Range, indice As Long) As Variant
Dim Tablo As Range

Set Tablo = Range(CelDeb, CelDeb.End(xlDown))
FnctIndexVecteur = Application.WorksheetFunction.Index(Tablo, indice)
End Function
 

Wotan75012

XLDnaute Nouveau
Supporter XLD
Vous ne pouvez pas définir comme tableau un argument susceptible de recevoir un Range. Il faut :
VB:
Function FnctIndexVecteur(ByVal MonTableau As Variant, ByVal K As Long, ByVal M As Long, ByVal j As Integer)
   If TypeOf MonTableau Is Range Then MonTableau = MonTableau.Value
Notez que ça ne le transforme pas en tableau, mais en Variant contenant un tableau.
Mais l'accès aux éléments peut y être programmé de la même façon.
Merci beaucoup Dranreb pour votre réponse , mon problème est résolu grâce à votre réponse . Merci pour la précision sur les objets Variant, je vais passer par la fonction INDEX . bonne fin de journée.
 

Wotan75012

XLDnaute Nouveau
Supporter XLD
C'est bien ce que je pressentais..
ta macro sert à remplacer la fonction index...
si la valeur ajoutée de la macro c'est l'identification du tableau par l'utilisateur
specifier une ligne et une colonne, ca revient à spécifier une cellule: tu peux la demander directement

ca donnerait ces codes
VB:
Option Base 0
Option Explicit

Sub IndexVecteur() 'Cette macro VBA donne, pour un vecteur donné, qui commence en ligne K et en Colonne M,  la valeur du vecteur situé à l'indice j
Dim CelDeb As Range
Dim Tablo As Range 'Zone Range du tableau'
Dim indice As Integer ' Numéro d'indice à chercher.

Set CelDeb = Application.InputBox("Selectionnez la première cellule du tableau", Type:=8)
indice = InputBox("Quel est l'indice de la valeur recherchée j, SVP ?")

Set Tablo = Range(CelDeb, CelDeb.End(xlDown))
Range("F" & indice + CelDeb.Row - 1) = Application.WorksheetFunction.Index(Tablo, indice)

End Sub

Function FnctIndexVecteur(CelDeb As Range, indice As Long) As Variant
Dim Tablo As Range

Set Tablo = Range(CelDeb, CelDeb.End(xlDown))
FnctIndexVecteur = Application.WorksheetFunction.Index(Tablo, indice)
End Function
Vgendron, je vous remercie beaucoup, vous avez parfaitement résolu mon problème de fonction personnalisé . c'est vrai que je n'avais pas pensé utiliser End(xl.down). Bonne soirée . Bien cordialement.
 

Discussions similaires

Statistiques des forums

Discussions
313 288
Messages
2 096 843
Membres
106 762
dernier inscrit
geraldged19780604