Question diverses manipulation dans Excel 2007

Plus d'informations
il y a 16 ans 6 mois #5266 par Eric_K
Bonjour,

J'ai un script qui fonctionne très bien avec Excel 2003 mais certaines parties ne fonctionnent pas avec Excel 2007.

Voici le message d'erreur que j'ai :

Exception lors de l'appel de « Delete » avec « 0 » argument(s) : « Ancien format ou bibliothèque de types non valide. (
Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)) »
Au niveau de ligne : 1 Caractère : 36
+ $workbook.WorkSheets.item(1).delete( <<<< )


Avec le code suivant :
[code:1]
$excel.DisplayAlerts = $False
$workbook.WorkSheets.item(1).delete()
[/code:1]

Je sais qu'il y a un problème avec les versions non américaines d'Excel 2007 car j'arrive à ouvrir mon fichier Excel avec ce code :
[code:1]
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excelfile = \"chemin_fichier_excel\nom_fichier_excel.xlt\"
$ci = [System.Globalization.CultureInfo]'en-us'
$workbook = $excel.workbooks.psbase.gettype().InvokeMember(\"Open\",
[Reflection.BindingFlags]::InvokeMethod, $null, $excel.workbooks, $excelfile, $ci)
[/code:1]

Mais je n'arrive pas à comprendre ce qu'il faut faire pour supprimer une feuille en modifiant ce code.

J'ai un problème similaire pour récupérer la valeur d'une cellule avec le code suivant :
[code:1]
$workbook = $excel.ActiveWorkbook
$worksheet = $workbook.Worksheets.Item(2)
$ma_variable = $worksheet.Cells.Item(1,1).Value2
[/code:1]

Je souhaiterais aussi savoir comment modifier le code précédent pour récupérer ma valeur dans ma cellule a1.

Merci pour votre aide.

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

Plus d'informations
il y a 16 ans 6 mois #5267 par Laurent Dardenne
Salut,
Eric_K écrit:

Mais je n'arrive pas à comprendre ce qu'il faut faire pour supprimer une feuille en modifiant ce code.

C'est à dire que tu veux créer un appel à Delete en t'inspirant de l'appel suivant:
[code:1]
workbook = $excel.workbooks.psbase.gettype().InvokeMember(\"Open\", ...
[/code:1]
C'est bien ça ?
Eric_K écrit:

J'ai un problème similaire pour récupérer la valeur d'une cellule avec le code suivant

C'est à dire que tu as le même message d'erreur déjà cité, lors de l'exécution du code suivant ?
[code:1]$ma_variable = $worksheet.Cells.Item(1,1).Value2[/code:1]
Est-ce que tu cherches à généraliser les appels à InvokeMember ?

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 6 mois #5268 par Eric_K
Bonjour Laurent,

1). Je ne cherche pas absolument à créer un appel à Delete en m'inspirant de l'appel

workbook = $excel.workbooks.psbase.gettype().InvokeMember(\"Open\", ...


Mais je crois qu'avec Excel 2007 je n'ai pas bien le choix.

2). Oui, j'ai effectivement le même message d'erreur, lors de l'exécution des 2 codes, voici les codes et leur message d'erreur associé :
[code:1]
$excel.DisplayAlerts = $False
$workbook.WorkSheets.item(1).delete()


Exception lors de l'appel de « Delete » avec « 0 » argument(s) : « Ancien format ou bibliothèque de types non valide. (
Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)) »
Au niveau de chemin_fichier\nom_fichier.ps1 : 215 Caractère : 36
+ $workbook.WorkSheets.item(1).delete( <<<< )
[/code:1]

[code:1]
$workbook.WorkSheets.item(1).Name = $ma_variable


Exception lors de la définition de « Name » : « Ancien format ou bibliothèque de types non valide. (Exception from HRES
ULT: 0x80028018 (TYPE_E_INVDATAREAD)) »
Au niveau de chemin_fichier\nom_fichier.ps1 : 216 Caractère : 30
+ $workbook.WorkSheets.item(1).N <<<< ame = $ma_variable
[/code:1]

Je viens de me rendre compte qu'hier j'avais donné la ligne de code suivante :
[code:1]
$ma_variable = $worksheet.Cells.Item(1,1).Value2
[/code:1]

et non pas celle_là :

[code:1]
$workbook.WorkSheets.item(1).Name = $ma_variable
[/code:1]

Mais peu importe car les 2 sont liées, car la première récupère le contenu de la cellule A1 :
[code:1]
$ma_variable = $worksheet.Cells.Item(1,1).Value2
[/code:1]

et la deuxième :

[code:1]
$workbook.WorkSheets.item(1).Name = $ma_variable
[/code:1]

renomme la feuille par la valeur contenue dans $ma_variable.

De toute manière, avec ces codes, ça ne fonctionne pas sous Excel 2007. Le contenu de $ma_variable est vide alors que sous Excel 2003 ça fonctionne.

3). Je ne cherche pas forcément à généraliser les appels à InvokeMember, mais je ne sais pas si j'ai d'autres choix. Je souhaite adapter le code qui fonctionne sous Excel 2003 pour qu'il fonctionne sous Excel 2007. Et s'il faut passer par des appels à InvokeMember et par psbase.gettype pour y arriver, allons-y. Je souhaite simplement que ça fonctionne sous Excel 2007 avec les bons appels aux bonnes méthodes.

Voilà. Merci encore.

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

Plus d'informations
il y a 16 ans 6 mois #5269 par Laurent Dardenne
Bonjour Eric_K
Eric_K écrit:

Mais je crois qu'avec Excel 2007 je n'ai pas bien le choix.

Avec ton installation et sous PS, il n'y a pas d' autre choix il me semble.
Eric_K écrit:

Je ne cherche pas forcément à généraliser les appels à InvokeMember.

Si tu utilises fréquement cette configuration, ce ne serait peut être pas une mauvaise idée de créer un wrapper, mais revenons à ton pb courant.
Eric_K écrit:

Je souhaite adapter le code qui fonctionne sous Excel 2003 pour qu'il fonctionne sous Excel 2007.

Ok.
Alors tu dois déjà consulter la signature utilisée de la méthode InvokeMember .
Consulte le paramètre args, les autres paramètres utilisés lors de l'appel à cette méthode resteront identique :

Type : array< System..::.Object>[]()[]
Tableau contenant les arguments à passer au membre à appeler.


Puis consulter la signature du membre que tu souhaites utiliser :
[code:1]
$excel.workbooks.psobject.Methods[\"Open\"].OverloadDefinitions
[/code:1]

#avec XL2003
Workbook Open (string, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Varian
t, Variant, Variant, Variant)

Tu as ainsi la liste des paramètres de la méthode Open d'Excel, c'est avec cette liste que tu construis un tableau d'objet.
[code:1]
$OpenArgsTAb=(string, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant, Variant)
[/code:1]
Pour les paramètres optionnels on utilise cette valeur :
[code:1]
$Missing=[System.Type]::Missing
[/code:1]
On peut donc avoir
[code:1]
$OpenArgsTab=(\"C:\temp\test.xls\", $Missing,$Missing,$Missing,$Missing,$Missing,$Missing,
$Missing,$Missing,$Missing,$Missing,$Missing,$Missing,
$Missing,$Missing)
[/code:1]

Si tu veux le détail de la documentation de cette méthode XL il faut consulter le fichier .chm dans le répertoire d'Office s'il est installé, sinon sur le Web.
[code:1]
$workbook = $excel.workbooks.psbase.gettype().InvokeMember(\"Open\",
[Reflection.BindingFlags]::InvokeMethod, $null, $excel.workbooks, $OpenArgsTab, $ci)
[/code:1]
Pour Delete
[code:1]
$classeur.worksheets.item(1).Psobject.Methods[\"Delete\"]
[/code:1]
On lui passe un tableau vide.

Pour afficher les propriétés il faut soit passer par la collection Properties ou par la collection Members :
[code:1]
$excel.workbooks.psobject.Members[\"_Default\"]
$excel.worksheets.item(1).Psobject.properties[\"Name\"]
[/code:1]

Pour une lecture/affectation de propriété, il faut je pense et d'après la doc, modifier le paramètre InvokeAttr .
Par exemple avec la valeur GetField ou SetField.
[code:1]
$WSName = $excel.worksheets.item(1).PsBase.GetType().InvokeMember(\"Name\",[Reflection.BindingFlags]::GetProperty, $null, $excel.worksheets.item(1), @(), (get-UIculture))
[/code:1]
Tu peux consulter ce document , bien que pour son cas l'auteur aurait pu créer un assembly PIA, mais ce n'est pas le sujet.

C'est à vérifier, je n'ai pas le temps de vraiment tout tester, mais l'approche est là.<br><br>Message édité par: Laurent Dardenne, à: 8/09/09 10:58

Tutoriels PowerShell

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

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