macro pour imprimer une partie d'une feuille sur une autre

boudu

XLDnaute Occasionnel
Bonjour à tous
Je souhaite disposer d'un bouton sur la feuille de saisie pour imprimer une partie de feuille:
L'utilisateur saisit au fur et à mesure du mois la consommation de 4 elemnts (R, V, V+, X) apres avoir recupéré dans une base située sur la premiere feuille le nom de la personne
Je souhaite recuperer sur une troisieme feuille par macro juste la colonne nom et les totaux des 4 elements
Mon tableau reel fait 300 lignes, je ne voudrais avoir que les lignes remplies
Je joins le fichier test
Merci d'avance
 

Pièces jointes

  • conso.zip
    17.5 KB · Affichages: 64
  • conso.zip
    17.5 KB · Affichages: 69
  • conso.zip
    17.5 KB · Affichages: 73

Gorfael

XLDnaute Barbatruc
Re : macro pour imprimer une partie d'une feuille sur une autre

boudu à dit:
Bonjour à tous
Je souhaite disposer d'un bouton sur la feuille de saisie pour imprimer une partie de feuille:
L'utilisateur saisit au fur et à mesure du mois la consommation de 4 elemnts (R, V, V+, X) apres avoir recupéré dans une base située sur la premiere feuille le nom de la personne
Je souhaite recuperer sur une troisieme feuille par macro juste la colonne nom et les totaux des 4 elements
Mon tableau reel fait 300 lignes, je ne voudrais avoir que les lignes remplies
Je joins le fichier test
Merci d'avance
Salut
Code:
Sub test()
Dim F_S As Worksheet
Dim F_D As Worksheet
Dim Lig_S As Long
Dim Lig_D As Long

Set F_S = Sheets("consommation")
Set F_D = Sheets("impression")

F_D.Select
'on efface la dernière impression
Rows("1:" & Range("A65536").End(xlUp).Row).Delete

F_S.Select
Range("A2").Copy Destination:=F_D.Range("A2")
F_D.Range("A1") = Range("B1") & " / " & Range("A1")
Range("CQ1:CT2").Copy Destination:=F_D.Range("B1")
Lig_D = 3
For Lig_S = 3 To Range("A65536").End(xlUp).Row
    If (Range("CQ" & Lig_S) + F_S.Range("CR" & Lig_S) + _
        F_S.Range("CS" & Lig_S) + F_S.Range("CT" & Lig_S)) > 0 Then
        F_D.Range("A" & Lig_D) = F_S.Range("A" & Lig_S)
        F_D.Range("B" & Lig_D) = F_S.Range("CQ" & Lig_S)
        F_D.Range("C" & Lig_D) = F_S.Range("CR" & Lig_S)
        F_D.Range("D" & Lig_D) = F_S.Range("CS" & Lig_S)
        F_D.Range("E" & Lig_D) = F_S.Range("CT" & Lig_S)
        Lig_D = Lig_D + 1
    End If
Next Lig_S
End Sub
A+
 

boudu

XLDnaute Occasionnel
Re : macro pour imprimer une partie d'une feuille sur une autre

