Problème de variable indexée dans une fonction

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Je ne parviens pas à résoudre le problème suivant :

VB:
Function Variable(txt1 As String) As String

Dim i As Byte
i = 1

Variable = txt1 'marche
'Variable = txt & i 'ne marche pas --> 1
'Variable = "txt" & i 'ne marche pas --> txt1

End Function
Je pense que ce doit être tout bête à résoudre.
Merci pour tout conseil
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème de variable indexée dans une fonction

Bonjour Magic_Doctor,

Je ne comprends pas ce que tu cherches à faire puisque la 1ière écriture fonctionne.

txt est chaine vide puisque pas initialisée, i est égal à 1 donc on a bien "" & 1 qui est une chaine égale à "1".

"txt" est chaine égale à txt, i est égal à 1 donc on a bien "txt" & 1 qui est une chaine égale à "txt1".
"txt1" est une chaine de caractères et non pas une variable ou un paramètre dont le nom serait txt1.
 

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de variable indexée dans une fonction

Bonjour jpb388, mapomme

En fait mon exemple est des plus minimalistes. En arguments, dans la fonction, il y aura plusieurs "txt" : "txt1", "txt2"...
Dans une boucle on traitera les différents "txt".
Supposons qu'il y ait 3 "txt" :
For i = 1 To 3
txt & i
blablabla
next
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème de variable indexée dans une fonction

Re,

En fait mon exemple est des plus minimalistes. En arguments, dans la fonction, il y aura plusieurs "txt" : "txt1", "txt2"...
Dans une boucle on traitera les différents "txt".
Supposons qu'il y ait 3 "txt" :
For i = 1 To 3
txt & i
blablabla
next

Dans ce cas, on peut utiliser une fonction avec un paramètre type tableau de variant affublé de ParamArray qui permet d'indiquer un nombre quelconque de variables correspondant à ce paramètre. Ce paramètre doit, bien sûr, être le dernier de la liste des paramètres de la fonction.

Essayer ce code:
VB:
Sub test()
Dim txt1, txt2, txt3, toto, PasDansLeParamArray As String

PasDansLeParamArray = "Ma tuture monte à "
txt1 = 10
txt2 = 20
txt3 = 30
toto = 100

MsgBox SommePlein2parametres(PasDansLeParamArray, txt1, txt2, txt3, toto)

End Sub

Function SommePlein2parametres(PasDedans As String, ParamArray Txt() )
Dim elem
  For Each elem In Txt
    SommePlein2parametres = SommePlein2parametres + elem
  Next elem
  SommePlein2parametres = PasDedans & SommePlein2parametres
End Function

Dans cette exemple la fonction s'écrit avec deux paramètres:
1) un paramètre classique typé string (PasDedans)
2) le paramètre genre "ParamArray" de nom Txt() - Txt doit être déclaré forcément comme un tableau de variant -

On appelle cette fonction par: SommePlein2parametres(PasDansLeParamArray, txt1, txt2, txt3, toto)
1) La variable PasDansLeParamArray correspond au paramètre PasDedans.
2) les 4 variables suivantes (txt1, txt2, txt3, toto) correspondent au paramètre Txt(). On aurait pu n'en mettre aucune ou une, deux, trois ou bien encore plus que quatre.
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Problème de variable indexée dans une fonction

Salut Magic_Doctor et le forum
Normal que ça ne marche pas, ça n'a ni jambe ni patte :D
Pour qu'on puisse répondre efficacement, c'est pas le code qui ne fonctionne pas qu'il faut, mais plutôt ce que tu as au départ et ce que tu aimerais obtenir !
VB:
Function Variable(txt1 As String) As String
Dim i As Byte
i = 1
Variable = "txt" & i
End Function
Le résultat donne "txt1"
Mais quelques remarques :

Function Variable(txt1 As String) As String : Function crée une fonction comme celles proposées dans excel (elle sera placée dans la catégorie personnalisée) son nom sera Variable() et le résultat sera une String (chaîne de caractères). Elle aura un argument de type texte qui sera stocké dans la variable txt1 qui n'est pas utilisée ici.
Première erreur : txt1 est un argument qui n'est pas "qualifié" d'optionnel, donc Excel l'attend :
=Variable() => renvoie #VALEUR!
=Variable("") ou =Variable("a")=> renvoie "txt1"
Deuxième problème : une fois calculée, une function n'est pas toujours recalculée : en général, il est nécessaire d'utiliser la méthode volatile pour être sur que la fonction sera recalculée à chaque fois qu'elle doit l'être.
Personnellement, comme je ne connais pas tous les termes utilisés par excel, j'évite d'user de ceux qui pourraient l'être.

Ce qui donne pour ce que je comprends de ta fonction :
Code:
Function Variab() As String
Dim i As Byte
Application.Volatile
i = 1
Variab = "txt" & i
End Function
Mais comme je ne connais pas le but exact du code :confused:
A+

EDIT après avoir lu les réponses précédentes
Je ne comprends toujours pas le but. Mais une Function ne sert qu'à calculer un unique résultat, ce n'est pas une Sub. Même si ce résultat peut être différent suivant plusieurs conditions.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème de variable indexée dans une fonction

Re,

@ Magic_Doctor : si tu préfères utiliser une boucle For i = ... to .... au lieu
d'une boucle For each ... i ... , voir la fonction n° 2 ci-dessous:
VB:
Sub test()
Dim txt1, txt2, txt3, toto, PasDansLeParamArray As String

PasDansLeParamArray = "Ma tuture monte à "
txt1 = 10
txt2 = 20
txt3 = 30
toto = 100

MsgBox SommePlein2parametres(PasDansLeParamArray, txt1, txt2, txt3, toto)
MsgBox SommePlein2parametres2(PasDansLeParamArray, txt1, txt2, txt3, toto)

End Sub

Function SommePlein2parametres(PasDedans As String, ParamArray Km())
Dim elem
  For Each elem In Km
    SommePlein2parametres = SommePlein2parametres + elem
  Next elem
  SommePlein2parametres = PasDedans & SommePlein2parametres
End Function

Function SommePlein2parametres2(PasDedans As String, ParamArray Km())
Dim i As Long
  For i = LBound(Km) To UBound(Km)
    SommePlein2parametres2 = SommePlein2parametres2 + Km(i)
  Next i
  SommePlein2parametres2 = PasDedans & (2 * SommePlein2parametres2)
End Function
 

Pièces jointes

  • passage n variables v1.xlsm
    15.5 KB · Affichages: 40
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de variable indexée dans une fonction

Voilà, j'ai résolu le problème, mais c'était plus compliqué que ce que me l'imaginais au départ.
J'ai dû passer par un "Array" et un dictionnaire.
En regardant bien la fonction, vous comprendrez où je voulais en venir.
Dans la version finale, la boucle traite davantage de choses. J'ai fait au plus simple.
VB:
Function MaMerveilleuseFonction(txt1 As String, txt2 As String) As String

Dim mestxt As Variant, dico As Object, temp As Variant, i As Byte
mestxt = Array(txt1, txt2)
Set dico = CreateObject("Scripting.Dictionary")

For i = 1 To 2
    dico(mestxt(i - 1)) = ""
Next
temp = dico.keys
MaMerveilleuseFonction = temp(0) & " +/- " & temp(1)
End Function
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème de variable indexée dans une fonction

Bonsoir Magic_Doctor :)

Voilà, j'ai résolu le problème, mais c'était plus compliqué que ce que me l'imaginais au départ.
J'ai dû passer par un "Array" et un dictionnaire.
En regardant bien la fonction, vous comprendrez où je voulais en venir.
Dans la version finale, la boucle traite davantage de choses. J'ai fait au plus simple.

Je n'ai pas compris ce que vous avez voulu faire. En tout cas, je suis presque certain que vous n'avait pas fait au plus simple :confused:

Vous partez de deux variables et le résultat est la concaténation du contenu de la variable n°1 puis de la chaine de caractère " +/- " puis du contenu de la variable n°2. Si c'est cela, je pense que le plus simple pourrait être la fonction:
VB:
Function UnePtiteFonction(A As String, B As String) As String
  UnePtiteFonction = A & " +/- " & B
End Function

NB: votre fonction provoque une erreur si les deux variables passées à votre fonction sont égales. Cela est dû à l'objet dico qui n'aura qu'un seul élément puisque les deux variables txt1 et txt2 qui servent de clefs au dico contiendront la même valeur. Temp(1) n'existera pas!
(faire dans le code de Test: toto = "aaa" et tata = "aaa")

Edit: La discussion est indépendante de ce qui est fait ou non la boucle. Avec votre fonction, vous ne traitez qu'exactement deux variables en entrée (contrairement au contenu du message #4)
 

Pièces jointes

  • passage n variables v2.xlsm
    15.9 KB · Affichages: 32
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Problème de variable indexée dans une fonction

Bonsoir mapomme,

Je sais bien que le dictionnaire ne contient aucun doublon. Régler le problème est ma foi fort simple. Je n'en avais pas fait une priorité car, pour le problème que ma fille m'a demandé de lui résoudre, on a plus de chances de gagner au loto que d'avoir 2 chiffres identiques.
Ma solution peut ne paraître en effet pas simple, mais il s'agit là d'une étape d'une procédure que je développe sur un autre fil.
Effectivement, dans mon post #4 je fais allusion à plusieurs variables (> 1 puisque nous déclinons au pluriel...). Si le raisonnement fonctionne avec 2 variables, il fonctionnera forcément avec 36 variables.
VB:
Function MaMerveilleuseFonction(txt1 As String, txt2 As String) As String

Dim mestxt As Variant, dico As Object, temp As Variant, i As Byte
mestxt = Array(txt1, txt2)
Set dico = CreateObject("Scripting.Dictionary")

For i = 1 To 2
    dico(mestxt(i - 1)) = ""
Next
temp = dico.keys
If dico.Count = 1 Then 'si txt1 = txt2 (pas de doublons dans le dico !)
    MaMerveilleuseFonction = temp(0)
Else
    MaMerveilleuseFonction = temp(0) & "  +/-  " & temp(1)
End If
End Function

Buenas noches.
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87