Bonjour,
J'ai crée un fichier excel avec des cellules que je remplies chaque fois que j'ai une commande d'un client, une ligne par commande, ça me permet de réaliser mon suivi de commandes par la suite.
Pour chaque nouvelle commande j'imprime un reçu pour mes clients, j'ai donc fait un document word avec un publipostage.
J'aimerais dans mon fichier excel ajouter un bouton à chaque fin de ligne, qui me permette pour chaque nouvelle commande d'imprimer le reçu directement depuis excel. Je pense qu'il faut faire une macro qui ouvre word, sélectionne la dernière commande, imprime et referme word.
Seulement je ne sais pas si c'est possible et je n'y connais rien en macros.
Si vous avez d'autres solutions peut-être moins lourde que de faire un bouton par ligne à me proposer je suis preneur aussi. Le but étant de saisir mes informations sur la commande et d'imprimer un reçu depuis le même écrans, sans à avoir 3 tonnes de manip à faire et de conserver mes infos de commande pour le suivi.
Seulement je ne sais pas si c'est possible et je n'y connais rien en macros.
C'est bien sûr possible... Excel combiné à son VBA peut faire beaucoup de chose.
Si vous avez d'autres solutions peut-être moins lourde que de faire un bouton par ligne
Il y'a la solution de proposer l'impression du reçu lorsque l'on double-clic sur la ligne en question.
@+ HD
Et concrètement, je fait comment?
HD
Et concrètement, je fait comment?
concrétement ça risque de prendre un peu de temps en développement... je pense qu'il y'aurait plus court de faire un publipostage en ouvrant word en mettant en lien le document word avec une base de donnée de publipostage sur le fichier Excel.
Perso, j'ai déjà fait un telle macro pour un client mais tout se fait à partir d'Excel. Une fois imprimé, une copie est archivée en lecture-seule protégée afin que personne ne modifie le numéro de facture et l'on attaque alors à la facture suivante. Juridiquement parlant, une facture imprimée ne doit plus être modifiée et la facture suivante doit correspondre au numéro de la facture précédente + 1 (pour éviter les fausses factures). Dans le cas contraire, en cas de contrôle, c'est au risque et péril...
@+ HD
Et concrètement, je fait comment?
concrétement ça risque de prendre un peu de temps en développement... je
pense qu'il y'aurait plus court de faire un publipostage en ouvrant word en
mettant en lien le document word avec une base de donnée de publipostage sur
le fichier Excel.
Perso, j'ai déjà fait un telle macro pour un client mais tout se fait à
partir d'Excel. Une fois imprimé, une copie est archivée en lecture-seule
protégée afin que personne ne modifie le numéro de facture et l'on attaque
alors à la facture suivante. Juridiquement parlant, une facture imprimée ne
doit plus être modifiée et la facture suivante doit correspondre au numéro
de la facture précédente + 1 (pour éviter les fausses factures). Dans le cas
contraire, en cas de contrôle, c'est au risque et péril...
concrétement ça risque de prendre un peu de temps en développement... je pense qu'il y'aurait plus court de faire un publipostage en ouvrant word en mettant en lien le document word avec une base de donnée de publipostage sur le fichier Excel.
Perso, j'ai déjà fait un telle macro pour un client mais tout se fait à partir d'Excel. Une fois imprimé, une copie est archivée en lecture-seule protégée afin que personne ne modifie le numéro de facture et l'on attaque alors à la facture suivante. Juridiquement parlant, une facture imprimée ne doit plus être modifiée et la facture suivante doit correspondre au numéro de la facture précédente + 1 (pour éviter les fausses factures). Dans le cas contraire, en cas de contrôle, c'est au risque et péril...
@+ HD
MichD
Bonjour,
Voici un exemple de code que tu peux utiliser et adapter à ton environnement. Si la chose peut t'aider...
Tu dois ajouter à ton projetVBA d'Excel, la référence "Microsoft Word Objects xx library" dans la fenêtre de l'éditeur de code / outils / références...
La macro crée un tableau dans un nouveau document comme base de données pour un publipostage et ensuite crée un document principal pour le publipostage. Fais un test si cela te convient et adapte. La liaison DDE est une liaison tardive. '------------------------------------------------------- Sub Publipostage() Dim AppWord As Object Dim I As Integer Dim FE As Worksheet Dim PlageTitre As Excel.Range
Set FE = Worksheets("Feuil1") Set AppWord = CreateObject("Word.Application")
CreerListe AppWord, FE
With AppWord .Documents.Add With .Selection .ParagraphFormat.Alignment = 1 With .Font .Name = "Arial" .Bold = True .Size = 16 End With .TypeText "Circulaire" .TypeParagraph .TypeParagraph .ParagraphFormat.Alignment = 0 With .Font .Name = "Times New Roman" .Bold = False .Size = 10 End With End With
Set PlageTitre = FE.Range(FE.[A2], FE.[IV2].End(xlToLeft))
With .Documents(1) With .MailMerge .MainDocumentType = 3 'wdCatalog .OpenDataSource Name:=ThisWorkbook.Path & "ListeNoms.doc" Set PlageTitre = FE.Range(FE.[B1], FE.[IV1].End(xlToLeft)) With .Fields .Add AppWord.Selection.Range, PlageTitre(1) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(2) AppWord.Selection.TypeParagraph .Add AppWord.Selection.Range, PlageTitre(3) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(4) AppWord.Selection.TypeParagraph .Add AppWord.Selection.Range, PlageTitre(5) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(6) End With End With End With
With .Selection .TypeParagraph .TypeParagraph .TypeText "Ici ton texte..." End With .Visible = True End With
Set AppWord = Nothing Set FE = Nothing Set PlageTitre = Nothing
End Sub '------------------------------------------------------- Sub CreerListe(AppWord As Object, _ FE As Worksheet) Dim Doc As Object Dim TableWd As Object Dim Ligne As Object Dim CelWD As Object
Dim Plage As Excel.Range Dim CelXL As Excel.Range Dim I As Integer Dim NbCol As Integer Dim NbLgn As Integer
Set Plage = FE.Range(FE.[B1], FE.[B65536].End(xlUp))
On Error Resume Next Kill ThisWorkbook.Path & "ListeNoms.doc" On Error GoTo 0
With Application.WorksheetFunction NbCol = .CountIf(FE.Rows(1), "*") NbLgn = .CountIf(FE.Columns(1), "*") End With
With AppWord Set Doc = .Documents.Add With Doc Set TableWd = .Tables.Add(.Range, NbLgn, NbCol - 1, 1, 1) With TableWd For Each CelXL In Plage If CelXL <> "" Then I = I + 1 .Cell(I, 1).Range.Text = Trim(CelXL.Text) .Cell(I, 2).Range.Text = Trim(CelXL.Offset(0, 1).Text) .Cell(I, 3).Range.Text = Trim(CelXL.Offset(0, 2).Text) .Cell(I, 4).Range.Text = Trim(CelXL.Offset(0, 3).Text) .Cell(I, 5).Range.Text = Trim(CelXL.Offset(0, 4).Text) .Cell(I, 6).Range.Text = Trim(CelXL.Offset(0, 5).Text) End If Next CelXL .Rows(1).Range.Bold = True End With .SaveAs ThisWorkbook.Path & "ListeNoms.doc" .Close End With End With
Set Doc = Nothing Set TableWd = Nothing Set Ligne = Nothing Set CelWD = Nothing Set Plage = Nothing Set CelXL = Nothing
End Sub '-------------------------------------------------------
MichD ------------------------------------------ "canthor" a écrit dans le message de groupe de discussion :
HD a écrit le 21/12/2011 à 09h17 :
Seulement je ne sais pas si c'est possible et je n'y connais rien en macros.
C'est bien sûr possible... Excel combiné à son VBA peut faire beaucoup de chose.
Si vous avez d'autres solutions peut-être moins lourde que de faire un bouton par ligne
Il y'a la solution de proposer l'impression du reçu lorsque l'on double-clic sur la ligne en question.
@+ HD
Et concrètement, je fait comment?
Bonjour,
Voici un exemple de code que tu peux utiliser et adapter à ton environnement.
Si la chose peut t'aider...
Tu dois ajouter à ton projetVBA d'Excel, la référence "Microsoft Word Objects xx library"
dans la fenêtre de l'éditeur de code / outils / références...
La macro crée un tableau dans un nouveau document comme base
de données pour un publipostage et ensuite crée un document principal pour
le publipostage. Fais un test si cela te convient et adapte. La liaison DDE
est une liaison tardive.
'-------------------------------------------------------
Sub Publipostage()
Dim AppWord As Object
Dim I As Integer
Dim FE As Worksheet
Dim PlageTitre As Excel.Range
Set FE = Worksheets("Feuil1")
Set AppWord = CreateObject("Word.Application")
CreerListe AppWord, FE
With AppWord
.Documents.Add
With .Selection
.ParagraphFormat.Alignment = 1
With .Font
.Name = "Arial"
.Bold = True
.Size = 16
End With
.TypeText "Circulaire"
.TypeParagraph
.TypeParagraph
.ParagraphFormat.Alignment = 0
With .Font
.Name = "Times New Roman"
.Bold = False
.Size = 10
End With
End With
Set PlageTitre = FE.Range(FE.[A2], FE.[IV2].End(xlToLeft))
With .Documents(1)
With .MailMerge
.MainDocumentType = 3 'wdCatalog
.OpenDataSource Name:=ThisWorkbook.Path & "ListeNoms.doc"
Set PlageTitre = FE.Range(FE.[B1], FE.[IV1].End(xlToLeft))
With .Fields
.Add AppWord.Selection.Range, PlageTitre(1)
AppWord.Selection.TypeText " "
.Add AppWord.Selection.Range, PlageTitre(2)
AppWord.Selection.TypeParagraph
.Add AppWord.Selection.Range, PlageTitre(3)
AppWord.Selection.TypeText " "
.Add AppWord.Selection.Range, PlageTitre(4)
AppWord.Selection.TypeParagraph
.Add AppWord.Selection.Range, PlageTitre(5)
AppWord.Selection.TypeText " "
.Add AppWord.Selection.Range, PlageTitre(6)
End With
End With
End With
With .Selection
.TypeParagraph
.TypeParagraph
.TypeText "Ici ton texte..."
End With
.Visible = True
End With
Set AppWord = Nothing
Set FE = Nothing
Set PlageTitre = Nothing
End Sub
'-------------------------------------------------------
Sub CreerListe(AppWord As Object, _
FE As Worksheet)
Dim Doc As Object
Dim TableWd As Object
Dim Ligne As Object
Dim CelWD As Object
Dim Plage As Excel.Range
Dim CelXL As Excel.Range
Dim I As Integer
Dim NbCol As Integer
Dim NbLgn As Integer
Set Plage = FE.Range(FE.[B1], FE.[B65536].End(xlUp))
On Error Resume Next
Kill ThisWorkbook.Path & "ListeNoms.doc"
On Error GoTo 0
With Application.WorksheetFunction
NbCol = .CountIf(FE.Rows(1), "*")
NbLgn = .CountIf(FE.Columns(1), "*")
End With
With AppWord
Set Doc = .Documents.Add
With Doc
Set TableWd = .Tables.Add(.Range, NbLgn, NbCol - 1, 1, 1)
With TableWd
For Each CelXL In Plage
If CelXL <> "" Then
I = I + 1
.Cell(I, 1).Range.Text = Trim(CelXL.Text)
.Cell(I, 2).Range.Text = Trim(CelXL.Offset(0, 1).Text)
.Cell(I, 3).Range.Text = Trim(CelXL.Offset(0, 2).Text)
.Cell(I, 4).Range.Text = Trim(CelXL.Offset(0, 3).Text)
.Cell(I, 5).Range.Text = Trim(CelXL.Offset(0, 4).Text)
.Cell(I, 6).Range.Text = Trim(CelXL.Offset(0, 5).Text)
End If
Next CelXL
.Rows(1).Range.Bold = True
End With
.SaveAs ThisWorkbook.Path & "ListeNoms.doc"
.Close
End With
End With
Set Doc = Nothing
Set TableWd = Nothing
Set Ligne = Nothing
Set CelWD = Nothing
Set Plage = Nothing
Set CelXL = Nothing
End Sub
'-------------------------------------------------------
MichD
------------------------------------------
"canthor" a écrit dans le message de groupe de discussion : DaydnYyZ3tKhH27T4p2dnAA@giganews.com...
HD a écrit le 21/12/2011 à 09h17 :
Seulement je ne sais pas si c'est possible et je n'y
connais rien en macros.
C'est bien sûr possible... Excel combiné à son VBA peut
faire beaucoup de
chose.
Si vous avez d'autres solutions peut-être moins lourde
que de faire un bouton par ligne
Il y'a la solution de proposer l'impression du reçu lorsque l'on
double-clic
sur la ligne en question.
Voici un exemple de code que tu peux utiliser et adapter à ton environnement. Si la chose peut t'aider...
Tu dois ajouter à ton projetVBA d'Excel, la référence "Microsoft Word Objects xx library" dans la fenêtre de l'éditeur de code / outils / références...
La macro crée un tableau dans un nouveau document comme base de données pour un publipostage et ensuite crée un document principal pour le publipostage. Fais un test si cela te convient et adapte. La liaison DDE est une liaison tardive. '------------------------------------------------------- Sub Publipostage() Dim AppWord As Object Dim I As Integer Dim FE As Worksheet Dim PlageTitre As Excel.Range
Set FE = Worksheets("Feuil1") Set AppWord = CreateObject("Word.Application")
CreerListe AppWord, FE
With AppWord .Documents.Add With .Selection .ParagraphFormat.Alignment = 1 With .Font .Name = "Arial" .Bold = True .Size = 16 End With .TypeText "Circulaire" .TypeParagraph .TypeParagraph .ParagraphFormat.Alignment = 0 With .Font .Name = "Times New Roman" .Bold = False .Size = 10 End With End With
Set PlageTitre = FE.Range(FE.[A2], FE.[IV2].End(xlToLeft))
With .Documents(1) With .MailMerge .MainDocumentType = 3 'wdCatalog .OpenDataSource Name:=ThisWorkbook.Path & "ListeNoms.doc" Set PlageTitre = FE.Range(FE.[B1], FE.[IV1].End(xlToLeft)) With .Fields .Add AppWord.Selection.Range, PlageTitre(1) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(2) AppWord.Selection.TypeParagraph .Add AppWord.Selection.Range, PlageTitre(3) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(4) AppWord.Selection.TypeParagraph .Add AppWord.Selection.Range, PlageTitre(5) AppWord.Selection.TypeText " " .Add AppWord.Selection.Range, PlageTitre(6) End With End With End With
With .Selection .TypeParagraph .TypeParagraph .TypeText "Ici ton texte..." End With .Visible = True End With
Set AppWord = Nothing Set FE = Nothing Set PlageTitre = Nothing
End Sub '------------------------------------------------------- Sub CreerListe(AppWord As Object, _ FE As Worksheet) Dim Doc As Object Dim TableWd As Object Dim Ligne As Object Dim CelWD As Object
Dim Plage As Excel.Range Dim CelXL As Excel.Range Dim I As Integer Dim NbCol As Integer Dim NbLgn As Integer
Set Plage = FE.Range(FE.[B1], FE.[B65536].End(xlUp))
On Error Resume Next Kill ThisWorkbook.Path & "ListeNoms.doc" On Error GoTo 0
With Application.WorksheetFunction NbCol = .CountIf(FE.Rows(1), "*") NbLgn = .CountIf(FE.Columns(1), "*") End With
With AppWord Set Doc = .Documents.Add With Doc Set TableWd = .Tables.Add(.Range, NbLgn, NbCol - 1, 1, 1) With TableWd For Each CelXL In Plage If CelXL <> "" Then I = I + 1 .Cell(I, 1).Range.Text = Trim(CelXL.Text) .Cell(I, 2).Range.Text = Trim(CelXL.Offset(0, 1).Text) .Cell(I, 3).Range.Text = Trim(CelXL.Offset(0, 2).Text) .Cell(I, 4).Range.Text = Trim(CelXL.Offset(0, 3).Text) .Cell(I, 5).Range.Text = Trim(CelXL.Offset(0, 4).Text) .Cell(I, 6).Range.Text = Trim(CelXL.Offset(0, 5).Text) End If Next CelXL .Rows(1).Range.Bold = True End With .SaveAs ThisWorkbook.Path & "ListeNoms.doc" .Close End With End With
Set Doc = Nothing Set TableWd = Nothing Set Ligne = Nothing Set CelWD = Nothing Set Plage = Nothing Set CelXL = Nothing
End Sub '-------------------------------------------------------
MichD ------------------------------------------ "canthor" a écrit dans le message de groupe de discussion :
HD a écrit le 21/12/2011 à 09h17 :
Seulement je ne sais pas si c'est possible et je n'y connais rien en macros.
C'est bien sûr possible... Excel combiné à son VBA peut faire beaucoup de chose.
Si vous avez d'autres solutions peut-être moins lourde que de faire un bouton par ligne
Il y'a la solution de proposer l'impression du reçu lorsque l'on double-clic sur la ligne en question.