Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1506 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Variables Dynamiques & Fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Variables Dynamiques & Fonction

n°1505127
Dolu007
Posté le 19-01-2007 à 15:32:04  profilanswer
 

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 ?

mood
Publicité
Posté le 19-01-2007 à 15:32:04  profilanswer
 

n°1505160
tegu
Posté le 19-01-2007 à 16:09:28  profilanswer
 

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

n°1505170
Dolu007
Posté le 19-01-2007 à 16:25:40  profilanswer
 

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

n°1505773
Dolu007
Posté le 22-01-2007 à 09:38:05  profilanswer
 

Personne en ce magnifique lundi pour m'expliquer??

n°1505795
Dolu007
Posté le 22-01-2007 à 10:46:50  profilanswer
 

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

n°1505869
tegu
Posté le 22-01-2007 à 13:25:27  profilanswer
 

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)


n°1505904
Dolu007
Posté le 22-01-2007 à 14:34:42  profilanswer
 

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
n°1505972
tegu
Posté le 22-01-2007 à 16:35:05  profilanswer
 

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
n°1506000
Dolu007
Posté le 22-01-2007 à 17:39:39  profilanswer
 

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

n°1506171
Dolu007
Posté le 23-01-2007 à 09:00:16  profilanswer
 

Une petite aide ??

mood
Publicité
Posté le 23-01-2007 à 09:00:16  profilanswer
 

n°1506179
tegu
Posté le 23-01-2007 à 09:19:00  profilanswer
 

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.

n°1506585
Dolu007
Posté le 24-01-2007 à 09:12:56  profilanswer
 

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

n°1506632
tegu
Posté le 24-01-2007 à 10:32:03  profilanswer
 

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
n°1506685
Dolu007
Posté le 24-01-2007 à 11:55:40  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Variables Dynamiques & Fonction

 

Sujets relatifs
Surchage de la fonction onClick d'un lienfonction mkdir, choix du dossier destination ?
Expressions Régulières dans une fonctionbloquer la fonction replace sur une ligne
[C#] Fonction addslashesfonction mail () Cc et Bc
Probleme avec la fonction system()Connaitre la ligne affecté par la fonction 'UPDATE
Fonction bloquante et d'attenteFonction FILE, file_get_contents qui marche pas toujours. Help!
Plus de sujets relatifs à : Variables Dynamiques & Fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR