Imprimer les lignes de son choix dans un tableau word [Résolu] - Logiciels - Windows & Software
Marsh Posté le 30-07-2006 à 12:56:37
Bonjour, 
 
Je souhaite préciser qu'il s'agit d'imprimer des listes. Il faut comme sur excel figer en quelque sorte la ligne d'en-tête. Sur word, ce n'est pas possible à ma connaissance.
Marsh Posté le 30-07-2006 à 18:31:13
Bonsoir, 
j'espère que c'est en gros ce que tu veux? 
Cordialement 
 
Sub imprimeparville() 
Dim reserve As String 
total = ActiveDocument.Tables(1).Rows.Count 
ligneres = 0      
ActiveDocument.Tables(1).Select 
Selection.Font.Hidden = False 
Selection.HomeKey Unit:=wdRow 
ActiveDocument.Tables(1).Rows(2).Cells(1).Select 
     
      
Selection.MoveRight Unit:=wdCell, Count:=2 
Selection.Select 
reserve = Selection.Text 
Selection.MoveRight Unit:=wdCell, Count:=-2 
 
 
While ligneres < total 
    For i = 2 To total 
 ActiveDocument.Tables(1).Rows(i).Select 
     Selection.HomeKey Unit:=wdRow 
     Selection.Select 
   	Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
     Selection.SelectCell 
     	Selection.MoveRight Unit:=wdCell, Count:=2 
     nouvtext = Selection.Text 
     If reserve = nouvtext Then 
     ligneres = i 
     Else 
         Selection.SelectRow 
       Selection.Font.Hidden = True 
     
   	End If 
     
     
     
    Next i 
 
    ActiveDocument.Tables(1).Select 
   'Application.PrintOut FileName:="", Range:=wdPrintCurrentPage, Item:= 
    Application.PrintOut FileName:="", Range:=wdPrintSelection, Item:= _ 
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
        ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _ 
        False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _ 
        PrintZoomPaperHeight:=0 
    ActiveDocument.Tables(1).Select 
    Selection.Font.Hidden = False 
 
    If ligneres < total Then 
   	Selection.HomeKey Unit:=wdRow 
   	ActiveDocument.Tables(1).Rows(ligneres + 1).Cells(1).Select 
     Selection.MoveRight Unit:=wdCell, Count:=2 
     Selection.Select 
     reserve = Selection.Text 
   Selection.MoveRight Unit:=wdCell, Count:=-2 
     End If 
  
Wend 
 
 MsgBox "coucou" 
 
End Sub 
 
Marsh Posté le 30-07-2006 à 19:47:24
Bonsoir, 
 
J'ai fait un test sachant que je n'ai pas d'imprimante.Cette macro me permet de sélectionner les lignes de mon choix dans mon tableau. Je fais le test mardi avec une imprimante afin de savoir si j'ai bien ces lignes sélectionnées qui s'impriment et je te tiens au courant. Merci beaucoup.
Marsh Posté le 01-08-2006 à 12:36:44
Bonjour 
 
J'ai essayé le code et là voici que j'ai une erreur de compilation. Membre de méthode ou de données introuvable et j'ai .Select qui est souligné en bleu dans la syntaxe: 
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
     Selection.SelectCell 
 
Est-que c'est lié à la version du soft? JEst-ce que je dois faire quelque chose de particulier dans mon tableau avant de lancer la macro: sélection, placer le curseur à un endroit précis.......? Je cherche. 
 
Merci
Marsh Posté le 01-08-2006 à 13:20:58
| TAM136 a écrit : Bonsoir,  | 
 
Si tu veux tester sans imprimante ou éviter de consommer inutilement du papier, installe PDF Creator sur ta machine -> comme ça tu génèrera uniquement des fichiers que tu pourras vérifier  
 
(au moins pour ta phase de tests).
Marsh Posté le 01-08-2006 à 13:29:59
Bonjour 
 
Seniorpapou 
J'ai Microsoft Word 8.0 Object Library. 
 
