[R] _Excel_RangeRead Options non par défaut

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Clampu
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mer. 16 mai 2012 22:08
Status : Hors ligne

[R] _Excel_RangeRead Options non par défaut

#1

Message par Clampu »

J'ai un nouveau soucis, qui se situe juste avant mon précédent.

La lecture du fichier Excel avec _Excel_RangeRead fonctionne correctement :

Code : Tout sélectionner

Local $valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource))
N'étant pas maitre des fichiers en entrée ($cheminsource), j'ai voulu testé certaines valeurs particulières (date, nombres ...) dans différents formats (date, texte, nombre) pour voir si elles étaient bien lues. Avec l'option par défaut, sur un format date, le 01/01/2014 devient 20140101000000 (cela fonctionne évidement bien avec un format texte). Je me suis dis que l'option $iReturn = 3 d' _Excel_RangeRead était la solution parfaite pour obtenir ce qu'il est affiché à l'utilisateur dans le .xls en entrée. Mais j'obtiens une jolie erreur 5 - Error occurred when reading data using the transpose method. @extended is set to the COM error code
Avec le @extended qui vaut -2147352567
Je n'ai pas trouvé grand chose sur internet


Le code succin

Code : Tout sélectionner

Local $valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource), Default, Default, 3)
Dans le fichier pointé par $cheminsource, il y a des valeurs vides, des valeurs issues d'une liste dispo sur un autre fichier xls (grâce au mécanisme du gestionnaire de noms, mais ça ne pause pas problème si je laisse par défaut), des données en texte, en date en nombre, des nombre en texte (pour ne pas perdre de 0 quand on saisit "01" par exemple)

J'espère que ce n'est pas le fonction qui a un soucis :( mais je voit pas ou j'ai pu me planter, y a qu'une ligne de code :lol: .


Merci de votre aide, ou à défaut si la fonction est KO, de m'aider à trouver une alternative.
Je pourrai éventuellement parcourir le tableau pour trouver toutes les cellules qui ressemblent à une date, et les transcoder comme le je veux (AAAAMMJJDDMM --> JJ/MM/AAAA), ou encore enregistrer le fichier en CSV (j'obtiens bien le bon texte pour une date lorsque je sauvegarde en CSV à la main) mais ce n'est pas génial, surtout qu'une option existe pour faire exactement ce que je veux.

EDIT : Je viens de tester avec un fichier CSV, édité avec Notepad++ (donc pas excel). J'ai entré à la main 01/01/2014 et il en est ressorti 20140101000000 avec _Excel_RangeRead sur le fichier CSV. Je pige plus là ... vais devoir ne plus utiliser _Excel_RangeRead mais faire un split avec un bête FileReadLine

PS : J'ai aussi un autre petit soucis au même endroit :

Code : Tout sélectionner

   Local $valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource), Default, Default, 3) ; Ouvre le fichier excel et charge les données sous la forme d'un tableau

   If @error Then
      MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_BookOpen Example 1", "Error opening '" & $cheminsource & @CRLF & "@error = " & @error & ", @extended = " & @extended)
      Return - 1
   EndIf
