Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Code VBA et appel d'un sous programme en fonction du rapport choisi

Chrystel01

XLDnaute Occasionnel
Bonjour,

Je souhaitais simplifier une macro mais je tourne en rond. Sauriez-vous m'aider svp ?

A partir d'un menu, en cliquant sur un bouton, un programme se lance qui permet d'accéder à un rapport (un onglet) et de lancer diverses opérations pour alimenter ce rapport.
Mais j'ai une 30 aines de rapports à réaliser, donc potentiellement 30 programmes à répéter.
Sachant que ces rapports sont tous alimentés de la même façon et afin d'éviter de répéter 3O fois le programme d'alimentation, je pensais utiliser la fonction call


Un 1er code définirait le nom de l'onglet sur lequel travailler

Sub onglet()
Dim TabRecap As Worksheet
Set TabRecap = ActiveWorkbook.Sheets("TAB_RECAP_75001")
Call copy_tcd
End Sub

Un 2ème code lancerait le programme d'alimentation de données sur l'onglet défini ds sub onglet()
Sub copy_tcd()
TabRecap.Range("A6:Av1000").Clear
TabRecap.Range("BD6:BD3000").copy TabRecap.Range("A6")
....

Cela ne fonctionne pas car il me dit que je n'ai pas défini mes variables dans le code sub copy....

Avez vous des suggestions SVP pour travailler sur ce type de programme où seul le nom de l'onglet change en fonction du bouton choisi ?

Merci d'avance pour votre aide !

Chrystel
 
Solution
Bonjour Chrystel,
Vous pouvez passer le nom de la feuille en paramètre avec :
VB:
Call copy_tcd(Feuille)
Feuille étant la sheet que vous voulez traiter, puis utiliser ce nom pour accéder à la bonne feuille :
Code:
Sub copy_tcd(NomFeuille)
With Sheets(NomFeuille)
     .Range("A6:Av1000").Clear
     .Range("BD6:BD3000").copy  .Range("A6")
....
End With

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Chrystel,
Vous pouvez passer le nom de la feuille en paramètre avec :
VB:
Call copy_tcd(Feuille)
Feuille étant la sheet que vous voulez traiter, puis utiliser ce nom pour accéder à la bonne feuille :
Code:
Sub copy_tcd(NomFeuille)
With Sheets(NomFeuille)
     .Range("A6:Av1000").Clear
     .Range("BD6:BD3000").copy  .Range("A6")
....
End With
 

Chrystel01

XLDnaute Occasionnel
Bonjour Sylvanu,

Merci beaucoup pour votre réponse.

J'ai essayé avec votre code
Quand j'ai fait "Call copy_tcd(Feuille)" : j'ai une erreur variable non définie
J'ai essayé de remplacer par "Call copy_tcd(MaFeuille)" et là j'ai une erreur " erreur d'execution 13 - incompatibilité de type...)
Sauriez-vous me dire ce qui pose soucis ?
Merci d'avance

Mon code est ci-dessous

Sub MAJ()
Dim NomFeuille As Worksheet
Set NomFeuille = ActiveWorkbook.Sheets("TAB_RECAP_75001")
Call copy_tcd(NomFeuille)
End Sub


Sub copy_tcd(NomFeuille)
With Sheets(NomFeuille)
.Range("A6:Av1000").Clear
.Range("BD6:BD3000").copy .Range("A6")
End With
End Sub
 

Chrystel01

XLDnaute Occasionnel
Je me suis compliquée la vie pour rien effectivement.
Merci beaucoup Sylvanu.
Cela fonctionne parfaitement et va me faire gagner énormément en temps et lisibilité.
Je vous souhaite une excellente semaine !
 

Chrystel01

XLDnaute Occasionnel
J'aurais une question complémentaire Sylvanu SVP:
J'utilise déjà dans le code principal les fonctions "with -end with" pour faire des bordures, insérer des listes de validation dans la feuille.
Mais j'ai l'impression suivante : le programme comprend que c'est le end with de la feuille puisque les actions ne sont pas poursuivies.
Comment faire comprendre qu'on a le "with" principal qui porte sur la feuille puis des sous fonctions "with end with" dans cette même feuille ?
Je joints le code VBA au cas où je ne serais pas claire.
Merci pour votre aide !
 

