Ayant un publipostage relativement complexe à réaliser, c'est à dire avec
multiple variables et des conditions qui nécessitent l'utilisation d'un
programme VBA, je me suis lancé dans une réalisation avec l'usage de
SIGNETS: quelle aventure !
J'espérais trouver quelquechose qui s'utilisait comme un champ dans lequel
on écrit la valeur d'une variable. Que nenni !
Quelqu'un a-t'il une expérience sur le sujet ? Pourrait-il me'indiquer une
astuce ?
ActiveDocument.Saved = True avant le ActiveDocument.Close
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande qua nd même si je veux sauvegarder le classeur. Alors j'ai dit basta, et j'ai mis Workbook.Save ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n' y a plus de message de demande de confirmation.
Une idée sur une explication ?
Geo a écrit, le 12/12/2010 14:21 :
Bonjour
Pour le message, ajoutez :
ActiveDocument.Saved = True
avant le
ActiveDocument.Close
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande qua nd
même si je veux sauvegarder le classeur.
Alors j'ai dit basta, et j'ai mis Workbook.Save
ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n' y
a plus de message de demande de confirmation.
ActiveDocument.Saved = True avant le ActiveDocument.Close
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande qua nd même si je veux sauvegarder le classeur. Alors j'ai dit basta, et j'ai mis Workbook.Save ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n' y a plus de message de demande de confirmation.
Une idée sur une explication ?
MorMic
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Pour le reste j'ai bien fait comme vous le suggérez mais les données s'affichent sur les signets les unes derrières les autres comme si le document était sauvegardé à chaque fois et de plus, ma variable i est toujours à 2 !!.
Je vais essayé de faire un document encore plus simple et si le phénomène continue, je me propose de vous l'envoyer pour que vous puissiez juger par vous-même.
Merci Geo et Gloops de votre aide.
Michel "Geo" a écrit dans le message de news:
Bonjour
Pour le message, ajoutez :
ActiveDocument.Saved = True avant le ActiveDocument.Close
Sinon, cette macro est bien dans le modèle Normal.dot ? La variable dont vous parlez, c'est i ? Essayez comme ceci : Dim MonDoc As Document Set MonDoc = Documents.Open(.... For j = 1 To 5 ' Ecriture des signets MonDoc.Bookmarks("sNom").Range.Text = .Cells(i, ColNom) etc. Next j Debug.Print "Document : " & i MonDoc.PrintOut MonDoc.Saved = True MonDoc.Close
Pour la mise au point, évitez la gestion d'erreur, ça peut masquer certaines choses et je ne saurais trop vous inciter à utiliser Option Explicit et déclarer ainsi toutes vos variables.
-- A+
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours
l'option explicit et je ne valide pas la gestion d'erreurs.
Pour le reste j'ai bien fait comme vous le suggérez mais les données
s'affichent sur les signets les unes derrières les autres comme si le
document était sauvegardé à chaque fois et de plus, ma variable i est
toujours à 2 !!.
Je vais essayé de faire un document encore plus simple et si le phénomène
continue, je me propose de vous l'envoyer pour que vous puissiez juger par
vous-même.
Merci Geo et Gloops de votre aide.
Michel
"Geo" <Geo@sans.pub> a écrit dans le message de news:
mn.635d7dacbce35e93.41568@sans.pub...
Bonjour
Pour le message, ajoutez :
ActiveDocument.Saved = True
avant le
ActiveDocument.Close
Sinon, cette macro est bien dans le modèle Normal.dot ?
La variable dont vous parlez, c'est i ?
Essayez comme ceci :
Dim MonDoc As Document
Set MonDoc = Documents.Open(....
For j = 1 To 5 ' Ecriture des signets
MonDoc.Bookmarks("sNom").Range.Text = .Cells(i, ColNom)
etc.
Next j
Debug.Print "Document : " & i
MonDoc.PrintOut
MonDoc.Saved = True
MonDoc.Close
Pour la mise au point, évitez la gestion d'erreur, ça peut masquer
certaines choses et je ne saurais trop vous inciter à utiliser
Option Explicit
et déclarer ainsi toutes vos variables.
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Pour le reste j'ai bien fait comme vous le suggérez mais les données s'affichent sur les signets les unes derrières les autres comme si le document était sauvegardé à chaque fois et de plus, ma variable i est toujours à 2 !!.
Je vais essayé de faire un document encore plus simple et si le phénomène continue, je me propose de vous l'envoyer pour que vous puissiez juger par vous-même.
Merci Geo et Gloops de votre aide.
Michel "Geo" a écrit dans le message de news:
Bonjour
Pour le message, ajoutez :
ActiveDocument.Saved = True avant le ActiveDocument.Close
Sinon, cette macro est bien dans le modèle Normal.dot ? La variable dont vous parlez, c'est i ? Essayez comme ceci : Dim MonDoc As Document Set MonDoc = Documents.Open(.... For j = 1 To 5 ' Ecriture des signets MonDoc.Bookmarks("sNom").Range.Text = .Cells(i, ColNom) etc. Next j Debug.Print "Document : " & i MonDoc.PrintOut MonDoc.Saved = True MonDoc.Close
Pour la mise au point, évitez la gestion d'erreur, ça peut masquer certaines choses et je ne saurais trop vous inciter à utiliser Option Explicit et déclarer ainsi toutes vos variables.
-- A+
Geo
Bonjour à Gloops qui nous a écrit :
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande quand même si je veux sauvegarder le classeur. Alors j'ai dit basta, et j'ai mis Workbook.Save ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n'y a plus de message de demande de confirmation.
Une idée sur une explication ?
Non, aucune. La première idée qui m'est venue, ce serait qu'Excel calcule qqch lors de la clôture, mais le Save ne devrait pas faire mieux que le Saved= true. Dans le cas présent ce serait problématique d'ajouter une Save. Il reste l'option MonClasseur.Close SaveChanges:úlse
-- A+
Bonjour à Gloops qui nous a écrit :
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande quand même si je veux
sauvegarder le classeur.
Alors j'ai dit basta, et j'ai mis Workbook.Save
ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n'y a plus de
message de demande de confirmation.
Une idée sur une explication ?
Non, aucune.
La première idée qui m'est venue, ce serait qu'Excel calcule qqch lors
de la clôture, mais le Save ne devrait pas faire mieux que le Saved=
true.
Dans le cas présent ce serait problématique d'ajouter une Save.
Il reste l'option
MonClasseur.Close SaveChanges:úlse
A propos, ça m'est arrivé de faire ça, et Excel 2003 me demande quand même si je veux sauvegarder le classeur. Alors j'ai dit basta, et j'ai mis Workbook.Save ce n'est pas ça que je voulais, mais au moins c'est plus discret, il n'y a plus de message de demande de confirmation.
Une idée sur une explication ?
Non, aucune. La première idée qui m'est venue, ce serait qu'Excel calcule qqch lors de la clôture, mais le Save ne devrait pas faire mieux que le Saved= true. Dans le cas présent ce serait problématique d'ajouter une Save. Il reste l'option MonClasseur.Close SaveChanges:úlse
-- A+
Geo
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclarées, elles doivent donc être globales au module. C'est le cas du i qui peut être réinitialisé ailleurs.
Je vais essayé de faire un document encore plus simple et si le phénomène continue, je me propose de vous l'envoyer pour que vous puissiez juger par vous-même.
Pas de souci, vous m'envoyez une minibase Excel, le modèle normal.dot et le courrier type dans un même zip à geo point le point du at laposte point net
-- A+
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option
explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclarées,
elles doivent donc être globales au module.
C'est le cas du i qui peut être réinitialisé ailleurs.
Je vais essayé de faire un document encore plus simple et si le phénomène continue, je
me propose de vous l'envoyer pour que vous puissiez juger par vous-même.
Pas de souci, vous m'envoyez une minibase Excel, le modèle normal.dot
et le courrier type dans un même zip à
geo point le point du at laposte point net
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclarées, elles doivent donc être globales au module. C'est le cas du i qui peut être réinitialisé ailleurs.
Je vais essayé de faire un document encore plus simple et si le phénomène continue, je me propose de vous l'envoyer pour que vous puissiez juger par vous-même.
Pas de souci, vous m'envoyez une minibase Excel, le modèle normal.dot et le courrier type dans un même zip à geo point le point du at laposte point net
-- A+
Gloops
MorMic a écrit, le 12/12/2010 19:31 :
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets t oujours l'option explicit et je ne valide pas la gestion d'erreurs.
Pas de gestion d'erreurs ? Tiens, quelle drôle d'idée ...
Pour le reste j'ai bien fait comme vous le suggérez mais les donnée s s'affichent sur les signets les unes derrières les autres comme si le document était sauvegardé à chaque fois et de plus, ma variable i est toujours à 2 !!.
Le document qui ne reprend pas sa forme initiale ? ça me rappelle quelque chose, ça. Dès qu'on a ouvert le modèle, avant de faire quelque transformation q ue ce soit, le sauvegarder sous le nom qu'il devra avoir au final (avec SaveAs). Comme ça, on ne touche pas au document original.
La tentation a priori pourrait être de faire ça à la fin, il s'avè re que ce n'est guère très indiqué, si il y a une sauvegarde automatique e n cours de route il faut qu'elle soit faite sous le nom final.
i toujours à 2, alors là il va bien falloir que je lise le code ...
MorMic a écrit, le 12/12/2010 19:31 :
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets t oujours
l'option explicit et je ne valide pas la gestion d'erreurs.
Pas de gestion d'erreurs ? Tiens, quelle drôle d'idée ...
Pour le reste j'ai bien fait comme vous le suggérez mais les donnée s
s'affichent sur les signets les unes derrières les autres comme si le
document était sauvegardé à chaque fois et de plus, ma variable i est
toujours à 2 !!.
Le document qui ne reprend pas sa forme initiale ?
ça me rappelle quelque chose, ça.
Dès qu'on a ouvert le modèle, avant de faire quelque transformation q ue
ce soit, le sauvegarder sous le nom qu'il devra avoir au final (avec
SaveAs). Comme ça, on ne touche pas au document original.
La tentation a priori pourrait être de faire ça à la fin, il s'avè re que
ce n'est guère très indiqué, si il y a une sauvegarde automatique e n
cours de route il faut qu'elle soit faite sous le nom final.
i toujours à 2, alors là il va bien falloir que je lise le code ...
Lorsque je développe je fais bien comme vous le conseillez, je mets t oujours l'option explicit et je ne valide pas la gestion d'erreurs.
Pas de gestion d'erreurs ? Tiens, quelle drôle d'idée ...
Pour le reste j'ai bien fait comme vous le suggérez mais les donnée s s'affichent sur les signets les unes derrières les autres comme si le document était sauvegardé à chaque fois et de plus, ma variable i est toujours à 2 !!.
Le document qui ne reprend pas sa forme initiale ? ça me rappelle quelque chose, ça. Dès qu'on a ouvert le modèle, avant de faire quelque transformation q ue ce soit, le sauvegarder sous le nom qu'il devra avoir au final (avec SaveAs). Comme ça, on ne touche pas au document original.
La tentation a priori pourrait être de faire ça à la fin, il s'avè re que ce n'est guère très indiqué, si il y a une sauvegarde automatique e n cours de route il faut qu'elle soit faite sous le nom final.
i toujours à 2, alors là il va bien falloir que je lise le code ...
Gloops
Geo a écrit, le 12/12/2010 20:05 :
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclaré es, elles doivent donc être globales au module. C'est le cas du i qui peut être réinitialisé ailleurs.
Ah ben oui, je me permets de répéter mon intervention d'hier :
Oui, et particulièrement la déclaration du compteur, avec l'indicat ion précise de son emplacement.
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Effectivement, Dim I As Integer, en haut du module (après le Option Explicit et l'éventuel choix de l'ordre de tri), devrait bien aider. Si on l'appelait depuis un autre module on remplacerait Dim par Public, mais il ne me semble pas que ce soit le cas ?
Geo a écrit, le 12/12/2010 20:05 :
Bonjour
Lorsque je développe je fais bien comme vous le conseillez, je mets
toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclaré es,
elles doivent donc être globales au module.
C'est le cas du i qui peut être réinitialisé ailleurs.
Ah ben oui, je me permets de répéter mon intervention d'hier :
Oui, et particulièrement la déclaration du compteur, avec l'indicat ion précise de son emplacement.
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Effectivement, Dim I As Integer, en haut du module (après le Option
Explicit et l'éventuel choix de l'ordre de tri), devrait bien aider.
Si on l'appelait depuis un autre module on remplacerait Dim par Public,
mais il ne me semble pas que ce soit le cas ?
Lorsque je développe je fais bien comme vous le conseillez, je mets toujours l'option explicit et je ne valide pas la gestion d'erreurs.
Dans la macro que vous avez envoyé il y a des variables non déclaré es, elles doivent donc être globales au module. C'est le cas du i qui peut être réinitialisé ailleurs.
Ah ben oui, je me permets de répéter mon intervention d'hier :
Oui, et particulièrement la déclaration du compteur, avec l'indicat ion précise de son emplacement.
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Effectivement, Dim I As Integer, en haut du module (après le Option Explicit et l'éventuel choix de l'ordre de tri), devrait bien aider. Si on l'appelait depuis un autre module on remplacerait Dim par Public, mais il ne me semble pas que ce soit le cas ?
Geo
Re
i toujours à 2, alors là il va bien falloir que je lise le code ...
Ben oui mdr Je ne comprends pas le comportement décrit, car il n'y a pas de Save. Reste l'idée que la macro ou la déclaration des variables globales, dont "i", serait dans le document type.
-- A+
Re
i toujours à 2, alors là il va bien falloir que je lise le code ...
Ben oui mdr
Je ne comprends pas le comportement décrit, car il n'y a pas de Save.
Reste l'idée que la macro ou la déclaration des variables globales,
dont "i", serait dans le document type.
i toujours à 2, alors là il va bien falloir que je lise le code ...
Ben oui mdr Je ne comprends pas le comportement décrit, car il n'y a pas de Save. Reste l'idée que la macro ou la déclaration des variables globales, dont "i", serait dans le document type.
-- A+
Geo
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Oui, mais perso je n'aime pas. J'utilise un langage de programmation où les déclarations ne peuvent pas être rendues obligatoires et les noms sensibles à la casse, c'est à dire que j et J ne sont pas la même variable. C'est pas triste.
-- A+
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Oui, mais perso je n'aime pas.
J'utilise un langage de programmation où les déclarations ne peuvent
pas être rendues obligatoires et les noms sensibles à la casse, c'est à
dire que j et J ne sont pas la même variable.
C'est pas triste.
Si il n'y a carrément pas de déclaration, Excel se débrouille ...
Oui, mais perso je n'aime pas. J'utilise un langage de programmation où les déclarations ne peuvent pas être rendues obligatoires et les noms sensibles à la casse, c'est à dire que j et J ne sont pas la même variable. C'est pas triste.
-- A+
Gloops
MorMic a écrit, le 11/12/2010 23:27 :
Set xlApp = CreateObject("excel.application")
Ah oui alors xlApp n'ayant pas été déclaré, sera du type objet. On aurait pu le déclarer comme Excel.Application, et l'initialiser pareil, avec l'instruction ci-dessus.
L'avantage, si on a bien coché la référence qui va bien (dans Outils/Références), c'est qu'on a accès à l'intellisense, donc qu and tape xlApp suivi d'un point, on voit apparaître toutes les propriété s et méthodes de l'objet Application d'Excel.
ça s'appelle Early Binding, par opposition à Late Binding, ce qui permettra de faire une recherche dessus, un peu plus tard, quand tout sera ficelé, pour comprendre les tenants et aboutissants.
Depuis que j'ai découvert qu'on peut, j'aime bien faire les deux ensemble, comme ça :
Dim xlApp As New Excel.Application
C'est pratique, dès que j'ai tapé Excel, après le point, Applicatio n m'est proposé dans la liste, par l'intellisense.
Alors qu'avec CreateObject, si on fait une faute de frappe à l'intéri eur des guillemets, c'est au moment de l'exécution, qu'on s'en rend compte.
Souvent, mes modules faisant appel à Excel commencent par
Dim xlApp As New Excel.Application Dim xlWbk As Excel.Workbook Dim xlWst As Excel.Worksheet
Seul Application est initialisé par New, pour les autres on a Workbook.Add, ActiveWorkbook.Worksheets(1) ... qui permettent de savoir de quoi on parle.
Bien entendu tout cela ne vaut pas si on veut appeler une instance d'Excel déjà ouverte, auquel cas on ne coupera pas au GetObject, à moins qu'une façon de faire m'ait échappé.
Par ailleurs il arrive qu'on soit obligé de faire appel au Late Binding si on a un petit souci avec l'installation d'une des applications.
MorMic a écrit, le 11/12/2010 23:27 :
Set xlApp = CreateObject("excel.application")
Ah oui alors xlApp n'ayant pas été déclaré, sera du type objet.
On aurait pu le déclarer comme Excel.Application, et l'initialiser
pareil, avec l'instruction ci-dessus.
L'avantage, si on a bien coché la référence qui va bien (dans
Outils/Références), c'est qu'on a accès à l'intellisense, donc qu and
tape xlApp suivi d'un point, on voit apparaître toutes les propriété s et
méthodes de l'objet Application d'Excel.
ça s'appelle Early Binding, par opposition à Late Binding, ce qui
permettra de faire une recherche dessus, un peu plus tard, quand tout
sera ficelé, pour comprendre les tenants et aboutissants.
Depuis que j'ai découvert qu'on peut, j'aime bien faire les deux
ensemble, comme ça :
Dim xlApp As New Excel.Application
C'est pratique, dès que j'ai tapé Excel, après le point, Applicatio n
m'est proposé dans la liste, par l'intellisense.
Alors qu'avec CreateObject, si on fait une faute de frappe à l'intéri eur
des guillemets, c'est au moment de l'exécution, qu'on s'en rend compte.
Souvent, mes modules faisant appel à Excel commencent par
Dim xlApp As New Excel.Application
Dim xlWbk As Excel.Workbook
Dim xlWst As Excel.Worksheet
Seul Application est initialisé par New, pour les autres on a
Workbook.Add, ActiveWorkbook.Worksheets(1) ... qui permettent de savoir
de quoi on parle.
Bien entendu tout cela ne vaut pas si on veut appeler une instance
d'Excel déjà ouverte, auquel cas on ne coupera pas au GetObject, à moins
qu'une façon de faire m'ait échappé.
Par ailleurs il arrive qu'on soit obligé de faire appel au Late Binding
si on a un petit souci avec l'installation d'une des applications.
Ah oui alors xlApp n'ayant pas été déclaré, sera du type objet. On aurait pu le déclarer comme Excel.Application, et l'initialiser pareil, avec l'instruction ci-dessus.
L'avantage, si on a bien coché la référence qui va bien (dans Outils/Références), c'est qu'on a accès à l'intellisense, donc qu and tape xlApp suivi d'un point, on voit apparaître toutes les propriété s et méthodes de l'objet Application d'Excel.
ça s'appelle Early Binding, par opposition à Late Binding, ce qui permettra de faire une recherche dessus, un peu plus tard, quand tout sera ficelé, pour comprendre les tenants et aboutissants.
Depuis que j'ai découvert qu'on peut, j'aime bien faire les deux ensemble, comme ça :
Dim xlApp As New Excel.Application
C'est pratique, dès que j'ai tapé Excel, après le point, Applicatio n m'est proposé dans la liste, par l'intellisense.
Alors qu'avec CreateObject, si on fait une faute de frappe à l'intéri eur des guillemets, c'est au moment de l'exécution, qu'on s'en rend compte.
Souvent, mes modules faisant appel à Excel commencent par
Dim xlApp As New Excel.Application Dim xlWbk As Excel.Workbook Dim xlWst As Excel.Worksheet
Seul Application est initialisé par New, pour les autres on a Workbook.Add, ActiveWorkbook.Worksheets(1) ... qui permettent de savoir de quoi on parle.
Bien entendu tout cela ne vaut pas si on veut appeler une instance d'Excel déjà ouverte, auquel cas on ne coupera pas au GetObject, à moins qu'une façon de faire m'ait échappé.
Par ailleurs il arrive qu'on soit obligé de faire appel au Late Binding si on a un petit souci avec l'installation d'une des applications.
Gloops
Geo a écrit, le 12/12/2010 20:27 :
Si il n'y a carrément pas de déclaration, Excel se débrouille .. .
Oui, mais perso je n'aime pas.
Ah ben c'est sûr que si on a des étagères c'est pour pouvoir ranger ses affaires :)
J'utilise un langage de programmation où les déclarations ne peuven t pas être rendues obligatoires et les noms sensibles à la casse, c'est à dire que j et J ne sont pas la même variable. C'est pas triste.
Geo a écrit, le 12/12/2010 20:27 :
Si il n'y a carrément pas de déclaration, Excel se débrouille .. .
Oui, mais perso je n'aime pas.
Ah ben c'est sûr que si on a des étagères c'est pour pouvoir ranger ses
affaires :)
J'utilise un langage de programmation où les déclarations ne peuven t pas
être rendues obligatoires et les noms sensibles à la casse, c'est à dire
que j et J ne sont pas la même variable.
C'est pas triste.
Si il n'y a carrément pas de déclaration, Excel se débrouille .. .
Oui, mais perso je n'aime pas.
Ah ben c'est sûr que si on a des étagères c'est pour pouvoir ranger ses affaires :)
J'utilise un langage de programmation où les déclarations ne peuven t pas être rendues obligatoires et les noms sensibles à la casse, c'est à dire que j et J ne sont pas la même variable. C'est pas triste.