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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Appeler une procédure dans une procédure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appeler une procédure dans une procédure

n°2044626
testostezo​r
金牛座
Posté le 27-12-2010 à 18:09:12  profilanswer
 

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 :)

mood
Publicité
Posté le 27-12-2010 à 18:09:12  profilanswer
 

n°2044720
fouinardom​eo
Posté le 28-12-2010 à 01:21:38  profilanswer
 

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 !

n°2044727
testostezo​r
金牛座
Posté le 28-12-2010 à 01:55:27  profilanswer
 

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 ?
 
:)

n°2044744
olivthill
Posté le 28-12-2010 à 09:22:12  profilanswer
 

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

n°2044779
otobox
Maison fondée en 2005
Posté le 28-12-2010 à 12:27:18  profilanswer
 

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
n°2044780
testostezo​r
金牛座
Posté le 28-12-2010 à 12:32:32  profilanswer
 

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

n°2045099
testostezo​r
金牛座
Posté le 30-12-2010 à 11:17:44  profilanswer
 

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
n°2045107
olivthill
Posté le 30-12-2010 à 11:59:06  profilanswer
 

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

n°2045109
testostezo​r
金牛座
Posté le 30-12-2010 à 12:07:48  profilanswer
 

Merci j'essaye ça tout de suite :)

n°2045110
testostezo​r
金牛座
Posté le 30-12-2010 à 12:12:27  profilanswer
 

Parfait ;)


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

  Appeler une procédure dans une procédure

 

Sujets relatifs
Enregistrement d'un fichier texte dans une procédure récursiveMacro Excel: Pivottables: Argument ou Appel de procédure incorrect
Paramètre d'une procedure/function stockéeAppeler un service web .NET sécurisé en Java
[javascript]Appeler une fonction dans un iframeAppeler un cmd à partir d'un vbs
Accès dynamique à une classe pour appeler .... une méthode statiqueAppeler une procédure depuis une fonction !
appeler périodiquement procédure PLSQL[Java-SQLServer] Appeler une procédure stockée contenant des espaces
Plus de sujets relatifs à : Appeler une procédure dans une procédure


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