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 :

Aperçu avant impression d'une plage non vide


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2012
    Messages : 139
    Par défaut Aperçu avant impression d'une plage non vide
    Bonjour,
    j'ai un tableau de 13 colonnes et 1200 lignes, ces dernières étant remplies jour après jour par l'utilisateur. Certaines cellules d'une ligne peuvent être vides. La seule colonne dont les cellules sont obligatoirement remplies et qui peut servir pour compter les lignes non vides est la colonne 3 ou "C".

    Pour que l'utilisateur puisse imprimer le tableau jusqu'à la dernière ligne non vide, j'ai créé un bouton qui ouvre l'aperçu avant impression et essayé 2 piste :
    la première en créant un nom 'zone_d_impression' avec la formule "=DECALER('mafeuille'!$A$2;;;NBVAL('mafeuille'!$C:$C);13)" et en donnant au bouton le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton3_Click()
    Application.Dialogs(xlDialogPrintPreview).Show False
    End Sub
    Cela fonctionne bien mais dès que l'on touche à la mise en page, une nouvelle zone d'impression type "='mafeuille'!$A$2:$N$4" se crée et fout tout par terre.

    En furetant sur la toile, j'ai trouvé un code que j'ai adapté et attribué au bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandButton3_Click()
    PageSetup.PrintArea = Range([A2], Columns(13).Find("*", , , , , xlPrevious)).Address 'Columns(13) me permet d'avoir le tableau dans son entièreté
    Application.Dialogs(xlDialogPrintPreview).Show False
    End Sub
    C'est simple mais avec un défaut : c'est que la colonne 13 ("M") sert à déterminer la dernière ligne non vide et les cellules de cette colonne ne sont pas forcément remplies.
    Je cherche donc à l'améliorer pour prendre en référence de comptage des lignes non vides la colonne "C".
    (je me suis essayé au Rows.count mais je me suis vite noyé dans des erreurs successives et insurmontables pour moi.

    Si vous avez une piste pour m'aiguiller, je fonce
    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2012
    Messages : 139
    Par défaut
    en fouinant un peu, j"ai trouvé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CommandButton3_Click()
    Dim x As Long
     
    x = Sheets("mafeuille_1").Range("a" & Rows.Count).End(xlUp).Row
    Sheets("mafeuille_1").Range("a2:l" & x).Copy Sheets("mafeuille_2").Range("a" & Rows.Count).End(xlUp).Offset(1, 0) 'mafeuille_2 est bien sur dans un autre fichier!
     
    End Sub
    Il me reste à trouver le code pour que la copie se fasse vers un autre fichier. Ouf! ça avance. Bon il est 2h du mat, c'est l'heure pour papy d'aller au lit !
    Mais je reste ouvert à toute orientation comme demandé ci-dessus.

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 116
    Par défaut
    Essaie comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("mafeuille_1").Range("a2:l" & x).Copy Destination:=Workbooks("Fichier.xls").Worksheets("mafeuille_2").Range("A1")
    Tu n'as qu'à remplacer Fichier.xls par le nom du fichier dans lequel tu veux le copier. Tel que je l'ai écrit le tableau de la feuille "mafeuille_1" va être copié sur la cellule A1 de l'autre fichier. Si tu souhaites le copier sur une autre cellule il te suffit de remplacer A1 par la cellule de ton choix.

    J'espère que ma réponse t'aidera

  4. #4
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2012
    Messages : 139
    Par défaut
    Bonjour, j'ai adapté ton code sur ma macro d'importation de donnée (je clique sur le bouton du fichier de synthèse, cela ouvre et copie la sélection non vide de la feuille "activités" du fichier "activités Recherche" pour la coller sur la feuille "Metz" de mon fichier de synthèse.
    Mais cela bloque à la ligne 5 (erreur d'exécution '2147....(800z000b), le focus ne peut être déplacé sur le contrôle car celui-ci est invisible, non activé, etc.)
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub import()
    Dim x As Long
     
    Workbooks.Open Filename:="C:\Documents and Settings\vincent\Bureau\pilotage activités\Activités Recherche.xls"
    Sheets("Activités").Range("B3:l" & x).Copy Destination:=Workbooks("C:\Documents and Settings\vincent\Bureau\pilotage activités\Activités synthèse ZD-E et FFECSA.xls").Worksheets("Act Metz").Range("B3")
    End Sub
    Pour information, voici le code un peu laborieux que j'utilisais avant et qui fonctionnait mais en sélectionnant toutes les lignes, même les vides (il se répète 8 fois car il y a 8 fichiers différents !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Import()
    Application.ScreenUpdating = False
     Workbooks.Open Filename:="C:\Documents and Settings\vincent\Bureau\pilotage activités\Activités Recherche.xls"
       Worksheets("Activités").Range("B3:N1202").Copy
     
     Windows("Activités synthèse ZD-E et FFECSA.xls").Activate
        Worksheets("Act Metz").Activate
          Range("B3").Select
           Selection.PasteSpecial Paste:=xlPasteValues
           Selection.PasteSpecial Paste:=xlPasteFormats
         Application.CutCopyMode = False
       Range("A3").Select
     Windows("Activités Recherche.xls").Close savechange = False
    End Sub

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir
    Ton dernier code pourra être écrit comme ceci
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub Import()
    Dim Wbk As Workbook
    Dim LastLig As Long
    Dim Fichier As String
     
    Application.ScreenUpdating = False
    Fichier = "C:\Documents and Settings\vincent\Bureau\pilotage activités\Activités Recherche.xls"
    If Dir(Fichier) <> "" Then
        Set Wbk = Workbooks.Open(Fichier)
        With Wbk.Worksheets("Activités")
            LastLig = .Cells(.Rows.Count, "C").End(xlUp).Row
            .Range("B3:N" & LastLig).Copy
        End With
     
        With ThisWorkbook.Worksheets("Act Metz").Range("B3")
            .PasteSpecial Paste:=xlPasteValues
            .PasteSpecial Paste:=xlPasteFormats
        End With
     
        Application.CutCopyMode = False
        Wbk.Close False
        Set Wbk = Nothing
    End If
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2012
    Messages : 139
    Par défaut
    Cela marche du tonnerre ! et en plus l'exécution est beaucoup plus rapide.

    Encore un code que je vais mettre dans ma boîte à outils car je cherchais depuis longtemps un code simple et didactique pour le comptage des non vides.
    Encore merci.
    Je vais essayer de l'adapter pour l'intégrer à ma macro printPreview
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton3_Click()
    Application.Dialogs(xlDialogPrintPreview).Show False
    End Sub
    car actuellement je défini la zone d'impression avec la fonction DECALER dans un nom zone_d_impression. Cela ne me satisfait pas car pas protégée contre l'action d'un utilisateur qui irait dans le menu de mise en page, ce qui efface la fonction DECALER. Je dirai bientôt où j'en suis !!!

    Par ailleurs, dans mon fichier synthèse, je fusionne les données importées dans mes feuilles. Mais lors de la fusion, je n'ai que les valeurs et je suis donc obligé de faire une macro que j'appelle en fin de procédure pour appliquer les formats aux cellules fusionnées. Voici la macro de fusion que j'utilise (elle a été finalisée par un autre membre car je ramais pour simplifier la macro du départ, initiée avec l'enregistreur de macro donc lonnnnnnnnnngue ! ):
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Private Sub CommandButton2_Click()
        Call import
        Feuil1.Unprotect "xxxx"
        Dim Lig1 As Integer
        Dim Col1 As Integer 
        Dim MaFeuille As Worksheet 
        Dim Ligne As Integer  
     
        Application.ScreenUpdating = False  
     
        Feuil1.Range("A3:N6002").Cells.Clear
     
        Lig1 = 3 
     
        For Each MaFeuille In Sheets 
            If MaFeuille.Name Like "Act*" Then    'dans un but pratique, toutes les feuilles importées (8 sur 15 que compte le fichier) commencent par Act
     
                With MaFeuille
                     For Ligne = 3 To .UsedRange.Row + .UsedRange.Rows.Count
                       If .Cells(Ligne, 2) <> "" Then  
                             For Col1 = 1 To 14
                                 Feuil1.Cells(Lig1, Col1).Value = .Cells(Ligne, Col1).Value
                             Next
                             Lig1 = Lig1 + 1
                         End If
                     Next
                End With
     
            End If
        Next
     
        Worksheets("Synthèse ZD-E").Select   'ligne servant à déselectionner "a3:M6002". Ce n'est pas beau mais je n'ai pas d'autre solution
           'Pourquoi pas !
      Call format  'la macro pour mettre bordures, centrage, couleur de police, etc.
     
        Application.ScreenUpdating = True
    Feuil1.Protect "xxxx", , True, , , , , , , , , , , , True
    End Sub
    C'est la ligne 22 qui me gêne car j'ai bien essayé d'intégrer la prise en compte du format (comme dans le PasteSpecial) mais sans succès.

Discussions similaires

  1. [Débutant] Impression/Aperçu avant impression d'une Picturebox
    Par Pro_gamer80 dans le forum VB.NET
    Réponses: 0
    Dernier message: 20/05/2015, 11h55
  2. [XL-2003] Aperçu avant impression d'une plage non vide
    Par mikadoo57 dans le forum Contribuez
    Réponses: 0
    Dernier message: 05/01/2013, 17h13
  3. Aperçu avant impression d'une JTable
    Par Polux000 dans le forum Composants
    Réponses: 4
    Dernier message: 03/10/2012, 16h32
  4. Aperçu Avant impression sur une JTable
    Par Dine_Med dans le forum Composants
    Réponses: 2
    Dernier message: 13/02/2011, 01h00
  5. Comment réaliser un aperçu avant impression avec une table ?
    Par Yoni Lebene dans le forum Bases de données
    Réponses: 13
    Dernier message: 17/12/2007, 11h56

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