Merci Wolfman pour le conseil.
Marsh Posté le 01-08-2006 à 13:36:09
et chez toi? comme cela fonctionne, (à l'impression près) regardes la version 
 
mets en commentaire la ligne: 
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend  
 
il se peut que cela fonctionne sans
Marsh Posté le 29-08-2006 à 06:35:22
Salut Senior 
 
J'ai trouvé un truc de ce type: 
Sub FractionnerTableau() 
Set objTable = ActiveDocument.Tables(1) 
If objTable.Rows.Count > 2 Then 
    objTable.Rows(1).Select 
    Selection.Copy 
    objTable.Rows(7).Select 
       Selection.Paste 
    objTable.Rows(7).Select 
    Selection.SplitTable 
'Fractionner après la 6eme ligne 
'J'ai ainsi un 1er tableau de 6 lignes 
End If 
Set objTable = ActiveDocument.Tables(2) 
If objTable.Rows.Count > 2 Then 
    objTable.Rows(1).Select 
    Selection.Copy 
    objTable.Rows(11).Select  
    Selection.Paste 
    objTable.Rows(11).Select 
    Selection.SplitTable 
'J'ai un second tableau,etc... 
End If 
Set objTable = ActiveDocument.Tables(3) 
If objTable.Rows.Count > 2 Then 
    objTable.Rows(1).Select 
    Selection.Copy 
    objTable.Rows(5).Select 
      Selection.Paste 
    objTable.Rows(5).Select 
    Selection.SplitTable 
End If 
End Sub 
 
Le principe est de fractionner le tableau en gardant (en copiant l'en-tête) mais il faut modifier manuellement le code en fonction du nombre de lignes. Qu'est-ce que t'en penses? Merci.
Marsh Posté le 29-08-2006 à 07:40:07
Bonjour, 
POurquoi pas, on peut s'en inspirer si cela correspond à ton idée sur la façon de traîter ton pb. 
 
 
Supposons que l'on s'inspire de ce "truc", tu te retrouveras en permanence, sur ton word, avec la ligne d'entète devant chaque groupe. Tu ne pourras passer ta moulinette qu'une fois. Ensuite pour la création d'un nouveau groupe tu devras mettre l'entète par copier coller. Ne pas oublier d'inhiber le "truc" pour éviter à quelqu'un de rajouter un deuxième titre (un peu n'importe où) 
 
 
 Par quoi chaque groupe se différencie-t-il d'un autre? Est-ce toujours regroupé par ce que tu as appelé "ville"? 
Décris nous la manip que tu veux effectuer : par exemple 
 
Aujourd'hui j'ouvre mon word et je veux imprimer tous les groupes (un par page) 
Aujourd'hui j'ouvre mon word et je veux imprimer  les groupes qui me sont demandés : Lyon, Paris, Marseille. 
Aujourd'hui j'ouvre mon word et je veux imprimer  les groupes dont la colonne 11 contient "fromage" 
 
Tous les groupes existent déja? Si non, la personne qui fait la saisie est-elle en mesure de créer un nouveau groupe au bon endroit? (exemple villes classées par ordres alphabétique ou par nombre d'habitants, ....) 
 
Lorsque je rajoute un élément d'un groupe, la personne qui fait la saisie est capable de placer l'information au bon endroit 
 
Bonne Journée de labeur
Marsh Posté le 29-08-2006 à 20:14:26
Bonsoir 
 
Pour ce qui est de la saisie, il n'y a aucun problème dans la mesure où je suis le seul à la faire. Effectivement, c'est toujours le même principe. Admettons que j'ai les 5 1ères lignes de mon tableau qui contiennent la ville Nantes,en fait les lignes 2,3,4,5,6. La ligne 1 est la ligne d'en-tête. J'ai un premier groupe ou 1er tableau de 6 lignes. J'ai ensuite les lignes 7,8,9 par exemple qui contiennent la ville Bordeaux. Je veux un second tableau de 4 lignes: la ligne d'en-tête+les les lignes 7,8 et 9. La ville est située dans une colonne. 
Si je repère visuellement les lgnes et que je reporte le résultat manuellement dans la macro, j'obtiens bien le résultat escompté: ligne d'en-tête récupérée et lignes qui m'intéressent. Il me suffit de copier/coller le code autant de fois que j'ai de groupes, (autrement dit de tableaux) et à entrer les n° des dernières lignes du groupe, par exemple: 
 objTable.Rows(11).Select  ou 
 objTable.Rows(17).Select  
etc... 
 et à changer de façon croissante le n° du tableau: 
Set objTable = ActiveDocument.Tables(1) pour tableau 1 
Set objTable = ActiveDocument.Tables(2) pour tableau 2 
Set objTable = ActiveDocument.Tables(3) pour tableau 3 
etc.. 
 
 
Mais ça reste quand même toujours du rafistolage. Ce que je fais, c'est que j'ajoute une colonne Numérotation pour repérer le n° de la dernière ligne de chaque groupe. 
Marsh Posté le 29-08-2006 à 20:36:10
Bonsoir, 
tu as un tableau existant classé par "ville" et que tu veux fractionner en plusieurs tableaux? 
Marsh Posté le 29-08-2006 à 21:01:52
Rebonsoir 
 
Je veux effectivement le fractionner par villes (par un critère de mon choix).
Marsh Posté le 29-08-2006 à 21:23:07
Bonsoir,  
tu as un tableau existant classé par  "un critère de ton choix" et que tu veux fractionner en plusieurs tableaux? 
ce critère est le contenu d'une colonne déjà ordonnée? puisque tu envisages de scinder par paquet de lignes? 
Marsh Posté le 30-08-2006 à 10:20:17
Bonjour, 
 
Effectivement, le tableau est trié. Je trie une colonne de mon choix afin de regrouper les villes du même nom et je fractionne mon tableau en autant de villes qu'il y en a. S'il y a 5 villes, je veux 5 tableaux. Quand je dis 5 villes, je parle bien de 5 villes différentes.Par exemple: si j'ai BORDEAUX, BORDEAUX, BORDEAUX, NANTES, NANTES, NICE, NICE, NICE,NICE, NICE,LENS, LENS, LENS, MARSEILLE, MARSEILLE, MARSEILLE, MARSEILLE, MARSEILLE, MARSEILLE, MARSEILLE, je veux 5 tableaux 
Tableau 1: BORDEAUX 
Tableau 2: NANTES 
Tableau 3: NICE 
Tableau 4: LENS 
Tableau 5: MARSEILLE 
 
Je fractionne donc mon tableau à la 1ère ligne du tableau suivant.
Marsh Posté le 30-08-2006 à 10:33:29
bonjour, 
la colonne peut-elle être différente suivant ton besoin? 
Marsh Posté le 30-08-2006 à 12:15:07
Bonjour, 
essayes ça: 
c'est pour ton critère en colonne 3 
 
Sub Imprimeparville2() 
Dim reserve As String 
tbl = 1 
Set objTable = ActiveDocument.Tables(tbl) 
total = objTable.Rows.Count 
While total > 1 
 
objTable.Rows(1).Select 
    Selection.Copy 
 
     
ActiveDocument.Tables(tbl).Select 
 
    Selection.HomeKey Unit:=wdRow 
    ActiveDocument.Tables(tbl).Rows(2).Cells(1).Select 
    Selection.MoveRight Unit:=wdCell, Count:=2 
    Selection.Select 
    reserve = Selection.Text 
    Selection.MoveRight Unit:=wdCell, Count:=2 
    Selection.Select 
     
  
For i = 2 To total 
    ActiveDocument.Tables(tbl).Rows(i).Select 
    Selection.HomeKey Unit:=wdRow 
    Selection.Select 
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
    Selection.SelectCell 
     
    Selection.MoveRight Unit:=wdCell, Count:=2 
 
    nouvtext = Selection.Text 
    If reserve = nouvtext Then 
    ligneres = i 
    Else 
       Selection.SelectRow 
       
    Exit For 
    End If 
 
Next i 
If i > total Then Exit Sub 
    objTable.Rows(i).Select 
    Selection.Paste 
    objTable.Rows(i).Select 
    Selection.SplitTable 
 
 tbl = tbl + 1 
Set objTable = ActiveDocument.Tables(tbl) 
total = objTable.Rows.Count 
Wend 
End Sub
Marsh Posté le 30-08-2006 à 12:39:54
Re, 
c'est pour choisir la colonne 
 
Sub Imprimeparville2() 
Dim reserve As String 
tbl = 1 
 
'changer colonne si besoin ou demander par colonne =inputbox.. 
 
colonne = 3 
decalage = colonne - 1 
Set objTable = ActiveDocument.Tables(tbl) 
total = objTable.Rows.Count 
While total > 1 
    ligneres = 0 
    objTable.Rows(1).Select 
    Selection.Copy 
    ActiveDocument.Tables(tbl).Select 
    Selection.HomeKey Unit:=wdRow 
    ActiveDocument.Tables(tbl).Rows(2).Cells(1).Select 
    Selection.MoveRight Unit:=wdCell, Count:=decalage 
    Selection.Select 
    reserve = Selection.Text 
     
     
  
    For i = 2 To total 
        ActiveDocument.Tables(tbl).Rows(i).Select 
        Selection.HomeKey Unit:=wdRow 
        Selection.Select 
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
        Selection.SelectCell 
        Selection.MoveRight Unit:=wdCell, Count:=decalage 
        nouvtext = Selection.Text 
        If reserve = nouvtext Then 
            'ligneres = i 
        Else 
            Selection.SelectRow 
            Exit For 
        End If 
    Next i 
    If i > total Then Exit Sub 
    objTable.Rows(i).Select 
    Selection.Paste 
    objTable.Rows(i).Select 
    Selection.SplitTable 
    tbl = tbl + 1 
    Set objTable = ActiveDocument.Tables(tbl) 
    total = objTable.Rows.Count 
Wend 
End Sub
Marsh Posté le 30-08-2006 à 12:42:03
Rebonjour 
 
Merci, ça fonctionne mais comment choisir la colonne dans laquelle se trouve le critère?
Marsh Posté le 30-08-2006 à 12:58:02
colonne=3 pour colonne 3  
tu peux remplacer colonne =3 par : 
colonne = inputbox("quelle colonne ....." )
Marsh Posté le 30-08-2006 à 13:24:14
Merci infiniment 
 
Par contre, j'ai omis de te signaler que l'instruction Selection.SelectCell ne fonctionne pas. Je l'ai remplacée par Selection.Select et c'est parfait. 
 
1000 merci 
 
@+
Marsh Posté le 29-07-2006 à 20:19:55
Bonsoir
Voici mon problème. J'ai un tableau sous word. Ce tableau a un nombre de lignes variables et ce nombre est dans tous les cas important. Ce tableau comporte une ligne d'en-tête. Je veux imprimer ce tableau mais morceau par morceau. Chaque morceau du tableau commence toujours par la ligne d'en-tête. Par exemple, je veux imprimer:
lignes 1 à 14
ligne1+lignes 15 à 45
ligne 1+ lignes 46 à 82
etc...
Une solution sommaire consiste à masquer les lignes qu'on ne veut pas imprimer. Mais cette méthode est vraiment lourde car il faut sélectionner les lignes à masquer et si ce nombre est élevé, ce n'est pas pratique.
J'avais posté un message sur le forum programmation où j'ai obtenu un code que j'ai simplifié ainsi:
MaLigne = Array(2, 3, 4, 5, 16, 17, 18, 19, 20) 'numéro de ligne à masquer
ReDim Ligne(UBound(MaLigne) + 1, 2)
For i = 0 To UBound(MaLigne)
Ligne(i + 1, 0) = MaLigne(i) 'remplir le tableau
Next i
For i = 1 To UBound(MaLigne) + 1
ActiveDocument.Tables(1).Rows(Ligne(i, 0)).Select 'Selectionne la ligne du tableau et ramène la police à 1 (0 = erreur)
With Selection.Font
.Hidden = True
End With
Next i
Ce code me permet de masquer les lignes 2,3,4,5,16,17,18,19 et 20 et de pouvoir imprimer les lignes 1+les lignes 6 à 15. Cette méthode est nettement plus pratique puisque je peux masquer les lignes en saisissant leur n° dans mon code et en outre de masquer des lignes disjointes. Ce code fonctionne sur word 97. Mais ce code n'est pas parfait. En effet, si le nombre de lignes à masquer est important, il faut saisir tous les n° dans le code. S'il faut masquer 150 lignes, ça devient vite lourd.
Ma question est donc la suivante. Connaissez-vous une méthode (mise à part un copier/coller sur Excel) qui peut me permettre d'imprimer mon tableau word avec ma ligne d'en-tête+les lignes de mon souhait,sachant que ces lignes se suivent toujours sauf la ligne d'en-tête: amélioration du code (par exemple instruction VBA qui permet de sélectionner les lignes 2 à 5 et de 16 à 20 dans mon exemple et de les masquer) ou autre méthode?
Merci
Message édité par TAM136 le 30-08-2006 à 13:24:58