Macro Excel VBA

Résolu
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
Configuration: Windows XP / Internet Explorer 6.0

19 réponses

  1. Modérateur
    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

    1. 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
      1. Modérateur
        Normal, j'm'a gouré dans la place des parenthèses sur xlDown ceci fonctionne mieux...
        derlig = ActiveSheet.Range("A12").End(xlDown).Row
        1. 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,
          1. Modérateur
            "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?
            1. 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.
              1. Modérateur
                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
                1. 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
                  1. Modérateur
                    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
                    1. 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
                      1. Modérateur
                        dans tes feuilles y en a t'il qui ne comportent qu'une, 2 ou 3 lignes en comptant A12?
                        1. 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,
                          1. Modérateur
                            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
                            1. 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
                              1. Modérateur
                                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
                                1. 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...
                                  1. Modérateur
                                    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
                                    1. 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