Question Liaisons Excel

Plus d'informations
il y a 17 ans 3 mois #3430 par michault
Liaisons Excel a été créé par michault
Bonjour,
Voilà mon problème:
Dans ma société, je mutualise les infos devant être partagées en déplaçant le contenu des dossiers partagés locaux sur un serveur sur lequel via Active Directory je gère les droits.

Hors je dois déplacé tout un dossier contenant des documents Excel bourrés de liaisons Excel.:sick:

J'aimerais savoir si quelqu'un a déjà eu le problème et si powershell me permettrait de mettre à jour ces liaisons après les avoir détecter.

Merci

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3437 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
chm69 écrit:

si powershell me permettrait de mettre à jour ces liaisons après les avoir détecter.

Ce qu'il est permis de faire avec OleAutomation sous Excel peut je pense l'être dans la pluspart des cas avec PS ou un autre langage. Reste ensuite à savoir comment on gére ces liaisons.
Une approche est de créer une macro, ce qui te génère du code VBA qu'il faut ensuite interpréter puis traduire. Surtout tu récupére les noms de classes concernées.

La documentation de VBA se trouve dans le répertoire Office, par exemple :
\"C:\Program Files\Microsoft Office\OFFICE11\1036\VBAXL10.CHM\"

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3440 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
En recherchant le mot liaison dans la doc vba d'XL on tombe sur ceci :

LinkSources, méthode

Cette méthode renvoie un tableau de liaisons dans le classeur. Les noms contenus dans le tableau sont ceux des documents, éditions ou serveurs DDE ou OLE liés. Cette méthode renvoie la valeur Empty s'il n'existe aucune liaison. Méthode de type Variant.

[code:1]
#Exemple VBA
aLinks = ActiveWorkbook.LinkSources(xlOLELinks)
If Not IsEmpty(aLinks) Then
For i = 1 To UBound(aLinks)
MsgBox \"Link \" & i & \":\" & Chr(13) & aLinks(i)
Next i
End If
[/code:1]
Ensuite voir la méthode ChangeLink.
A vérifier bien évidemment ;)

Doc online de VBA Office 2003 :
msdn.microsoft.com/en-us/library/bb190882(office.11).aspx

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3445 par michault
Réponse de michault sur le sujet Re:Liaisons Excel
J'arrive à boucler sur mon dossier et a provoquer l'ouverture de tous les excels mais comment traduire

[code:1]aLinks = ActiveWorkbook.LinkSources(xlOLELinks)
If Not IsEmpty(aLinks) Then[/code:1]

j'ai écris ça

[code:1]$link = $classeur.LinkSources
if ($link -eq [string]::Empty)[/code:1]

mais ça ne fonctionne pas

de plus linksources(xlOLELinks) , powershell n'aime pas.

pour pas aidé, je connais pas VBA:evil:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3446 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Liaisons Excel
chm69 écrit:

comment traduire
[code:1]aLinks = ActiveWorkbook.LinkSources(xlOLELinks)
If Not IsEmpty(aLinks) Then[/code:1]

Pour l'appel de LinkSources il faut combiner l'usage de la doc offline et online. Celle online nous fournis la valeur du type XLLink .
[code:1]
Set-variable xlOLELinks 2 -Option Constant
$Links = $classeur.LinkSources($xlOLELinks)
[/code:1]
LinkSources renvoie une collection, c'est indiqué dans la documentation. Il est nécessaire de lire celle concernant les méthodes que tu comptes utiliser.
[code:1]
if ($Links.Count -ne 0 ) {Ok, la suite...}
[/code:1]
Ensuite l'accès à la collection il faut vérifier si on passe par la propriété Links.item(1) ou par Links().item(1).

Les objets COM présentent leurs collections au travers de propriété, pourtant sous PowerShell leurs accès ont été adaptés :
[code:1]
#Crée un objet Explorer
$ShellExp = new-object -comObject Shell.Application
$ShellExp|gm
#Affiche toutes les Fenêtres
$ShellExp.Windows()
#Les quatres appels suivant provoquent une erreur
$ShellExp.Windows[0]
$ShellExp.Windows(1)
$ShellExp.Windows.Item(1)
$ShellExp.Windows.Item[1]
#Affiche la Fenêtre zéro
$ShellExp.Windows().Item(0)
[/code:1]
Sous Excel la propriété WorkSheet est documentée comme étant une collection malgré cela on doit y accéder via la propriété nommée Item :
[code:1]
$excel = new-object -com Excel.Application
$classeurSource=\"$PWD\Test.xls\"
$MonClasseur = $excel.Workbooks.Open($classeurSource)
#Les deux appels suivant provoquent une erreur
$MonClasseur.Worksheets[1]
$MonClasseur.Worksheets(1)
#Accéde a la première feuille XL
$MonClasseur.Worksheets.Item(1)
$Excel.Quit()
#Force la libération des ressources
$null=[System.Runtime.InteropServices.Marshal::ReleaseComObject($MonClasseur)]
$null=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect()
[/code:1]
Note qu’ici l’accès est légérement différent du premier exemple.
chm69 écrit:

pour pas aidé, je connais pas VBA


Je serais tenté de te répondre moi non plus, je ne le pratique principalement que lors de traductions dans un autre langage.
Le portage pouvant quelques fois poser pb. Mais dans l'ensemble c'est un langage assez simple à manipuler à la différence du C++ ;-)<br><br>Message édité par: Laurent Dardenne, à: 10/12/08 18:35

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 3 mois #3450 par michault
Réponse de michault sur le sujet Re:Liaisons Excel
Je ne dois pas savoir où chercher dans les docs mais je ne m'en sort pas. Mon $links.count ne sort rien. Voilà mon bout de script.

[code:1]#UpdateExcelLink.ps1
# Paramètres: $source : Emplacement des dossiers à traiter
Param($source)
#Définition des constantes
Set-variable xlOLELinks 2 -Option Constant
Set-variable xlExcelLinks 1 -Option Constant

#Liste des Excel à modifier
Get-ChildItem $source -Recurse -include *.xls |ForEach-Object {
$excel = new-object -comobject excel.application
$excel.visible = $true
$excelfile = $source + \&quot;\\&quot; + $_.name
$classeur = $excel.workbooks.open($excelfile)
$links = $classeur.LinkSources($xlOLELinks)
if ($links.Count -eq 0 )
{
$excel.workbooks.close()
}
else
{
Write-Host $_.name , \&quot; \&quot;, \&quot;Des liaisons existent\&quot;
}
}[/code:1]

Sur 30 excel, il me sort systématiquement qu'il y a des liaisons même dans les classeurs qu'y n'en n'ont pas.
Idem avec xlExcelLinks
Je lève le pied car je suis en train de péter un câble.:evil:<br><br>Message édité par: chm69, à: 11/12/08 13:47

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.107 secondes
Propulsé par Kunena