Je passe dans le If car @error = 5 (si je l'affiche avant le teste par exemple) mais dans le MsgBox, les 2 @error et @extended ont été réinitialisée à 0 ! C'est pourtant le code donné en exemple, il ne devrait pas y avoir de soucis ... sauf si ça pause problème de regrouper le traitement en une ligne ?
Modifié en dernier par Clampu le lun. 06 oct. 2014 17:55, modifié 1 fois.
Clampu
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mer. 16 mai 2012 22:08
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#2

Message par Clampu »

J'ai essayé de contourner le problème en enregistrant le fichier en CSV (comme indiqué en piste au précédent message). Cela fonctionne. Le hic, c'est que je n'arrive pas à fermer le CSV créé (à partir du SaveAs).

J'utilise ceci :

Code : Tout sélectionner

_Excel_BookSaveAs($source_xls, @TempDir & "\AutoItTEMP.csv", $xlCSV, True)
Si j'effectue un _Excel_BookClose après, cela ne fonctionne pas. J'ai l'impression qu'avoir enregistré le fichier à un autre endroit à un autre format fait que le Workbook object ne pointe plus vers l'instance d'Excel.

Une piste :
Un nouveau _Excel_BookOpen sur le CSV fraichement enregistré fonctionne, mais étant donné que ce CSV (que je souhaite fermé) est déjà ouvert, il me dit "AutoItTEMP.csv est déjà ouvert. Si vous l'ouvrez à nouveau, toutes vos modif serons perdues. Voulez-vous réouvrir AutoItTEMP.csv ?". Si je met Oui (ou Non) ça fonctionne bien, mais je ne peux pas le faire par le script, car je suis encore à l'intérieur de la fonction _Excel_BookOpen ! On pourrait lancer un nouveau thread pour faire un simple Send("{ENTER}"), mais c'est un peu utiliser un bazooka pour abattre une mouche (testé, ça fonctionne avec Run()).
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#3

Message par orax »

Serait-il possible d'avoir un exemple du fichier Excel xls posant problème (en pièce jointe) pour pouvoir tester plus facilement ?
Quelle version d'Excel est utilisée ?
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Clampu
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mer. 16 mai 2012 22:08
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#4

Message par Clampu »

Voilà un fichier, j'ai essayé avec d'autres ça fait la même chose. Pour l'instant, j'ai contourné le soucis en enregistrant en CSV avant de le lire, mais c'est dommage pour _Excel_RangeRead
Fichiers joints
ModèleSpec_Acte_RC.xls
(24.5 Kio) Téléchargé 46 fois
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#5

Message par jchd »

Je n'ai pas Office ici mais je ne pense pas qu'il y ait de possibilité pour la fonction de renvoyer autre chose qu'une date/heure sous cette forme.

Excel stocke ce qu'il considère comme des valeurs date/heures sous un format interne similaire à ce que tu obtiens.

_Excel_RangeRead utilise $vRange.Value ou $vRange.Value2 qui sont des méthodes fournies par Excel. Par ailleurs, AutoIt ne dispose pas de type date/heure.

Du fait de l'extrême diversité des formats d'affichage utilisés ou souhaités par les usagers du monde entier, quel format choisir ? Excel aurait pu choisir le format par défaut impliqué par les options de localisation, mais apparemment il n'en fait rien.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#6

Message par orax »

J'ai aussi une erreur 5 quand je laisse Default pour le paramètre vRange. Mais en spécifiant quelles cellules je veux récupérer ça fonctionne, je récupère ce qui est affiché à l'écran sur Excel.

Code : Tout sélectionner

$valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource), Default, 'A1:A1', 3)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Clampu
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mer. 16 mai 2012 22:08
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#7

Message par Clampu »

jchd a écrit :Je n'ai pas Office ici mais je ne pense pas qu'il y ait de possibilité pour la fonction de renvoyer autre chose qu'une date/heure sous cette forme.

Excel stocke ce qu'il considère comme des valeurs date/heures sous un format interne similaire à ce que tu obtiens.

_Excel_RangeRead utilise $vRange.Value ou $vRange.Value2 qui sont des méthodes fournies par Excel. Par ailleurs, AutoIt ne dispose pas de type date/heure.

Du fait de l'extrême diversité des formats d'affichage utilisés ou souhaités par les usagers du monde entier, quel format choisir ? Excel aurait pu choisir le format par défaut impliqué par les options de localisation, mais apparemment il n'en fait rien.
Oui tu as raison. J'ai voulu justement forcé ce format (qui peut prendre plusieurs formes) en indiquant vouloir celui affiché. Merci pour l'info à propos de $vRange.Value

orax a écrit :J'ai aussi une erreur 5 quand je laisse Default pour le paramètre vRange. Mais en spécifiant quelles cellules je veux récupérer ça fonctionne, je récupère ce qui est affiché à l'écran sur Excel.

Code : Tout sélectionner

$valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource), Default, 'A1:A1', 3)
Oui ça fonctionne pour une cellule seule. Mais pas pour plusieurs. Si tu remplaces 'A1:A1' par 'A1:A2', ça ne fonctionne plus (tout comme Default qui doit être quelque-chose du genre 'A1:IV65536' pour 2003 et encore plus pour 2007). En tous cas merci, je peux m'en sortir avec ça.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#8

Message par jchd »

Je recommande souvent l'utilisation de Juliandate, un flottant qui n'est pas ambigü, peut descendre à une grande précision, est portable sur différentes plates-formes et conventions locales et enfin prend peu de place.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#9

Message par orax »

Si ça ne fonctionne pas sur plusieurs cellules c'est parce qu'il renvoie une collection de Range.
Voilà un code de démo pour afficher les valeurs ou les mettre dans un tableau.
► Afficher le texte
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Clampu
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mer. 16 mai 2012 22:08
Status : Hors ligne

Re: [..] _Excel_RangeRead Options non par défaut

#10

Message par Clampu »

jchd a écrit :Je recommande souvent l'utilisation de Juliandate, un flottant qui n'est pas ambigü, peut descendre à une grande précision, est portable sur différentes plates-formes et conventions locales et enfin prend peu de place.
Un Juliandate ou ? Dans Excel ? Si oui
Clampu a écrit :N'étant pas maitre des fichiers en entrée ($cheminsource), ...
Si non, peux tu préciser ta pensée stp ?


orax a écrit :Si ça ne fonctionne pas sur plusieurs cellules c'est parce qu'il renvoie une collection de Range.
Voilà un code de démo pour afficher les valeurs ou les mettre dans un tableau.
► Afficher le texte
J'ai un peu de mal à coder avec du VBA inclus dans de l'autoit (si c'est bien ça : $workbook.ActiveSheet par exemple), puisque je ne connais pas le VBA et que l'auto-complétion n'est pas de la partie. Quoi qu'il en soit, cela fonctionne aussi avec
$valeursXlsxLue = _Excel_RangeRead(_Excel_BookOpen(_Excel_Open(), $cheminsource), Default, $cel_un & ':' & $cel_deux, 3)
en bouclant sur $cel_un et $cel_deux comme tu le fais. Merci pour vos réponse à tous, je peux mettre en résolu je pense. Dommage pour le "range" que cela ne fonctionne pas
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2273
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] _Excel_RangeRead Options non par défaut

#11

Message par jchd »

Un Juliandate ou ?
Comme ça :

Code : Tout sélectionner

; gregorian dates before "1582-10-15 00:00:00" produce invalid results
Func _Date_Time_IsoToJulian($sIsoDate = _NowCalc())
    Local $aVal = StringRegExp($sIsoDate, "(?i)(\d\d\d\d)[-/](\d\d)[-/](\d\d)[ T](\d\d):(\d\d):(\d\d(?:\.\d+)?)", 1) ; strictly this ISO format
    If $aVal[1] < 3 Then
        $aVal[0] -= 1
        $aVal[1] += 12
    EndIf
    Local $s = Floor($aVal[0] / 100)
    Local $b = 2 - $s + Floor($s / 4)
    Local $jd = Floor(365.25 * ($aVal[0] + 4716)) + Floor(30.6001 * ($aVal[1] + 1)) + $aVal[2] + $b - 1524
    Return $jd + ($aVal[3] - 12) / 24 + $aVal[4] / 1440 + $aVal[5] / 86400
EndFunc   ;==>_Date_Time_IsoToJulian

; julian dates before 2299160.5 (i.e. "1582-10-15 00:00:00") produce invalid results
Func _Date_Time_JulianToIso($jd)
    $jd += 0.5
    Local $J = Floor($jd)
    Local $t
    If $J < 2299161 Then
        $t = $J
    Else
        Local $a = Floor(($J - 1867216.25) / 36524.25)
        $t = $J + 1 + $a - Floor($a / 4)
    EndIf
    Local $b = $t + 1524
    Local $c = Floor(($b - 122.1) / 365.25)
    Local $d = Floor(365.25 * $c)
    Local $e = Floor(($b - $d) / 30.6001)
    Local $DD = $b - $d - Floor(30.6001 * $e)
    Local $MM = ($e < 14) ? $e - 1 : $e - 13
    Local $YY = $c - (($MM > 2) ? 4716 : 4715)
    Local $s = ($jd - $J) * 86400
    Local $H = Floor($s / 3600)
    Local $m = Mod(Floor($s / 60), 60)
    $s -= $s / 60
    Return (StringFormat("%04i-%02i-%02i %02i:%02i:%09.6f", $YY, $MM, $DD, $H, $m, $s))
EndFunc   ;==>_Date_Time_JulianToIso
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre