Résolu VBA Publisher : sélectionner une page

PlugNPlay

Nouveau membre
Bonjour à tous,

Je développe actuellement une application pour laquelle j'ai besoin de travailler, en VBA, sous Publisher depuis Excel. Je n'ai jamais fait de VBA sous Publisher auparavant mais beaucoup sous Excel. Je cherche désespérément, depuis une semaine, comment faut-il faire pour sélectionner une page en particulier ?

Ma demande est très simple : mon document Publisher contient déjà plusieurs pages ; lorsque je l'ouvre, il se place sur la première. J'ai besoin d'ajouter un élément à la troisième page, mais pour cela il faut que je l'active / la sélectionne. Or je n'ai trouvé absolument aucune instruction qui permette de le faire...

Les ressources sur ce sujet sur Internet sont inexistantes ou très rares. Quelqu'un peut-il m'aider ? Ou au moins me dire si jamais ce n'est pas possible de sélectionner une page via le VBA...

L'élément que je souhaite rajouter est une image, copiée depuis Excel. J'ai mis une instruction simple :
[cpp]Publisher.ActiveDocument.Pages(3).Shapes.Paste[/cpp]
Le problème c'est que malgré ça il me colle l'image en page 1 - la page active !

Merci d'avance à la bonne âme qui pourra m'aider... ou essaiera au moins de le faire :)


PlugNPlay
 

zeb

Modérateur
Salut,

Je n'ai pas de Publisher sous la main.
Peut-être devrais-je aller lire la doc' de 'Crosoft sur le sujet (modèle objet de Publisher) qu'on devrait trouver sur MSDN, mais je me dis que tu peux très bien le faire toi-même. :lol: Je viens de te faire un bon vieux RTFM !

En fait, je me permets cette entrée en matière parce que j'ai peut-être une solution pour toi.
Fais-le dans Publisher avec l'enregistreur de macro (y-a-t-il bien un enregistreur de macro sous Publisher ?)
Ensuite analyse le code et transpose-le dans Excel.
 

PlugNPlay

Nouveau membre
Merci de répondre, déjà, parce que c'est le seul retour que j'aie eu jusqu'à présent :)
Je m'y attendais bien à ce type de réponse, mais que croyez-vous, oui je l'ai lu en long, en large et en travers le fucking manual... déjà qu'il est pas bien épais...
MS propose de télécharger une sorte de doc Publisher, ce que j'ai fait, je l'ai installée mais j'ai beau essayer elle fonctionne pas...
J'ai regardé toutes les collections, propriétés, objets, méthodes, etc en rapport avec Pages ou Shapes sur MSDN et dans la librairie du VBE mais on trouve que dalle.

Et à mon grand malheur, non, l'enregistreur de macros n'existe pas sous Publisher :fou:
Mais je me suis dit, puisque je travaille depuis Excel, ben je vais enregistrer depuis Excel ! Et... ça marche pas non plus :( Excel enregistre seulement ce que je fais sous Excel : sélectionner une cellule, copier un graph, réduire la fenêtre... ensuite je suis passée sous Publisher pour y coller le graph... puis je suis revenue sous Excel, sélectionner une cellule. Mais résultat, ce qu'il enregistre c'est comme si je n'avais jamais quitté Excel !

Voilà voilà où j'en suis...
Mais ça fait plaisir de recevoir une réponse quand même on se sent moins seul :lol:
 

zeb

Modérateur
Voilà autre chose :
Code:
Excel.ActiveShape.Cut
Publisher.ActiveDocument.Pages(3).Activate
Publisher.ActiveDocument.ActivePage.Paste

Non vérifié, bien sûr.

---------

PS: A ceux qui sont habitués à me voir fustiger l'utilisation des objets actifs et l'emploi du presse-papier comme zone de travail, sachez que quelqu'un d'autre a utilisé mon compte pour écrire le pseudo-code ci-dessus. Non, je n'aurais pas pu écrire cela moi-même. :o
 

PlugNPlay

Nouveau membre
Ah ben non là ça ne va pas aller ! si c'était aussi simple, je n'aurais même pas eu besoin de poster sur un forum ; ) !

L'objet Pages n'inclut aucune sorte de méthode Activate ou quoi que ce soit d'autre qui y ressemble. De plus la propriété ActivePages n'existe pas non plus.

Moi je vois pas le problème quant à l'utilisation des objets actifs... pourquoi surcharger le code en re-précisant à chaque fois de quoi/qui on parle, tant qu'on ne s'embrouille pas ? Presse-papier ok mais des fois on n'a pas le choix.
 

zeb

Modérateur
Quand tu exploiteras vraiment les macro-commandes Excel à outrance, tu pourras avoir plusieurs programmes qui tourneront en même temps. Et là, se référer à l'objet actif sera ta perte !
 

zeb

Modérateur
Gné ?

Ecoute, je ne rêve pas !
L'exemple As it applies to the Shapes object donné à la page me semble clair.

Euh.... Attention, code crade

Code:
' // Code qui devrait fonctionner
Publisher.ActiveDocument.Pages(3).Shapes.Paste

' // Si ça marche pas :
With Publisher.ActiveDocument
    .Pages(1).Shapes.Paste ' // Ah tu la veux sur la première page ? La voilà !
    .Pages(1).Shapes(.Pages(1).Shapes.Count).Cut ' // Grosse astuce
    .Pages(2).Shapes.Paste ' // Code by Microsoft. Si ça, ça ne marche pas
End With
 

PlugNPlay

Nouveau membre
Ok, compris pour l'objet actif :)

La première partie du code, c'est ce que j'avais fait au début, qui devrait fonctionner sans problème, et pourtant il me le collait systématiquement sur la page active, à savoir la page 1 (puisqu'il se replace toujours sur la première page quand il ouvre le doc Publisher... pas moyen de faire comme sous Excel, enregistrer tant qu'on est sur une certaine page et quand on rouvre le classeur on est encore sur cette page)

En revanche bonne astuce pour la deuxième partie du code, je n'y avais pas pensé. Ca ne sélectionne pas la page, mais ça colle bien l'image sur la deuxième page, c'est l'essentiel.

En attendant, j'avais réussi à trouver moi aussi une grosse astuce, c'est tordu mais bon... ça fonctionne, c'est tout ce qui m'intéresse à ce niveau-là depuis quelques temps !
[cpp]
Dim Shp1 As Variant

Set Shp1 = Publisher.ActiveDocument.Pages(3).Shapes(6)
Publisher.ActiveView.ScrollShapeIntoView Shape:=Shp1
[/cpp]
Ouais, je sais, moi aussi j'ai horreur des types 'Variant', d'ailleurs c'est la première fois que je suis amenée à déclarer une telle variable, mais... ici encore, j'ai tout essayé, 'Shape', 'Shapes', 'ShapeRange', 'Range', ... Aucun ne permettait à la macro de s'exécuter sans message d'erreur. Pourtant l'argument Shape est bien de type Shape. Si tu trouves avec quel type ça fonctionne...

Bref, l'instruction ScrollShapeIntoView je ne sais même pas à quoi elle est sensée servir, à la base, elle ne sélectionne pas la forme, en revanche elle se place sur la même page qu'elle, la centre dans l'écran et zoom dessus jusqu'à ce qu'elle occupe toute la largeur de l'écran (ce qui fait que je me suis retrouvée avec un zoom à 800% mais ça c'est facile à régler).
La seule chose importante, c'est qu'on se retrouve avec la bonne page sélectionnée.

Bon, eh bien un grand merci pour ton aide ! :hello:
 

zeb

Modérateur
Eh, attends je n'en ai pas terminé avec toi ! :lol:

Si tu es obligé de définir un Variant, c'est que VBA/Excel ne connaît pas que les objets d'Excel. Si tu veux qu'il connaisse aussi ceux de Publisher, de Word, etc. il va falloir explicitement les lui apprendre. Or dans quoi apprend-t-on ? Dans les livres de références :o

Ta mission, puisque tu l'acceptes, va être de trouver dans le menu Outils de ton éditeur de VBA/Excel, une icône représentant des bouquins avec comme nom : "Références".

Dans ce menu, cherche et trouve "Microsoft Publisher V.er.si.on Object Library".

Et voilà :sol:
 

PlugNPlay

Nouveau membre
Voui mais je l'avais déjà activée la librairie, en VBA Excel je m'y connais bien... :)
Quoi qu'il en soit, de toute façon le problème ne semble pas venir de là puisque de toute façon quand je déclare ma variable, les "Shape" "Shapes" etc font partie de ses propositions, et ce sont des mots clé qu'il reconnaît (même sans activer la librairie d'ailleurs)

Je me suis fait un tout petit bout de code pour réessayer :
[cpp]
Sub essai()

Dim sd As Shapes 'Essayé aussi As Shape, As ShapeRange, ...
1 Set sd = Publisher.ActiveDocument.Pages(2).Shapes(3)
2 Publisher.ActiveDocument.ActiveView.ScrollShapeIntoView Shape:=sd

End Sub
[/cpp]
A côté de ça j'ai bien sûr ouvert une instance Publisher, où j'ai créé un ptit document de 3 pages, avec quelques formes sur chacune d'elles.
Et librairie activée ou pas, tout ce qu'Excel sait me dire c'est "incompatibilité de type" à la ligne 1...

Pour finir j'ai essayé en déclarant une constante plutôt qu'une variable... mais à l'exécution il me dit "Constante requise" en surlignant le mot clé ".Shapes", alors qu'il est suivi de "(3)" donc c'est constant ça... :??:
 

zeb

Modérateur
Ah, et si Shape(s) recouvraient deux notions, l'une en Excel, l'autre en Publisher ?
Il faudrait alors les distinguer en préfixant les mots ambigus du nom de la bibliothèque :o
 

PlugNPlay

Nouveau membre
Meilleure réponse
Mmh ouais, pas bête :) !
Je fais un essai... ça marche :pt1cable: !
il me semblait avoir essayé pourtant, il faudra que je vérifie sur l'autre pc.

Donc, au final, la solution est la suivante (je résume pour ceux qui ont pas envie de se retaper toute la discussion :lol: ) :
■ Dans le VBE d'Excel, aller activer la librairie Microsoft Publisher xx.x Object Library ;
■ Dans une macro Excel, entrer le code suivant :
[cpp]
Sub PbTest()

'Mettre le "Publisher." devant précise qu'on utilise l'objet issu
'de la librairie Publisher :
Dim db As Publisher.Shape

'En supposant que le doc Publisher existe déjà, qu'il est déjà ouvert
'et possède au moins 4 formes sur la deuxième page :
Set db = Publisher.ActiveDocument.Pages(2).Shapes(4)

Publisher.ActiveDocument.ActiveView.ScrollShapeIntoView Shape:=db

'Et voilà ! Bon après petits problèmes de zoom, pour faire simple :
Publisher.ActiveDocument.ActiveView.Zoom = 100

End Sub
[/cpp]
■ Exécuter :D

Merci d'avoir poursuivi la discussion jusqu'au bout zeb, j'ai appris des choses !
:hello:
 

zeb

Modérateur
:merci:

(Y'a plus qu'à choisir la moins mauvaise de mes réponses : le topic passera en résolu)
 

PlugNPlay

Nouveau membre
Bon ben dans ce cas je mets ta dernière remarque, comme ça si les gens ne sont pas trop bêtes ils regarderont mon message en dessous :lol:
 

zeb

Modérateur
Si tu estimes que ta réponse est la meilleure, choisis-la.
Impossible de le faire toi-même, tu me diras.
Conformément au règlement, il te suffit de le demander à un modérateur :o

Je prends ta remarque pour une telle demande... ;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 005
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut