Macro Excel VBA

Résolu/Fermé
grizzo - 19 févr. 2010 à 10:45
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 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
A voir également:

19 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
19 févr. 2010 à 17:01
@ +
0