IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro d'ajustement de zone d'impression automatique


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 84
    Points : 37
    Points
    37
    Par défaut Macro d'ajustement de zone d'impression automatique
    Bonjour,

    J'utilise une macro pour ajuster automatiquement une zone d'impression qui change en fonction de la mise à jour d'un TCD.

    Voici le code de la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    If Range("z1").Value = "" Then
    Range("z1").Value = ActiveCell.Row
    Range("z2").Value = ActiveCell.Column
    Else
    Range("z3").Value = ActiveCell.Row
    Range("z4").Value = ActiveCell.Column
    Range("AA1").Value = "=ADDRESS(RC[-1],R[1]C[-1]) & "":"" & ADDRESS(R[2]C[-1],R[3]C[-1])"
    imprim
    End If
    End Sub
    Voici le code dans le module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub imprim()
    plage = Range("aa1").Value
    ActiveSheet.PageSetup.PrintArea = plage
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    End Sub

    Cette macro m'est bien utile mais j'ai un souci avec : lorsque je fais un clic droit sur mon tableau (car dans mon cas il s'agit d'un TCD), la zone d'impression se redéfinit toute seule vers la cellule cliquée et l'impression s’exécute toute seule... Il y a t il un moyen de contrer cela ?

    Autre petite particularité, la page concernée par la macro est un tableau croisé dynamique de la colonne A à Q, avec un nombre de lignes différent selon les rafraîchissement du TCD. Puis des formules colonnes R à X étendu sur 300 lignes (taille maxi que peut faire le TCD). La zone d'impression qui m'intéresse est de colonne A à V et sur le nombre de lignes du TCD, donc pas nécessairement jusqu'à la ligne 300.

    Or la macro imprime sur la zone de cellules non vides (donc colonne X et ligne 300).

    Comment réduire la zone d'impression en figeant la colonne V comme limite de colonnes ainsi que la dernière ligne du TCD (et non des formules) comme limite de lignes ?

    Merci d'avance

    Cdt

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    c'est l'événement BeforeRightClick dans ton code qui déclenche l'événement en faisant un clic droit.

    et pour lui l'activecell est celle qui est sélectionné. (je suppose)

    https://msdn.microsoft.com/FR-FR/lib.../ff192993.aspx

    peut-être qu'il faut mettre un bouton associé à la macro sur ta feuille pour activer la macro seulement à la demande.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut Ajouté précision
    Bonjour,
    Si tu veux que le clic droit agisse ou n'agisse pas dans une certaine zone, il faut utiliser la méthode Intersect.
    J'ajouterais que si tu veux définir une zone d'impression d'après les données d'un tableau croisé dynamique, il est plus intéressant d'utiliser les propriétés de celui-ci
    Petit exemple qui agit uniquement si l'on fait un clic droit en dehors de la zone des données d'un tableau croisé dynamique et qui définit la zone d'impression sur cette plage.
    Cet exemple ne fonctionne que sur le premier tableau croisé dynamique présent sur la feuille, n'intercepte pas les erreurs éventuelles (s'il n'y a pas de tableau croisé dynamique) et ne tient pas compte de la zone des filtres. C'est donc une procédure d'exemple qui doit être adaptée.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
     Dim pvt As PivotTable, rng As Range
     Set pvt = Me.PivotTables(1): Set rng = pvt.TableRange1
     If Not Intersect(rng, Target) Is Nothing Then Exit Sub
     Cancel = False
     If MsgBox("Voulez-vous définir la plage " & rng.Address & " comme zone d'impression ?", vbYesNo) Then
      Me.PageSetup.PrintArea = rng.Address
     End If
     Cancel = True
    End Sub
    [EDIT]
    Pour utiliser la plage totale du tableau croisé dynamique il faut utiliser la propriété TableRange2.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 84
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    En fait j'aimerai mieux que la définition de la zone d'impression se fasse automatiquement.

    Merci pour le code, j'ai bien compris le fait d'utiliser les propriétés du TCD mais ma zone d'impression va au delà :

    la page concernée par l'impression est un tableau croisé dynamique de la colonne A à Q, avec un nombre de lignes différent selon les rafraîchissement du TCD. Puis des formules colonnes R à X étendu sur 300 lignes (taille maxi que peut faire le TCD). La zone d'impression qui m'intéresse est de colonne A à V et sur le nombre de lignes du TCD (inclus les quelques lignes de titre au dessus du TCD)

    Merci par avance

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En fait j'aimerai mieux que la définition de la zone d'impression se fasse automatiquement.
    Comme je l'ai précisé dans ma réponse, la procédure était un exemple à adapter. Si tu enlèves la fonction MsgBox la Zone d'impression sera automatiquement définie par la plage du TCD.
    Cette procédure avait pour but de te montrer comment éviter que le clic droit à l'intérieur du tableau croisé dynamique n'affiche plus le menu contextuel alors que le clic droit sur une autre cellule fasse le travail souhaité et qu'il était plus simple de travailler avec une variable objet de type PivotTable que de passer par la fonction Adresse d'Excel.

    A toi d'adapter le code comme tu l'entends
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 84
    Points : 37
    Points
    37
    Par défaut
    Je ne comprend pas du tout les solutions proposé désolé, mon niveau se limite à ajuster des plages dans des macros...

    Je pense malgré tout approcher de la vérité...

    Comme :
    - la première ligne est connue -> 1
    - la première colonne est connue -> 2
    - La dernière colonne est connue -> 22

    Il me reste donc a déterminer la dernière ligne pour compléter ma formule définissant la zone d'impression.
    Pour cela j'ai trouvé sur le net ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim LastLigne As Integer
    LastLigne = Range("B1000").End(xlUp).Row

    Voici le code de la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Private Sub Zonedimpression(ByVal Target As Range, Cancel As Boolean)
    Dim LastLigne As Integer
    LastLigne = Range("B1000").End(xlUp).Row
    Cancel = True
    If Range("z1").Value = "" Then
    Range("z1").Value = "1"
    Range("z2").Value = "2"
    Else
    Range("z3").Value = LastLigne
    Range("z4").Value = "22"
    Range("AA1").Value = "=ADDRESS(RC[-1],R[1]C[-1]) & "":"" & ADDRESS(R[2]C[-1],R[3]C[-1])"
    imprim1
    End If
    End Sub
    Voici le code dans le module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub imprim1()
    plage = Range("AA1").Value
    ActiveSheet.PageSetup.PrintArea = plage
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    End Sub
    Pour le moment cela ne fonctionne pas, mes valeurs en z1, z2, z3 et z4 restent les mêmes...

    Pourquoi selon vous cela peut bloquer svp ?

    Merci

    Cdt

Discussions similaires

  1. [XL-2007] Ajuster un arrière plan à une zone d'impression
    Par YassDumb dans le forum Excel
    Réponses: 1
    Dernier message: 12/07/2012, 12h40
  2. [XL-2010] macro zone d'impression
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/04/2011, 16h57
  3. Ajuster une zone d'impression
    Par ogho4326 dans le forum Excel
    Réponses: 6
    Dernier message: 02/01/2009, 19h33
  4. [VBA-E] - Excel- A juster automatiquement une zone d'impression
    Par nkhalidy dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/03/2007, 18h05
  5. [VBA]Macro d'impression automatique
    Par olivier45fr dans le forum SDK
    Réponses: 5
    Dernier message: 27/11/2006, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo