Variables Dynamiques & Fonction - VB/VBA/VBS - Programmation
Marsh Posté le 19-01-2007 à 16:09:28
Déjà, soyons clair, il s'agit de VBA-Excel.
Ta procédure PROC() est appelée pour chaque article où bien elle n'est appelée qu'une fois et doit traiter tous les articles ?
Je ne suis pas sûr que tu aies besoin d'un tableau.
D'ailleurs j'ai du mal à comprendre ton besoin.
S'agit-il de passer 5 valeurs à ta PROC ? Auquel cas, il suffit de déclarer 5 paramètres :
sub PROC(nom as string, matiere as string, type as string, ... )
Tu peux le faire sous forme de tableau, mais à une seule dimension
déclarée comme suit :
sub PROC(tableau() as string)
L'appel de la procédure se fera comme ça :
Dim tab(4) as string
' remplissage de tab(0), tab(1), tab(2) ...
PROC tab
J'ai fait vite ; j'espère que ça t'aidera
Marsh Posté le 19-01-2007 à 16:25:40
Oui pardon il s'agit bien de VBA.
Oui ma proc doit être appelé pour chaque articles avec les 5 paramètres.
En fait je ne sais pas déclaré mes articles, mes variables. Et comment les utiliser ensuite...
J'ai pas trop comrpris quand tu écris ça :
sub PROC(tableau() as string)
L'appel de la procédure se fera comme ça :
Dim tab(4) as string
' remplissage de tab(0), tab(1), tab(2) ...
PROC tab
Comment je le remplis le tableau ?
Merci
Marsh Posté le 22-01-2007 à 10:46:50
J'ai fais ça pour le moment mais je ne sais pas comment déclarer mes variables en dehors de la procédure (sinon ça fait foirée ma macro) et comment faire appelle à la procédure avec les paramètre de mon type article en arguments.
Code :
|
Marsh Posté le 22-01-2007 à 13:25:27
Pour sortir la définition de tes variables et types, il suffit de les mettre dans la partie (Déclarations) du module.
Seulement par défaut elles sont considérées comme Private. Il faut donc remplacer le mot-clé « Dim » par « Public » et dans le cas du type, il faut écrire « Public Type... ». Ceci permet d'utiliser ces variables dans toutes les fonctions et procédures de n'importe quel module.
Ton appel à PROC devrait ressembler à
PROC Tableau |
tout simplement, mais à condition que ta définition de PROC soit
Sub PROC(tab() As Article) |
Marsh Posté le 22-01-2007 à 14:34:42
En fait j'en suis là mais après je sais pas comment exécuter la fonction pour tout mon tableau... En vert je sais pas quopi mettre....
Code :
|
Marsh Posté le 22-01-2007 à 16:35:05
Dans le code que tu mets, le remplissage de chaque élément de ta variable Tableau doit se faire dans une procédure ou une fonction. VB6 ne permet pas de le faire dans la partie (Déclarations).
La déclaration de ta PROC est indépendante de son appel.
Si tu déclares
Sub PROC(tab() As Article) |
tu peux faire appel à cette procédure par
PROC Tableau |
et dans la procédure (et seulement dans celle-ci) la variable tab() aura exactement le même contenu que Tableau.
Et donc l'utilisation de cette variable donne :
Selection.AutoFilter Field:=5, Criteria1:=tab(0).Modele, Operator:=xlAnd
Dans le cas d'une variable on ne met pas de guillemets.
Mais pour compléter, si tu veux travailler sur tous les articles du tableau, il faut utiliser une boucle For...Next avec un indice (genre i) et la ligne devient
Selection.AutoFilter Field:=5, Criteria1:=tab(i).Modele, Operator:=xlAnd
Marsh Posté le 22-01-2007 à 17:39:39
J'ai vraiment du mal avec les déclarations et les appels! J'ai fais ça mais ça marche toujours pas bien sur lol Une idée?
Code :
|
Marsh Posté le 23-01-2007 à 09:19:00
Toutes tes définitions de portée Public doivent être faites dans la partie (Déclarations) de ton module, c'est-à-dire hors procédure.
Là je vois « Public Tab(1) As Article » déclarée dans la fonction remplir_tableau.
De plus ta déclaration de la procédure remplir_tableau ne comporte pas de déclaration de paramètre pour traiter la variable Tab()
Sub remplir_tableau(pTab() As Article)
pTab() est une déclaration générique qui peut accueillir la variable Tab() lors de l'appel de la procédure. Le nom pTab() importe peu. On peut choisir n'importe quoi comme nom de paramètre, pourvu qu'on l'utilise tel quel dans le corps de la procédure.
Si tu ne comprends pas comment fonctionne les déclarations de constantes, variables, paramètres, il faut que tu lises des didacticiels sur le sujet. On ne peut pas se passer de ces informations en prog.
Marsh Posté le 24-01-2007 à 09:12:56
Bonjour,
Tes indications m'ont permis de réussir. Juste un dernier point qui m'empeche de finaliser comme je le veux. sur cette ligne :
Selection.AutoFilter Field:=5, Criteria1:=pTab(0).Modele, Operator:=xlAnd
Range("G1975" ).Select
Comment puis-je faire pour incorporer syntaxiquement le caractère "*" (remplace série de caractères) au début et à la fin de ma variable "pTab(0).Modele" comme la ligne ci-dessous en dure :
Selection.AutoFilter Field:=5, Criteria1:="*ENZO*", Operator:=xlAnd
Range("G1975" ).Select
Sinon la ligne du dessus correspond à :
Selection.AutoFilter Field:=5, Criteria1:="ENZO", Operator:=xlAnd
Range("G1975" ).Select
Marsh Posté le 24-01-2007 à 10:32:03
Il faut utiliser l'opérateur de concaténation &
Criteria1:="*" & pTab(0).Modele & "*"
Au fait, ton pTab(0) ne devrait-il pas plutôt être un pTab(i) avec i comme indice d'une boucle For...Next de traitement de tous tes articles ?
Marsh Posté le 24-01-2007 à 11:55:40
tegu a écrit : Au fait, ton pTab(0) ne devrait-il pas plutôt être un pTab(i) avec i comme indice d'une boucle For...Next de traitement de tous tes articles ? |
OUI OUI bien sur c'est une erreur de copier coller de ma part. ça marche très bien.
Un grand merci à toi TEGU pour ton aide très pédagogique.
Marsh Posté le 19-01-2007 à 15:32:04
Bonjour,
J'ai une procédure qui commence comme celle-ci :
Sub PROC()
Selection.AutoFilter Field:=5, Criteria1:="=*NOM*", Operator:=xlAnd
Range("G1975" ).Select
ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-1946]C:R[-338]C)"
Range("G1975" ).Select
Selection.AutoFill Destination:=Range("G1975:Y1975" ), Type:=xlFillDefault
Range("G1975:Y1975" ).Select
Range("E1975" ).Select
ActiveCell.FormulaR1C1 = "NOM"
Range("D1975" ).Select
ActiveCell.FormulaR1C1 = "MATIERE"
Range("C1975" ).Select
ActiveCell.FormulaR1C1 = "TYPE"
Range("B1975" ).Select
ActiveCell.FormulaR1C1 = "SAISON"
Range("A1975" ).Select
ActiveCell.FormulaR1C1 = "CATEGORIE"
......
End PROC
J'aimerais pouvoir appliquer cette procédure avec un tableau de variable à 5 dimensions (valeurs en rouge). C'est à dire :
Article 1 sera identifié par : NOM1 MATIERE1 TYPE1 SAISON1 CATEGORIE1
Article 2 sera identifié par : NOM2 MATIERE2 TYPE2 SAISON2 CATEGORIE2
Article 3 sera identifié par : NOM3 MATIERE3 TYPE3 SAISON3 CATEGORIE3
...ainsi de suite
Il faudrait que je face une fonction en faite je pense qui prend en paramètre un tableau ! Une idée ?