[Résolu] [Calc] Rafraîchissement des liens à distance

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

[Résolu] [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Bonjour à tous,

Est-il possible d'actualiser (CTRL + MAJ + F9) à l'aide d'une macro, les liens d'un classeur lié à celui qui exécute la macro ?

@ Bientôt
Dernière modification par TheHache le 04 mars 2017 16:18, modifié 1 fois.
LibO 25.8.4.2 - Windows 11 Famille
Jeff
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 10005
Inscription : 18 sept. 2006 09:40
Localisation : France

Re: [Calc] Rafraîchissement des liens à distance

Message par Jeff »

Bonjour,

Je ne sais pas si cela t'aidera, mais l'équivalent de Ctrl + Maj + F9 est CalculateHard
(l'équivalent de F9 est CalculateAll)

Pour une mise à jour de lien, l’enregistreur donne le code suivant:

Code : Tout sélectionner

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:EditLinks", "", 0, Array())


end sub
EditLinks semble être la clef :)

A + :)
À lire avant tout !

Pour télécharger Apache OpenOffice

AOO 4.1.16 / Debian 13 "Trixie" / Xfce
AOO 4.1.15 / Debian 11 "Bullseye" / Cinnamon
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

Re: [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Merci Jeff

J'ai omis de préciser qu'il ne s'agissait pas de liens DDE mais de simples formules de la forme : 'file:///C:/MonClasseur.ods'#$MaFeuille.$E$2

Il me semble, d'après ce que j'ai compris, que EditLinks est pour les liens DDE.

@+
LibO 25.8.4.2 - Windows 11 Famille
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Rafraîchissement des liens à distance

Message par zeguedon »

Bonjour,

(Non testé) :

Code : Tout sélectionner

Sub Main
lesLiens = Thiscomponent.SheetLinks' AreaLinks...DDELinks
for i = 0 to lesLiens.count -1
	unLien = lesLiens(i)
	unLien.refresh
next
End Sub
A+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

Re: [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Bonjour Zeguedon,

Merci pour ta collaboration.
zeguedon a écrit :

Code : Tout sélectionner

lesLiens=Thiscomponent.SheetLinks' AreaLinks...DDELinks
Le ThisComponent de ton code correspond au classeur en cours hors je désirerai activer les liens d'un classeur depuis un autre.

Au final, exécuter une macro dans classeur_1.ods qui rafraîchi les liens de classeur_2.ods.

@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibO 25.8.4.2 - Windows 11 Famille
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26177
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Rafraîchissement des liens à distance

Message par Dude »

Salut,

Ouvre le classeur_2.ods en mode caché :

Code : Tout sélectionner

Dim Arg(0) As New com.sun.star.beans.PropertyValue
Arg(0).Name = "Hidden"
Arg(0).Value = True
sDoc = ConvertToURL("chemin/vers/classeur_2.ods")
oDoc = StarDesktop.loadComponentFromURL(sDoc, "_default", 0, Arg() )
Agis ensuite sur lui de la même manière.
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

Re: [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Salut Dude,

Ton code ouvre, en caché, mon classeur_2.ods depuis classeur_1.ods. Cependant ce classeur_2.ods ne doit pas être caché pour mon usage. Donc Hidden = False, ou pas d'argument.
Dude a écrit :Agis ensuite sur lui de la même manière.
Que veux tu dire par là ?

@+
LibO 25.8.4.2 - Windows 11 Famille
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Rafraîchissement des liens à distance

Message par zeguedon »

Bonjour TheHache

Désolé pour ma réponse tardive (programme chargé en ce moment).
TheHache a écrit :
Dude a écrit:
Agis ensuite sur lui de la même manière.
Que veux tu dire par là ?
Dude veut dire que lorsque que le classeur2 (oDoc) est ouvert par son code, tu appliques le code que je t'ai donné plus haut à oDoc au lieu de Thiscomponent.

Je viens de faire un test mais cela ne fonctionne pas.
Thiscomponent.SheetLinks ne concerne que les feuilles insérées par le menu Feuille>Insertion à partir d'un fichier (sous LO).
AreaLinks et DDELinks concernent les plages nommées et les liens DDE. Je n'ai pas trouvé le moyen d'obtenir l'équivalent de : menu Édition>Liens>Actualiser même le dispatcher s’arrête à l'ouverture de la fenêtre d'actualisation.

De mon point de vue, il ne faut pas procéder comme tu le souhaites. Il est préférable d'utiliser l'option Lien vers des données externes (toujours dans le menu Feuille sous LO) à la place de :='file:///C:/MonClasseur.ods'#$MaFeuille.$E$2. Cela implique que les cellules à lier soient nommées. Ensuite Insertion>Liens vers des données externes.
Là tu as deux options : soit l'actualisation est automatique :
Données externes_068.png
soit une actualisation par macro à l'image du code plus haut.
Dans tous les cas, pour que l'actualisation fonctionne, il faut que les modifications apportées au classer1 soient systématiquement enregistrées avant de tenter l'actualisation du classeur2.

Je te laisse tester à partir de ces quelques informations.

A dans 24 heures.
 Ajout : Un exemple de lien avec actualisation automatique
ActualisationAutomatiqueSansMacro.zip
 
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Rafraîchissement des liens à distance

Message par Hubert Lambert »

Dès qu'une référence au second document est disponible, un simple calculateAll() doit suffire en principe à rafraîchir les liens externes.
En partant de l'exemple de Dude, cela donnerait :

Code : Tout sélectionner

    [...]
    oDoc = StarDesktop.loadComponentFromURL(sDoc, "_default", 0, Arg() )
    oDoc.calculateAll()
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

Re: [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Bonjour à tous,

Parfait Hubert Lambert !

Code : Tout sélectionner

calculateAll()
effectivement rafraîchi les liens, je l'utilisais dans le classeur 2 en attendant une solution alternative.

Couplé avec l'idée de Dude, le rafraîchissement des liens du classeur2 depuis le classeur1 fonctionne. Cependant,

Code : Tout sélectionner

StarDesktop.loadComponentFromURL(sDoc, "_default", 0, Arg() )
ouvre le classeur 2 et l'active. De ce fait, je ne peux plus continuer à saisir dans le classeur1 sans l'avoir activé au préalable. C'est gênant.

N'y aurait-il pas une solution pour laisser le classeur1 actif à l'ouverture du classeur2 ?

@ bientôt
LibO 25.8.4.2 - Windows 11 Famille
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Rafraîchissement des liens à distance

Message par Piaf »

Bonjour
TheHache a écrit :effectivement rafraîchi les liens,
Même avec AOO ?
TheHache a écrit :ouvre le classeur 2 et l'active. De ce fait, je ne peux plus continuer à saisir dans le classeur1 sans l'avoir activé au préalable. C'est gênant.
Teste

Code : Tout sélectionner

thisComponent.CurrentController.Frame.ContainerWindow.toFront
en dernière ligne de la macro.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc] Rafraîchissement des liens à distance

Message par Hubert Lambert »

Piaf a écrit :Même avec AOO ?
En effet, ça ne marche qu'avec LibO !
TheHache a écrit :ouvre le classeur 2 et l'active. De ce fait, je ne peux plus continuer à saisir dans le classeur1 sans l'avoir activé au préalable. C'est gênant.
Pour obtenir une référence à un document ouvert sans l'activer, tu peux t'inspirer du code suivant, où "doc2url" est l'url du document cherché :

Code : Tout sélectionner

    components = stardesktop.Components.createEnumeration()
    do while components.hasMoreElements()
        component = components.NextElement()
        if component.URL = doc2url then
            doc2 = component
            exit do
        end if
    loop
 Ajout : Aux dernières nouvelles (forum anglophone), il n'est pas possible avec AOO d'actualiser ces liens par macro. 
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Rafraîchissement des liens à distance

Message par Piaf »

Re
La seule solution trouvée, :oops:

Code : Tout sélectionner

Sub Main
Dim sDoc as String, oDoc as Object
Dim oEnum as Object, oComp as Object
Dim arg(0) As New com.sun.star.beans.PropertyValue
Dim oFrame as Object, oDispatch as Object
	thisComponent.store
	oEnum = StarDesktop.Components.createEnumeration
	Do While oEnum.hasMoreElements()
		oComp = oEnum.nextElement()
		If oComp.Title = "Classeur_2.ods" Then
			oComp.Store
			oComp.Close(True)
		End If	
	Loop
	arg(0).Name = "UpdateDocMode"
	arg(0).Value = 3
	sDoc = ConvertToURL("/home/tdm/Téléchargements/Classeur_2.ods")
	oDoc = StarDesktop.loadComponentFromURL(sDoc, "_default", 0, arg() )
	thisComponent.CurrentController.Frame.ContainerWindow.toFront	
End Sub
La demande de confirmation d'actualisation des liens est systématique.
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
TheHache
PassiOOnné
PassiOOnné
Messages : 653
Inscription : 02 déc. 2009 09:43

Re: [Calc] Rafraîchissement des liens à distance

Message par TheHache »

Bonjour

Merci à vous tous, le rafraîchissement automatique des liens à distance fonctionne parfaitement avec les morceaux de code de chacun. :bravo:

Voici ce qui fonctionne :

Code : Tout sélectionner

Sub Rafraichir_Liens
Dim sDoc As String
Dim oDoc As Object
Dim Arg(0) As New com.sun.star.beans.PropertyValue
sDoc = ConvertToURL("C:\monClasseur2.ods")
oDoc = StarDesktop.loadComponentFromURL(sDoc, "_default", 0, Arg())
oDoc.calculateAll()
ThisComponent.CurrentController.Frame.ContainerWindow.toFront
End Sub
Cette macro sur l’événement de la feuille --> contenu modifié et c'est parfait pour actualiser un autre classeur dés la saisie validée dans le classeur pincipal.
Encore bravo et merci à Jeff, Zeguedon, Dude, Hubert Lambert et Piaf.
A bientôt
LibO 25.8.4.2 - Windows 11 Famille