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

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 !

Wotan75012

XLDnaute Nouveau
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

Dernière édition:
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:
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.
 
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:
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
 
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.
 
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.
 
- 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

Réponses
15
Affichages
1 K
Compte Supprimé 979
C
Retour