Salut Gorfael, le forum
C'est absolument impeccable, juste un petit truc mais je vais essayer de trouver une solution: j'ai mis le bouton pour lancer la macro en haut à gauche mais ça apparait sur la feuille impression (ce serait mieux sans!
Quelqu'un saurait-il comment faire pour que le bouton suive quand on est plus bas dans la feuille car j'ai pas mal de noms et à la fin du mois quand je veux lancer la fameuse impression j'aimerais mieux que le bouton ait suivi (le luxe quoi!
Bonne journée à tous
 

chris

XLDnaute Barbatruc
Re : macro pour imprimer une partie d'une feuille sur une autre

Bonjour
Une solution : placer le ou les boutons sur la ligne 1, figer les volets pour garder l'affichage de la ligne 1.
Définir la zone d'impression hors ligne 1.
On peut aussi faire un clic droit sur le bouton et, dans propriétés de l'objet, décocher Imprimer.
 

Alyrio

XLDnaute Nouveau
Re : macro pour imprimer une partie d'une feuille sur une autre

bonjour bondu, gorfael, chris
Je vois que gorfael a eu le temps de te répondre snif lol.
Bon po grave voici une autre solution.

Cordialement
 

Pièces jointes

  • conso(1).zip
    23.5 KB · Affichages: 69
  • conso(1).zip
    23.5 KB · Affichages: 71
  • conso(1).zip
    23.5 KB · Affichages: 63

Gorfael

XLDnaute Barbatruc
Re : macro pour imprimer une partie d'une feuille sur une autre

Alyrio à dit:
bonjour bondu, gorfael, chris
Je vois que gorfael a eu le temps de te répondre snif lol.
Bon po grave voici une autre solution.

Cordialement
Re.... le fil
Salut Alyrio : yerk, yerk, yerk, j'ai répondu avant na, na, na :p

Juste une critique violente de ton code : tu sous-estimes un petit peu le VBA d'Excel
Code:
Range("CT" & CStr(LigneEncours)).Value
tu te compliques la vie : ton instruction peut se simplifier en :
Code:
Range("CT" & LigneEncours)
C'est plus simple, ta ligne complète reste lisible à l'écran sans le recours au changement de ligne
Code:
            LigneEncours = LigneEncours + 1         ' On passe a la ligne suivante pour de nouvelles données dans la feuille "consommation"
            LigneSuivante = LigneSuivante + 1       ' Nouvelle ligne vierge dans la feuille "impression"
        Else
            LigneEncours = LigneEncours + 1         ' On passe a la ligne suivante pour de nouvelles données dans la feuille "consommation"
        End If
que le test soit vrai ou faux, il faut que tu passes à LigneEncours = LigneEncours + 1
Code:
            LigneSuivante = LigneSuivante + 1       ' Nouvelle ligne vierge dans la feuille "impression"
        End If
            LigneEncours = LigneEncours + 1         ' On passe a la ligne suivante pour de nouvelles données dans la feuille "consommation"
c'est pas "important", sauf que si tu as beaucoup de code, et que ça marche pas, tu finis toujours par en oublier un quand tu fais des modifs à répétition pour adapter la macro au résultat voulu

Application.DisplayAlerts
Application.EnableEvents
Application.ScreenUpDating...
Quand j'utilise une fonction qui modifie le fonctionnement d'Excel, je passe toujours en gestion d'erreur (on error goto Err_...)
Ta macro : elle détecte une erreur dans la ligne de test
if (R)+(V+)+(V)+(X) then
Excel détecte une erreur => message d'avertissement => End Sub
"verrais plus tard, j'ai un autre fichier à traiter, je ferme celui-ci et j'aouvre l'autre" et.... #CENSURÉ# DE #CENSURÉ# Pourquoi ça marche pas ~?!?!?!
(et ça, c'est du vécu :) ,et avec EnableEvents qui m'a permis de m'en rendre compte)
Donc, pour éviter une calvitie précoce, chaque fois que tu exécute une instruction qui dépasses le cadre du fichier, occupe-toi de la gestion d'erreur.

Pour ta macro, tu utilises
Code:
While Sheets("consommation").Range("A" & CStr(LigneEncours)) <> ""
comme il détecte les doublons, je suppose que périodiquement, il regroupe les données en supprimant ceux-ci.
Pour un cas de ce genre, moi, je traite en m'occupant de la ligne en doublon, en reportant les données dans le premier enregistrement du nom, et en les éffaçant, une à une, puis quant toutes les données ont bien été traitées, j'efface le nom, puis je passe au doublon suivant. si je suis interrompu, je recommence mon traitement après le dernier nom vide

avec ton code, s'il y avait doublon en ligne 30 par exemple, que je veuille imprimer, je me retrouve avec 30 lignes de traitées. Et comme je fais confiance à la macro, et que c'est le début du mois, 5 ou 10 enregistrements, c'est possible, donc, je peux transmettre à ma hiérarchie ;) glups !
Mais c'est ma vision des choses, et elle est peut-être fausse

J'aime bien critiquer, yerk, yerk, yerk

A+

PS : Si tu trouves des erreurs dans mon code, n'hésite pas à me le dire, ça fera dégonfler ma grosse tête ( ;) )
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 079
Membres
103 455
dernier inscrit
saramachado