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