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

XL 2010 Lister des éléments avec leurs paramètres de définition...

vgendron

XLDnaute Barbatruc
Bonjour à toutes et tous!

Plus que du code, je suis à la recherche d'idées ou d'algo.

voici mon problème:

Sur une feuille excel, j'ai des lignes d'instruction pour un script de test
une ligne étant constituée de la sorte:
VB:
NomVariable1 = NomFonction1(ArgumentsFonction1)
NomVariable2= NomFonction1(ArgumentsFonction1)
NomVariable3 = NomFonction2(ArgumentsFonction2)
...
...
NomVariable_4=NomVariable_1 + NomVariable_2
...
...

l'objectif est de generer un fichier texte permettant de lister toutes les variables
et de donner les éléments de calculs de ces variables

ca donnerait ceci
VB:
[Variables]
NbVar=4
NomVar_1=NomVariable1
...
NomVar4=NomVariable4

[NomVariable1]
TypeVar=NomFonction1
Param1 = xxx
Param2 = xxx

[NomVariable2] 'meme fonction utilisée que pour la variable 1 ==> donc, meme type de paramètres
TypeVar=NomFonction1
Param1 = xxx
Param2 = xxx

[NomVariable3] 'il s'agit d'une autre fonction, les paramètres peuvent donc etre différents et en nombre différent.
typeVar=NomFonction2
Param1=yyy
Param2=yyy
Param3=yyy


l'idée, c'est donc lister Toutes les variables et d'identifier les paramètres de la fonction associée..
pour l'instant, je suis parti avec un dictionnaire "Dico_ListeVar" ayant pour clés le nom de la variable, et pour valeurs la chaine complète de l'instruction (NomFonction(ArgumentsFonction)

j'ai aussi un tableau Dim TabVariables() as TYPEVARIABLE
le TYPEVARIABLE étant un type perso
type TYPEVARIABLE
NomVar as string
NomFonction as string
Param1 as string
Param2 as string
end type

vous voyez donc apparaitre la difficulté..
selon la fonction utilisée, le TypeVariable ne contient plus les memes éléments..

Je me disais.. soit je défini un TYPEVARIABLE regrouppant tous les paramètres possibles et imaginables, et je ne rempli que ceux utiles.. soit je défini un Type pour chaque fonction...
mais la.. du coup..je ne sais pas si mon tableau "TabVariables" peut accepter des éléments de types différents..
en le définissant en Dim TabVariables() as variant?? ca passerait?

si quelqu'un a une idée.. je prend :-D
en tout cas merci et bon appétit !
 

vgendron

XLDnaute Barbatruc
En fait la question est:
Peut on définir un tableau de plusieurs éléments de types différents ?
si non.. existe t il une structure le permettant? genre. un dictionnaire de dictionnaire ou autre...
 

vgendron

XLDnaute Barbatruc
Hello xUpsilon
j'ai du mal à me figurer ce que tu proposes.. as tu quelque chose de précis en tete?

définir une structure de variables de types différents
c'est justement ce que je souhaite.. mais. quelle structure accepte d'avoir des éléments de types différents?? un tablo, un dico, une collection?

stocker tes éléments dont le type sera cette structure dans un dictionnaire
si je reprend ca à l'envers.. ca me donne un Dictionnaire d'éléments de types différents...??
la. je suis perdu.. je fume... :-D

en tout cas merci de t'etre penché sur ce cas :-D
 

xUpsilon

XLDnaute Accro
Re,

Voir ici pour définir une structure.

En gros une structure, c'est un peu comme une espèce de "variable tableau" (à prendre avec de graaandes pincettes).
C'est à dire que tu vas, via une "grande variable", désigner plusieurs "sous variables" qui sont comprises comme étant des sous ensembles de cette variable.
Ainsi, tu peux définir la structure "Maison" dont les éléments seront Longueur, Largeur, Hauteur as Double ; Adresse, Proprietaire as String etc ...
Je n'ai jamais essayé mais j'imagine qu'il doit être possible de faire une bibliothèque d'éléments dont le type est une structure personnalisée.

Bonne continuation
 

vgendron

XLDnaute Barbatruc
OK !!
je viens de découvrir la "Structure" VBA, je pensais que c'était un terme générique pour désigner soit un dico, soit un tableau soit.....

en fait.. ca ressemble beaucoup à une déclaration de type Perso..
je vais aller voir ca, notamment en terme d'accès aux éléments de la structure..

Merci à toi
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Je ne comprends pas tous les tenants et aboutissants du truc mais voici un exemple avec Type...End Type

VB:
Type Parametre
    Nom As String
    NomType As String
    Optionel As Boolean
    ValeurDefaut As Variant
End Type

Type Fonction
    Nom As String
    Parametres() As Parametre
End Type


Sub Truc()
    Dim i As Integer
    Dim MesFonctions() As Fonction
    Dim fn As Fonction
    Dim prms(1 To 2) As Parametre
    
    prms(1).Nom = "Nom"
    prms(1).NomType = "String"
    prms(1).Optionel = False
    prms(2).Nom = "Prénom"
    prms(2).NomType = "String"
    prms(2).Optionel = False
    
    fn.Nom = "NomComplet"
    fn.Parametres = prms
    i = 1
    ReDim MesFonctions(1 To i)
    MesFonctions(1) = fn
End Sub

cordialement
 

vgendron

XLDnaute Barbatruc
Salut Roblochon

le besoin est finalement
à un nom de variable, on associe une fonction.. de laquelle découle un set de paramètres.

un exemple de ce que j'avais en tete:
type type1
personne as string
nom as string
pre as strin
end type

type type2
formeas string
haut as string
larg as string
end type

l'idéal aurait été d'avoir une liste de variables (tableau)
tablo(1)=variable1 de type 1
tablo(2)=variable2 de type 2

et du coup.. j'aurais pu acceder aux paramètres de chaque variable en faisant:
tablo(1).personne= "Personne"
tablo(1).nom="Nom"
tablo(1).pre="Prénom"

tablo(2).forme="Forme"
tablo(2).haut="Hauteur"
tablo(2).larg="Largeur"

avec ta proposition, il me semble que la difficulté , c'est que les éléments du type paramètres sont différents (en type et en nombre) selon la fonction
au final.. il me faut toujours autant de types "paramètres" que de fonctions...

pour l'instant, j'ai pris le parti de créer un type "tyVariables" contenant l'ensemble des infos
le nom de la fonction et tous les paramètres que je peux avoir.. et je ne rempli que ceux concernés par la fonction...

je n'aurai plus qu'à faire un select case sur la fonction pour savoir quels paramètres récuperer..
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Ce n'était qu'un exemple d'une petite hiérarchie possible avec des types personnalisés, mais franchement je ne vois pas la différence entre ce que j'ai fait et ceci:


Sans doute n'ai-je pas tout capté, mais ça ne fait rien.

Bonnes recherches et continuation
 

job75

XLDnaute Barbatruc
Bonsoir vgendron, xUpsilon, Roblochon, Bernard,

Voyez le fichier joint et ces codes dans Module1 :
VB:
Sub Macro() 'la macro dont on veut étudier les variables
Dim MaVar1, MaVar2, MaVar3, MaVar4 'déclarations obligatoirement sur 1 ligne
MaVar1 = F1(1, 1)
MaVar2 = F1(1, 0)
MaVar3 = F2(1, 2, 3)
MaVar4 = MaVar1 + MaVar2
End Sub

Function F1(v1, v2)
F1 = IIf(v1 = 1 And v2 = 1, 1, 0)
End Function

Function F2(x1, x2, x3)
F2 = [1/0]
End Function

Sub Resultat()
Dim i, n, j, x, p, k, s, kk
Open ThisWorkbook.Path & "\Resultat.txt" For Output As #1
Print #1, "[Variables]"
With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
    For i = 1 To .CountOfLines
        If .Lines(i, 1) Like "Sub Macro()*" Then Exit For 'macro recherchée
    Next i
    If i > .CountOfLines Then Exit Sub 'si la macro n'existe pas
    n = UBound(Split(.Lines(i + 1, 1), ",")) + 1
    Print #1, "NbVar=" & n
    For j = i + 2 To i + n + 1
        x = .Lines(j, 1)
        Print #1, "NomVar" & j - i - 1 & "=" & Left(x, InStr(x, " = ") - 1)
    Next j
    For j = i + 2 To i + n + 1
        Print #1, ""
        x = .Lines(j, 1)
        Print #1, "[" & Left(x, InStr(x, " = ") - 1) & "]"
        x = Mid(x, InStr(x, " = ") + 3)
        p = InStr(x, "(")
        If p Then
            x = Left(x, p - 1)
            Print #1, "TypeVar=" & x 'fonction
            For k = 1 To .CountOfLines
                If .Lines(k, 1) Like "Function " & x & "(*" Then
                    x = Replace(Split(.Lines(k, 1), "(")(1), ")", "") 'liste des arguments de la fonction
                    s = Split(x, ", ")
                    For kk = 0 To UBound(s)
                        Print #1, "Param" & kk + 1 & "=" & s(kk)
                    Next kk
                    Exit For
                End If
            Next k
        Else
            Print #1, "TypeVar=" & x 'formule
        End If
    Next j
End With
Close #1
End Sub
La case d'option permettant l'accès au VBProject doit avoir été cochée bien sûr.

A+
 

Pièces jointes

  • Variables(1).xlsm
    22.6 KB · Affichages: 8

Dranreb

XLDnaute Barbatruc
Il y a bien plus de possibilités avec les types d'objets définis par des modules de classe qu'avec les types définis par les groupes d'instructions Type … End Type.
En plus des mêmes usages possibles que ces derniers grâce à leurs propriétés, on peut les ranger dans des collections ou des dictionary, et ils ont leur propre programmation, ce sont leurs méthodes.
Les propriétés sont associées à l'exemplaire d'objet,
les méthodes sont associées au type d'objet.
 

Dranreb

XLDnaute Barbatruc
En fait la question est:
Peut on définir un tableau de plusieurs éléments de types différents ?
si non.. existe t il une structure le permettant? genre. un dictionnaire de dictionnaire ou autre...
Oui, tableaux, Collection, Dictionary tout ça, à la seule condition que ce ne soient pas des types définis par blocs Type … End Type, avec lesquels rien d'autre n'est possible qu'un tableau d'éléments d'un seul tel type. Tandis qu'avec des objets de types différents pas de problème. Mais il est possible pour votre besoin que des tableaux dynamiques aillent très bien aussi. Il faudrait qu'on ait un exemple concret de classeur avec modèle des données et résultat souhaité correspondant.

Édition: cela dit il est aussi possible, pour ne pas perdre le bénéfice des liaisons anticipées dans un de ces tas d'objets de types différents, de définir des objets … comment dirais-je … différents, mais pas si différents que ça (classes d'interfaces) pourvu qu'on sache leur demander les mêmes choses à tous, seul les détails des résultats devant changer d'une espèce précise à l'autre.
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…