Macro Excel VBA

Résolu/Fermé
grizzo - 19 févr. 2010 à 10:45
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
- 19 févr. 2010 à 17:01
Bonjour,

Je souhaiterai créer une macro qui me permette de définir une zone d'imprission avec les étapes suivantes :
- Je me poistionne dans le classeur nommé "02P"
(j'ai plusieurs feuilles, donc copierai plusieurs fois le programme pour les différentes feuilles)
- Je me position en cellule A12
- A partir de A12 je recherche, dans la colonne, la cellule qui ne contient rien
(imaginons que c'est la cellule A19)
- Je défini la zone d'impression comme tel : A1:X19
(car je dois définir la zone sur 24 colonnes (qui est une donnée fixes) et sur les 19 lignes (dont on a trouvé avant))

Pourriez vous m'aider à paramétrer ce genre de macro ?

Je vous remercie par avance,

Cordialement,

Greg

19 réponses

pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 11:01
Bonjour,
Je n'ai pas testé mais :

Sub test()
'déclaration de la variable
Dim derlig as Integer
'fonction VBA qui affecte à notre variable le n° de la dernière ligne saisie dans la col A sous A12
derlig = ActiveSheet.Range("A12").Endxl(Down).Row
'définit la plage d'impression en fonction de notre variable
ActiveSheet.PageSetup.PrintArea = "A12:X" & derlig
End Sub

0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 11:29
Bonjour,

Merci pour votre aide, mais apparament cela ne fonctionne pas. Excel me dit :
Erreur d'execution '438'
Propriété ou méthode non gérée par cet objet

J'ai essayé de voir si la cellule sélectionnée était la bonne en mettant
Dim derlig as Integer
derlig = ActiveSheet.Range("A12").Endxl(Down).Row
Range("A" & derling).Select
Mais ça ne fonctionne pas non plus.

Pourriez-vous m'aider ?

D'avance merci
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 11:41
Normal, j'm'a gouré dans la place des parenthèses sur xlDown ceci fonctionne mieux...
derlig = ActiveSheet.Range("A12").End(xlDown).Row
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 13:50
Bonjour,

Ca y est ça fonctionne merci beaucoup

Par contre comment faire pour lui de manger de répéter cette macro sur plusieurs onglets précisémment (car sur certains onglet non)

Je vous remercie par avance de votre réponse.

Cordialement,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 13:57
"pour lui de manger " vas y si t'as faim!!
Quels sont les noms des feuilles (ou leur numéro) sur lesquelles tu veux que ce fasse cette procédure?
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 14:04
Excuse moi pour le "lui de manger" , c'était "lui demander" lol

Les feuilles ce sont "02 P","27 P" et "25 P"

Ensuite, étant donné que pour les feuilles "02 C","27 C" et "25 C", il faut l'impression aille jusqu'à la colonne AA (et non X comme celle qu'on vient de créer), comment je peux faire ?

Je te remercie par avance.
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 14:19
toujours pas testé, mais cela devrait te convenir :
Sub test()
Dim derlig As Integer
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name = "02 P" Or Ws.Name = "27 P" Or Ws.Name = "25 P" Then
MsgBox Ws.Name
derlig = ActiveSheet.Range("A12").End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:X" & derlig
ElseIf Ws.Name = "02 C" Or Ws.Name = "27 C" Or Ws.Name = "25 C" Then
MsgBox Ws.Name
derlig = ActiveSheet.Range("A12").End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:AA" & derlig
End If
Next Ws
End Sub
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 14:34
Lorsque j'execute le macro une fenêtre s'ouvre et il est juste marqué "02 P" avec comme seule possibilité le bouton "OK". En cliquant sur "OK" , il y a un message d'erreur :
Erreur d'execution '6'
Dépassement de capacité

Je ne comprend pas ce que cela peut signifier.

Aurriez-vous une idée ?

Je vous remercie par avance
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 14:43
J'avais prévu cette possibilité d'erreur, d'où les MsgBox... En fait, dans certaines feuilles tu n'as qu'une ou 2 lignes. Fait comme ceci :

Sub test()
Dim derlig As Integer
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name = "02 P" Or Ws.Name = "27 P" Or Ws.Name = "25 P" Then
derlig = ActiveSheet.Range("A12").CurrentRegion.End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:X" & derlig
ElseIf Ws.Name = "02 C" Or Ws.Name = "27 C" Or Ws.Name = "25 C" Then
derlig = ActiveSheet.Range("A12").CurrentRegion.End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:AA" & derlig
End If
Next Ws
End Sub
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 14:50
La fenêtre où il était juste marqué "02 P" avec comme seule possibilité le bouton "OK", n'apparait plus.

Par contre, j'ai toujours le même message d'erreur:
Erreur d'execution '6'
Dépassement de capacité

La ligne qui pose problème apparament, vu qu'elle apparait en jaune, est :
derlig = ActiveSheet.Range("A12").CurrentRegion.End(xlDown).Row

D'avance merci pour votre réponse
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 14:53
dans tes feuilles y en a t'il qui ne comportent qu'une, 2 ou 3 lignes en comptant A12?
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 15:00
Non le minimum c'est 4 lignes après A12.

J'ai créé la macro en répétant bêtement 6 fois les lignes (en modifiant le nom des feuilles) et en modifiant la colone X en AA pour celle concernées et cela a fonctionné:

Sheets("02 P").Select
derlig = ActiveSheet.Range("A12").End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A1:X" & derlig

Donc je pense pas que le problème viennent de la feuille, mais plutot de la formule, non ?

Je vous remercie par avance,
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 15:07
Il faut alors compléter notre macro par quelques tests :

Sub test()
Dim derlig As Integer
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
'si la feuille s'appelle 02 P ou 27 P ou 25 P alors
If Ws.Name = "02 P" Or Ws.Name = "27 P" Or Ws.Name = "25 P" Then
Ws.Activate
'si la cellule A12 est vide on passe à la feuille suivante
If Ws.Range("A12") = "" Then GoTo suivante
If Ws.Range("A13") = "" Then
ActiveSheet.PageSetup.PrintArea = "A12:X12"
GoTo suivante
End If
If Ws.Range("A14") = "" Then
ActiveSheet.PageSetup.PrintArea = "A12:X13"
GoTo suivante
End If
derlig = ActiveSheet.Range("A12").CurrentRegion.End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:X" & derlig
ElseIf Ws.Name = "02 C" Or Ws.Name = "27 C" Or Ws.Name = "25 C" Then
Ws.Activate
If Ws.Range("A12") = "" Then GoTo suivante
If Ws.Range("A13") = "" Then
ActiveSheet.PageSetup.PrintArea = "A12:X12"
GoTo suivante
End If
If Ws.Range("A14") = "" Then
ActiveSheet.PageSetup.PrintArea = "A12:X13"
GoTo suivante
End If
derlig = ActiveSheet.Range("A12").CurrentRegion.End(xlDown).Row
ActiveSheet.PageSetup.PrintArea = "A12:AA" & derlig
End If
suivante:
Next Ws
End Sub 


Essaye et tiens moi au courant
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 15:25
Cela fonctionne très très bien !!!!

Je vous remercie sincèrement car cela va beaucoup m'aider.

J'aurai 2 autre questions qui sont la suite de cette macro :

- Je souhaiterai créer une macro qui n'imprime que les feuilles dont la cellule G36 est différente de '0.

- Je souhaiterai créer une macro (M2) qui éxécute plusieurs fois une macro (M1) que j'ai d'ores et déjà programmé. Par contre, je souhaite qu'au lancement de la macro (M2) on me demande combien de fois je souhaite qu'il exécute l'autre macro (M1).

L'objectif est d'imprimer un rapport qui est composé de plusieurs feuilles dans plusieurs fichier, mais dans un ordre précis et de définir au départ le nombre de rapport que je souhaite.

Je vous remercie par avance
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 15:45
pour l'impression si G36 est non vide :

Sub imprime_si()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Range("G36") <> "" Then
ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
End Sub


pour l'exécution multiple de macro :

Sub lancer_plusieurs_fois()
Dim i As Integer, n As Integer
n = CInt(InputBox("saisir le nombre de fois ou vous souhaitez exécuter la macro"))
For i = 1 To n
Application.Run ("nom_de_la_macro_que_tu_veux_lancer_plusieurs_fois")
MsgBox i
Next i
End Sub
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 16:12
Pour l'impression si G36 est non vide :

La fonction imprime si ne fonctionne pas : elle n'envoie rien à l'impression.
Je pense qu'elle ne sélectionne pas les onglets.

pour l'exécution multiple de macro :

La macro fonctionne très bien par contre à chaque fois qu'elle termine la macro M1, une fenêtre s'ouvre avec marqué "1" et il attend que je clique sur "ok" pour lancer la deuxième execution.
Y-a-til un moyen de ne pas afficher ce message ? car si j'ai 20 rapports à faire je dois à chaque fois valider pour lancer l'impression du second rapport...
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 16:29
oups... vivement ce soir!!
Sub imprime_si()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
If ws.Range("G36") <> "" Then
ws.Activate 'ben oui quoi si on ne l'active pas on ne peux pas imprimer...
ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
End Sub


et re oups...
Pourquoi tu n'aimes pas devoir cliquer?????
pfff exigeant avec ça!!

Sub lancer_plusieurs_fois()
Dim i As Integer, n As Integer
n = CInt(InputBox("saisir le nombre de fois ou vous souhaitez exécuter la macro"))
For i = 1 To n
Application.Run ("nom_de_la_macro_que_tu_veux_lancer_plusieurs_fois")
Next i
End Sub
0
grizzo
Messages postés
11
Date d'inscription
vendredi 19 février 2010
Statut
Membre
Dernière intervention
19 février 2010

19 févr. 2010 à 16:58
Tout fonctionne super bien!!!

Je vous remercie sincèrement pour le temps que vous avez passez à m'aider à réaliser ces macros.

Bonne continuation

@ bientot
0
pijaku
Messages postés
12259
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2022
2 701
19 févr. 2010 à 17:01
@ +
0