Question
Liaisons Excel
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
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.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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.si powershell me permettrait de mettre à jour ces liaisons après les avoir détecter.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[code:1]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.
#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.
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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 .comment traduire
[code:1]aLinks = ActiveWorkbook.LinkSources(xlOLELinks)
If Not IsEmpty(aLinks) Then[/code:1]
[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++
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- michault
- Auteur du sujet
- Hors Ligne
- Membre premium
-
- Messages : 128
- Remerciements reçus 0
[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 + \"\\" + $_.name
$classeur = $excel.workbooks.open($excelfile)
$links = $classeur.LinkSources($xlOLELinks)
if ($links.Count -eq 0 )
{
$excel.workbooks.close()
}
else
{
Write-Host $_.name , \" \", \"Des liaisons existent\"
}
}[/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.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Liaisons Excel