Pièces jointes

  • PB WITH.xlsm
    439.2 KB · Affichages: 15

sylvanu

XLDnaute Barbatruc
Supporter XLD
Je pense qu'il est perdu avec l'imbrication de deux with :
VB:
With Sheets(NomFeuille)
  ...
  With MaZoneRange1
     ...
  End With
  ...
End With
Supprimez le second With et remplacez par :
Faites plutôt :
Code:
    MaZoneRange1.Borders(xlEdgeLeft).LineStyle = 1                              '7
    MaZoneRange1.Borders(xlEdgeTop).LineStyle = 1                               '8
    MaZoneRange1.Borders(xlEdgeBottom).LineStyle = 1                            '9
    MaZoneRange1.Borders(xlEdgeRight).LineStyle = 1                             '10
    MaZoneRange1.Borders(xlInsideVertical).LineStyle = 1                        '11
    MaZoneRange2.Borders(xlEdgeRight).LineStyle = 7                 '10
    Range("A6:AV" & derlig).Borders(xlEdgeTop).LineStyle = 7        '8
    Range("A6:AV" & derlig).Borders(xlEdgeBottom).LineStyle = 7     '9
 

Chrystel01

XLDnaute Occasionnel
Bonsoir Sylvanu,
Bonsoir le Forum,

Toujours dans la suite, j'aurais besoin de votre aide svp car mon programme ne se poursuit pas dans la feuille définie en paramètre ...
*un 1er code définit le nom de l'onglet sur lequel travailler
*Un 2ème code lance le programme d'alimentation des données de l'onglet défini ds sub onglet()
Dans ce 2ème code, après avoir réalisé des copies et réformaté un tableau, je crée des listes de validation et supprime des lignes.

Ce programme fonctionne quand je suis sur la feuille tab_recap 69001 sur laquelle doivent se faire les opérations, mais pas sur une feuille menu. Les listes de validations et suppressions de lignes ne sont pas réalisées... comme s'il ne comprenait plus qu'il faut toujours travailler sur cette même feuille.

Je vous joints le code si cela est plus clair et vous remercie pour votre aide.

Chrystel
 

Pièces jointes

  • PB WITH.xlsm
    437.6 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Chrystel,
Apparament vous faites dans Onglet :
VB:
NomFeuille = "TAB_RECAP_69001"
Call copy_tcd(ActiveSheet)
donc évidemment il ne travaille que sur TAB_RECAP_69001.
Si vous voulez qu'il travaille sur la feuille courante, lancez directement copy_tcd avec :
Code:
Sub copy_tcd()
Dim x As Integer
With Sheets(ActiveSheet)
.....

'Si on a démarré sur une autre feuille, le programme ne reste pas sur le tab-recap69001 malgré le with du départ
Attention à partir de ce commentaire il manque le point devant les Range :
Code:
Range("AB6:AD" & derlig).Validation.Delete
remplacé par
.Range("AB6:AD" & derlig).Validation.Delete
 

Chrystel01

XLDnaute Occasionnel
Bonsoir Sylvanu, Bonsoir Phil69970,

Merci beaucoup pour vos réponses et votre réactivité !

Je souhaite bien travailler sur le TAB_RECAP 69001 qui est affecté à un bouton de macro.

J'ai ajouté tous les points devant les range et le programme s'est poursuivi normalement !
Je ne connaissais pas cette subtilité. Je suppose que cela va avec le with.

Merci encore pour votre efficacité !!
Bonne soiréee

Chrystel
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
With évite de répéter le range utilisé, par ex :
VB:
Sheets("toto").Range("A1")=0
Sheets("toto").Range("A2")=0
Sheets("toto").Range("A3")=0
peut être remplacé par
With Sheets("toto")
    .Range("A1")=0
    .Range("A2")=0
    .Range("A3")=0
End With
Le point signifie que le VBA doit utilisé le Range défini par le With.
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…