Variables Dynamiques & Fonction

Variables Dynamiques & Fonction - VB/VBA/VBS - Programmation

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 ?

Reply

Marsh Posté le 19-01-2007 à 15:32:04   

Reply

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

Reply

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

Reply

Marsh Posté le 22-01-2007 à 09:38:05    

Personne en ce magnifique lundi pour m'expliquer??

Reply

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 :
  1. Sub FUSION_DES_PRINTS()
  2. '
  3.  
  4.     Type Article
  5.     Modele As String
  6.     Matiere As String
  7.     Produit As String
  8.     Saison As String
  9.     Categorie As String
  10.    
  11.     End Type
  12.     Dim Tableau(20) As Article
  13.    
  14.     'Remplissage de 1ere ligne Tableau
  15.     Tableau(0).Modele = "ENZO"
  16.     Tableau(0).Matiere = "JC JERSEY COTON"
  17.     Tableau(0).Produit = "TC TISH MC"
  18.     Tableau(0).Saison = "Z INTEMPORELS"
  19.     Tableau(0).Categorie = "1 TEXTILE HOMME"
  20.     Selection.AutoFilter Field:=5, Criteria1:="=*" & Tableau(0).Modele & "*", Operator:=xlAnd
  21.     Range("F1975" ).Select
  22.     ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-1946]C:R[-338]C)"
  23.     Range("F1975" ).Select
  24.     Selection.AutoFill Destination:=Range("F1975:X1975" ), Type:=xlFillDefault
  25.     Range("F1975:X1975" ).Select
  26.     Range("E1975" ).Select
  27.     ActiveCell.FormulaR1C1 = "& Tableau(0).Modele &"
  28.    
  29.     Range("D1975" ).Select
  30.     ActiveCell.FormulaR1C1 = "& Tableau(0).Matiere &"
  31.    
  32.     Range("C1975" ).Select
  33.     ActiveCell.FormulaR1C1 = "& Tableau(0).Produit &"
  34.    
  35.     Range("B1975" ).Select
  36.     ActiveCell.FormulaR1C1 = "& Tableau(0).Saison &"
  37.    
  38.     Range("A1975" ).Select
  39.     ActiveCell.FormulaR1C1 = "& Tableau(0).Categorie &"
  40. End Sub

Reply

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)


Reply

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 :
  1. Public Type Article
  2.     Modele As String
  3.     Matiere As String
  4.     Produit As String
  5.     Saison As String
  6.     Categorie As String
  7.     End Type
  8.    
  9.     Public Tableau(20) As Article
  10.    
  11.     'Remplissage de 1ere ligne Tableau
  12.     Tableau(0).Modele = "ENZO"
  13.     Tableau(0).Matiere = "JC JERSEY COTON"
  14.     Tableau(0).Produit = "TC TISH MC"
  15.     Tableau(0).Saison = "Z INTEMPORELS"
  16.     Tableau(0).Categorie = "1 TEXTILE HOMME"
  17.    
  18.     Tableau(1).Modele = "SALLY"
  19.     Tableau(1).Matiere = "JL JERSEY L"
  20.     Tableau(1).Produit = "TC TISH ML"
  21.     Tableau(1).Saison = "Ete 2006"
  22.     Tableau(1).Categorie = "2 TEXTILE FEMME"
  23.  
  24. Sub FUSION_DES_PRINTS(????)
  25. '
  26.  
  27.     Selection.AutoFilter Field:=5, Criteria1:="Tableau(0).Modele", Operator:=xlAnd
  28.     Range("F1975" ).Select
  29.     ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-1946]C:R[-338]C)"
  30.     Range("F1975" ).Select
  31.     Selection.AutoFill Destination:=Range("F1975:X1975" ), Type:=xlFillDefault
  32.     Range("F1975:X1975" ).Select
  33.     Range("E1975" ).Select
  34.     ActiveCell.FormulaR1C1 = "Tableau(0).Modele"
  35.    
  36.     Range("D1975" ).Select
  37.     ActiveCell.FormulaR1C1 = "Tableau(0).Matiere"
  38.    
  39.     Range("C1975" ).Select
  40.     ActiveCell.FormulaR1C1 = "Tableau(0).Produit"
  41.    
  42.     Range("B1975" ).Select
  43.     ActiveCell.FormulaR1C1 = "Tableau(0).Saison"
  44.    
  45.     Range("A1975" ).Select
  46.     ActiveCell.FormulaR1C1 = "Tableau(0).Categorie"
  47.        
  48.    
  49. End Sub


Message édité par Dolu007 le 22-01-2007 à 14:35:59
Reply

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


Message édité par tegu le 22-01-2007 à 16:37:02
Reply

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 :
  1. Public Type Article
  2.     Modele As String
  3.     Matiere As String
  4.     Produit As String
  5.     Saison As String
  6.     Categorie As String
  7.     End Type
  8.    
  9.    
  10.    
  11. Sub remplir_tableau()
  12.     Public Tab(1) As Article
  13.    
  14.     'Remplissage de 1ere ligne Tableau
  15.     Tab(0).Modele = "ENZO"
  16.     Tab(0).Matiere = "JC JERSEY COTON"
  17.     Tab(0).Produit = "TC TISH MC"
  18.     Tab(0).Saison = "Z INTEMPORELS"
  19.     Tab(0).Categorie = "1 TEXTILE HOMME"
  20.    
  21.     'Remplissage de la 2ème ligne Tableau
  22.     Tab(1).Modele = "SALLY"
  23.     Tab(1).Matiere = "JL JERSEY L"
  24.     Tab(1).Produit = "TC TISH ML"
  25.     Tab(1).Saison = "Ete 2006"
  26.     Tab(1).Categorie = "2 TEXTILE FEMME"
  27. End Sub
  28.    
  29.    
  30. Sub FUSION_DES_PRINTS()
  31. '
  32.     remplir_tableau Tab
  33.    
  34.     For i = 0 To 1
  35.    
  36.     Selection.AutoFilter Field:=5, Criteria1:=tab(i).Modele, Operator:=xlAnd
  37.     Range("F1975" ).Select
  38.     ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-1946]C:R[-338]C)"
  39.     Range("F1975" ).Select
  40.     Selection.AutoFill Destination:=Range("F1975:X1975" ), Type:=xlFillDefault
  41.     Range("F1975:X1975" ).Select
  42.     Range("E1975" ).Select
  43.     ActiveCell.FormulaR1C1 = tab(i).Modele
  44.    
  45.     Range("D1975" ).Select
  46.     ActiveCell.FormulaR1C1 = tab(i).Matiere
  47.    
  48.     Range("C1975" ).Select
  49.     ActiveCell.FormulaR1C1 = tab(i).Produit
  50.    
  51.     Range("B1975" ).Select
  52.     ActiveCell.FormulaR1C1 = tab(i).Saison
  53.    
  54.     Range("A1975" ).Select
  55.     ActiveCell.FormulaR1C1 = tab(i).Categorie
  56.        
  57.    Next i
  58.  
  59. End Sub

Reply

Marsh Posté le 23-01-2007 à 09:00:16    

Une petite aide ??

Reply

Marsh Posté le 23-01-2007 à 09:00:16   

Reply

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.

Reply

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

Reply

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 ?

Message cité 1 fois
Message édité par tegu le 24-01-2007 à 10:33:58
Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed