Appeler une procédure dans une procédure

Appeler une procédure dans une procédure - VB/VBA/VBS - Programmation

Marsh Posté le 27-12-2010 à 18:09:12    

Bonjour,
 
j'ai fais un petit code VBA sous forme de SUB qui permet d'enrichir les données d'un onglet excel en fonction des données d'un autre onglet excel. Jusqu'ici rien de sorcier.
 
J'aimerais rendre ce sub "réutilisable" avec comme arguments le nom de l'onglet source et celui de l'onglet cible.
 
Comment procéder s'il vous plait ?  
 
- pour transformer mon SUB en "SUB GENERIQUE"
- appeler ce SUB GENERIQUE en lui plaçant en argument des noms d'onglet (de manière fixe dans le code directement, pas de saisie utilisateur ou autre)
 
Merci d'avance :)

Reply

Marsh Posté le 27-12-2010 à 18:09:12   

Reply

Marsh Posté le 28-12-2010 à 01:21:38    

Qu'est ce que tu appelles "onglet excel" ? Les feuilles de calculs ? les cellules ?
 
Ensuite je ne vois pas ou est le problème pour que ta fonction fonctionne avec des arguments ? Ou est-ce que tu bloques ?  
 
Développe un peu ta question parce que pour l'instant c'est pas très clair, au besoin post ton sub pour qu'on y voit plus clair !

Reply

Marsh Posté le 28-12-2010 à 01:55:27    

les onglets excel c'est les sheets, mais j'ai le code qu'il faut pour ça :)
 
Sinon bah je ne connais pas le fonctionnement des Sub avec des arguments en fait, comment initialiser le truc, et comment appeler la sub ?
 
:)

Reply

Marsh Posté le 28-12-2010 à 09:22:12    

En Basic, il y a deux sortes deux fonctions (alors qu'il n'y en a qu'un en C) : les Sub... et les Function...
 
Les Sub s'appelllent avec l'instruction Call ...
Les Function s'appellent avec ma_variable = ...
 
Les données en paramètre des Sub et des Fonctions se mettent comme en C, mais sans que l'on ait besoin d'indiquer le type.
 
Sub ma_routine(ma_var1, ma_var2)
   MsgBox("var1 = " & ma_var1 & ", var2 = " & ma_var2 & "." )
End Sub

Reply

Marsh Posté le 28-12-2010 à 12:27:18    

Ta sub, il faut que tu la mettes dans un module à part, mais je pense que tu l'as déjà fait.

 

Ensuite, si tu veux passer en paramètre le nom des onglets le début de ta sub sera :

 

sub MaRoutine(NomOnglet1 as String, NomOnglet2 as String)
...
End Sub

 

ensuite, tu lances ta routine ainsi :

Call MaRoutine("Nom de l'onglet 1", "Nom de l'onglet 2" )


La routine attendant une chaine de caractères. Mais tu peux aussi lui passer en paramètre des variables de type String :

 

Dim strOnglet1 as String
Dim strOnglet2 as String

 

strOnglet1="Feuil1"
strOnglet2="Feuil2"

 

Call MaRoutine(strOnglet1, strOnglet2)



Message édité par Otobox le 28-12-2010 à 12:28:43

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 28-12-2010 à 12:32:32    

Merci à vous, je teste ça demain au boulot ;)

Reply

Marsh Posté le 30-12-2010 à 11:17:44    

Bon alors quand j'executé la Sub en écrivant clairement en dur le nom des onglets ça marche, mais en mode Sub appelée avec 2 arguments ça ne fonctionne plus. Si vous pouvez m'aider :
 

Code :
  1. Sub Boucle_V01(arg1 As String, arg2 As String)
  2.     Dim i As Integer
  3.     'Compteur de lignes
  4.     i = 5
  5.    
  6.     Dim j As Integer
  7.     'Compteur de colonnes
  8.     j = 1
  9.    
  10.     ' Boucle pour compter les lignes :
  11.     Do
  12.         i = i + 1
  13.     Loop While Cells(i, 1) <> ""
  14.    
  15.      ' Boucle pour compter les colonnes :
  16.     Do
  17.         j = j + 1
  18.     Loop While Cells(5, j) <> ""
  19.    
  20.     Dim a As String
  21.     ' Variable pour stocker le nom de la colonne . Ex : Index etc..
  22.     Dim d As Integer
  23.     ' Coordonnée de ligne
  24.     d = 5
  25.     Dim e As Integer
  26.     ' Coordonnée de colonne
  27.     e = 1
  28.    
  29.     ' Récupération du nom de la cellule dans l'onglet cible
  30.     Do
  31.         Sheets("arg2" ).Select
  32.         Cells(d, e).Select
  33.         a = Selection
  34. '       MsgBox "Nom de la cellule " & a
  35.    
  36.         Dim b As Integer
  37.         ' Variable de coordonnée de la colonne qui contient le même nom dans l'onglet source
  38.         b = 0
  39.         Do
  40.             b = b + 1
  41.             Sheets("arg1" ).Select
  42.             Cells(5, b).Select
  43.         Loop While Selection <> a
  44.    
  45.     ' Récupération du contenu complet (toutes les lignes) de la colonne qui porte le même nom dans l'onglet source
  46.             Sheets("arg1" ).Select
  47.             Range(Cells(6, b), Cells(i, b)).Select
  48.             Selection.Copy
  49.        
  50.             Sheets("arg2" ).Select
  51.             Range(Cells(d + 1, e), Cells(i, e)).Select
  52.             Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  53.             :=False, Transpose:=False
  54.         e = e + 1
  55.     Loop While e <> j
  56.    
  57.     MsgBox "Traitement termine"
  58.    
  59. End Sub


 
Mon sub d'appel dans un module différent :

Code :
  1. Sub Boucle_V03()
  2.    Call Boucle_V01("EQUITY", "Feuil2" )
  3.  
  4. End Sub


 
Et enfin le message d'erreur est :
 

Code :
  1. Erreur d'execution '9'
  2. L'indice n'appartient pas à la selection


 
Et il me surligne en jaune la ligne #31.
 
Merci de votre aide je ne vois pas :(
 
Sachant que la Sub qui fonctionne (sans être "dynamique" ) est celle la :
 

Code :
  1. Sub Boucle_V04()
  2.     Dim i As Integer
  3.     'Compteur de lignes
  4.     i = 5
  5.    
  6.     Dim j As Integer
  7.     'Compteur de colonnes
  8.     j = 1
  9.    
  10.     ' Boucle pour compter les lignes :
  11.     Do
  12.         i = i + 1
  13.     Loop While Cells(i, 1) <> ""
  14.    
  15.      ' Boucle pour compter les colonnes :
  16.     Do
  17.         j = j + 1
  18.     Loop While Cells(5, j) <> ""
  19.    
  20.     Dim a As String
  21.     ' Variable pour stocker le nom de la colonne . Ex : Index etc..
  22.     Dim d As Integer
  23.     ' Coordonnée de ligne
  24.     d = 5
  25.     Dim e As Integer
  26.     ' Coordonnée de colonne
  27.     e = 1
  28.    
  29.     ' Récupération du nom de la cellule dans l'onglet cible
  30.     Do
  31.         Sheets("Feuil2" ).Select
  32.         Cells(d, e).Select
  33.         a = Selection
  34. '       MsgBox "Nom de la cellule " & a
  35.    
  36.         Dim b As Integer
  37.         ' Variable de coordonnée de la colonne qui contient le même nom dans l'onglet source
  38.         b = 0
  39.         Do
  40.             b = b + 1
  41.             Sheets("EQUITY" ).Select
  42.             Cells(5, b).Select
  43.         Loop While Selection <> a
  44.    
  45.     ' Récupération du contenu complet (toutes les lignes) de la colonne qui porte le même nom dans l'onglet source
  46.             Sheets("EQUITY" ).Select
  47.             Range(Cells(6, b), Cells(i, b)).Select
  48.             Selection.Copy
  49.        
  50.             Sheets("Feuil2" ).Select
  51.             Range(Cells(d + 1, e), Cells(i, e)).Select
  52.             Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  53.             :=False, Transpose:=False
  54.         e = e + 1
  55.     Loop While e <> j
  56.    
  57.     MsgBox "Traitement termine"
  58.    
  59. End Sub


Message édité par testostezor le 30-12-2010 à 11:20:57
Reply

Marsh Posté le 30-12-2010 à 11:59:06    

Enlever les guillemets dans

Citation :

Sheets("arg2" ).Select

Si on laisse les guillemets, le programme croit que l'onglet s'appelle "arg2", alors qu'en fait, il s'appelle par le nom qui est contenu dans arg2.
 
Il faut soit mettre le vrai nom entre guuillemets, Sheets("Feuil2" ).Select, soit mettre le nom de la variable sans les guillemets, Sheets(arg2).Select

Reply

Marsh Posté le 30-12-2010 à 12:07:48    

Merci j'essaye ça tout de suite :)

Reply

Marsh Posté le 30-12-2010 à 12:12:27    

Parfait ;)

Reply

Sujets relatifs:

Leave a Replay

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