Page 1 sur 1

Commande(s) EXCEL  

Posté : mer. 05 juil. 2017 00:04
par Yle
Bonjour,

Voici qq lignes de programme
#include-once
#include <Excel.au3>
#Include <String.au3>
#include <Date.au3>
Global $DateJour = @YEAR & @MON & @MDAY, $Jour, $Tab[100][7]

$oXL = _Excel_BookOpen(@ScriptDir & "\Calendrier.xls",False,False)
If @error = 2 Then
    MsgBox(0, "Erreur n° 3", "Le fichier \Calendrier.xls n'existe pas" )
    Exit
EndIf

$NL=6    ; on saute les 5 premieres lignes
$i=-1
; $oXl.ActiveSheet.Range("A1").Value = "AAAAbbAA"
Local $Cell1 = _Excel_RangeRead($oXl, Default, "A6")
Local $Cell2 = _Excel_RangeRead($oXl, Default, "B6")
MsgBox(0,"Verif",$Cell1 & "__" & $Cell2)

While _Excel_RangeRead($oXl, Default, "A" & $NL) <> "" And _Excel_RangeRead($oXl, Default, "B" & $NL) <> ""
   if _Excel_RangeRead($oXl, Default, "F" & $NL) >= $DateJour then         ; si date creation (col 6) sup à date jour, on remplit TABLEAU
      $i+=1
      $Tab[$i][0] = StringStripWS($oXl.ActiveSheet.Range("A" & $NL).value,3)
      $Tab[$i][1] = StringStripWS($oXl.ActiveSheet.Range("B" & $NL).value,3)
      $Tab[$i][2] = $oXl.ActiveSheet.Range("C" & $NL).value
      $Tab[$i][3] = $oXl.ActiveSheet.Range("D" & $NL).value
      $Tab[$i][4] = $oXl.ActiveSheet.Range("E" & $NL).value
      $Tab[$i][5] = $oXl.ActiveSheet.Range("F" & $NL).value
      $Tab[$i][6] = $oXl.ActiveSheet.Range("G" & $NL).value
   EndIf
   _Excel_RangeDelete($oXL.ActiveSheet,'"' & $NL & ":" &  $NL & '"', $xlShiftUp)    ; on supprime la ligne
   $NL+=1
WEnd
$NbConc = $i+1
redim $Tab[$NbConc][7]
_ArrayDisplay($Tab,$i+1)

;$oXL.DisplayAlerts = False            ; evite la question -fichier existe dejà ?
$oXL.ActiveWorkbook.Save($oXL)
_Excel_BookClose($oXL) ; Fermeture excel
Exit              ; A la fin, je dois avoir un TAB qui contient 3 lignes et un fichier qui n'a que l'entête (5 lignes)
Je lis un fichier EXCEL (Mis en PJ)
Première erreur : je n'arrive pas à lire les cellules A6 et B6 ?
Seconde erreur : Ma boucle While ne fonctionne pas
Je pense que mon souci vient de _Excel_RangeRead mais je ne comprends pas pourquoi...
A la fin, je dois avoir un $TAB qui doit contenir 3 lignes dont la date est supérieure à celle du jour et un fichier qui ne contient que les 5 lignes d'entête.
Un coup de main, SVP...Merci
Calendrier.xls
(35 Kio) Téléchargé 112 fois

Re: Commande(s) EXCEL

Posté : mer. 05 juil. 2017 20:54
par walkson
Bonjour,
Vous devriez regarder l'aide d'Excel car vous fonctionnez comme l'ancien UDF :wink:
#include <Excel.au3>
#Include <String.au3>
#include <Date.au3>
Global $DateJour = @YEAR & @MON & @MDAY, $Jour, $Tab[100][7]
$oXL = _Excel_Open()
$oBook = _Excel_BookOpen($oXL,@ScriptDir & "\Calendrier.xls")
If @error = 2 Then
    MsgBox(0, "Erreur n° 3", "Le fichier \Calendrier.xls n'existe pas" )
    Exit
EndIf

$NL=6           ; on saute les 5 premieres lignes
$i=-1
; $oXl.ActiveSheet.Range("A1").Value = "AAAAbbAA"
Local $Cell1 = _Excel_RangeRead($oBook, Default, "A6")
Local $Cell2 = _Excel_RangeRead($oBook, Default, "B6")
MsgBox(0,"Verif",$Cell1 & "__" & $Cell2)

While _Excel_RangeRead($oBook, Default, "A" & $NL) <> "" And _Excel_RangeRead($oBook, Default, "B" & $NL) <> ""
        if _Excel_RangeRead($oBook, Default, "F" & $NL) >= $DateJour then                 ; si date creation (col 6) sup à date jour, on remplit TABLEAU
                $i+=1
                $Tab[$i][0] = StringStripWS($oXL.ActiveSheet.Range("A" & $NL).value,3)
                $Tab[$i][1] = StringStripWS($oXL.ActiveSheet.Range("B" & $NL).value,3)
                $Tab[$i][2] = $oXL.ActiveSheet.Range("C" & $NL).value
                $Tab[$i][3] = $oXL.ActiveSheet.Range("D" & $NL).value
                $Tab[$i][4] = $oXL.ActiveSheet.Range("E" & $NL).value
                $Tab[$i][5] = $oXL.ActiveSheet.Range("F" & $NL).value
                $Tab[$i][6] = $oXL.ActiveSheet.Range("G" & $NL).value
        EndIf
        _Excel_RangeDelete($oXL.ActiveSheet,  "A" & $NL ,Default,1)           ; on supprime la ligne

      $NL+=1
WEnd
$NbConc = $i+1
redim $Tab[$NbConc][7]
_ArrayDisplay($Tab,$i+1)

;$oXL.DisplayAlerts = False                             ; evite la question -fichier existe dejà ?
$oXL.ActiveWorkbook.Save
_Excel_Close($oXL) ; Fermeture excel
Exit                                    ; A la fin, je dois avoir un TAB qui contient 3 lignes et un fichier qui n'a que l'entête (5 lignes)
J'ai réglé le problème du fonctionnement sans m'occuper de la logique (le code est lent !)

Re: Commande(s) EXCEL

Posté : mer. 05 juil. 2017 22:59
par Yle
Merci d'avoir pris en compte mon souci.
Visiblement je mélange $oXL et $oBook...

Mais quand je passe l'outil, je n'arrive pas à "OUVRIR" un fichier Calendrier qui ne contient que les 5 lignes d'entête. (Suis en Excel 2016+W10)
La commande $oXL.ActiveWorkbook.Save plante, remplacée par _Excel_BookSave ( $oBook ) mais fichier "verrouillé", je ne peux pas l'ouvrir
Si j'ajoute _Excel_BookSaveAs($oBook,@ScriptDir & "\Calendrierss.xls"), je n'arrive pas non plus à ouvrir le fichier même si je le crée en xlsx

Et effectivement le script est long. Avez vous une idée ?

Re: Commande(s) EXCEL

Posté : jeu. 06 juil. 2017 00:32
par walkson
peut être comme ça
#include <Excel.au3>
#Include <String.au3>
#include <Date.au3>
Local $oError = ObjEvent("AutoIt.Error", "__Excel_COMErrFunc");ça calme les erreurs parfois !
#forceref $oError
Global $DateJour = @YEAR & @MON & @MDAY
$oXL = _Excel_Open()
$oBook = _Excel_BookOpen($oXL,@ScriptDir & "\Calendrier.xls")
If @error = 2 Then
    MsgBox(0, "Erreur n° 3", "Le fichier \Calendrier.xls n'existe pas" )
    Exit
EndIf

Local $Cell1 = _Excel_RangeRead($oBook, Default, "A6")
Local $Cell2 = _Excel_RangeRead($oBook, Default, "B6")

;MsgBox(0,"Verif",$Cell1 & "__" & $Cell2)

$NBrows = $oXL.Range("A6").CurrentRegion.Rows.Count
$adD2 = $oXL.ActiveSheet.Range("A" & $NBrows).End(-4161).Address(False,False);vers droite en bas
$array = $oXL.ActiveSheet.Range("A6" , $adD2).Value ;Array
_ArrayTranspose($array)
;_ArrayDisplay($array)
Local $val, $Tarray[0][7]
For $i = 0 To UBound($array) - 1
   If $array[$i][5] >= $DateJour Then
      $val &= $array[$i][0] &"|"& $array[$i][1] &"|"& $array[$i][2] &"|"& $array[$i][3] &"|"& $array[$i][4] &"|"& _
      $array[$i][5] &"|"& $array[$i][6]
      _ArrayAdd($Tarray,$val)
   EndIf
$val = ""
Next
$oXL.ActiveSheet.Range("A6" , $adD2).Delete
_ArrayDisplay($Tarray)

$oXL.ActiveWorkbook.Save
_Excel_Close($oXL) ; Fermeture excel
Exit
Il semblerait que les erreurs soient dues à Autoit avec les versions > v3.3.12.0 (c'est un avis personnel)

Re: Commande(s) EXCEL

Posté : jeu. 06 juil. 2017 09:03
par Yle
Bonjour

Pas photo sur le temps d'exécution et c'est OK !

Je voulais attirer votre attention sur le fait que pour récupérer le code, j'ai cliqué sur "tout sélectionner" puis fait un CTRL-C
J'ai sauvegardé sur aqw.au3 et ensuite exécuté le code et j'ai eu ceci:

+> SciTEDir => d:\Program Files (x86)\AutoIt3\SciTE UserDir => d:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper SCITE_USERHOME => E:\AutoIt v3\SciTE
>Running AU3Check (3.3.14.2) from:d:\Program Files (x86)\AutoIt3 input:D:\AU3\aqw.au3
+>08:54:26 AU3Check ended.rc:0
>Running:(3.3.14.2):d:\Program Files (x86)\AutoIt3\autoit3_x64.exe "D:\AU3\aqw.au3"
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
D:\AU3\aqw.au3 (4) : ==> Unable to parse line.:
        Local $oError = ObjEvent("AutoIt.Error", "__Excel_COMErrFunc")
^ ERROR
->08:54:26 AutoIt3.exe ended.rc:1
+>08:54:26 AutoIt3Wrapper Finished.
>Exit code: 1 Time: 1.798


Pour remédier, j'ai cliqué sur la première ligne puis sur la dernière, CTRL-C , et ré exécuté le code et cette fois pas d'erreur....
Est ce le 'TOUT sélectionner' qui introduit des caractères parasites ?

Merci encore pour la solution.

Re: Commande(s) EXCEL

Posté : jeu. 06 juil. 2017 10:36
par orax
Dans le code source (HTML) de la page il y avait des     à la place de la tabulation. J'ai donc supprimé la tabulation. Je pense que ça devrait marcher maintenant.

Re: Commande(s) EXCEL

Posté : ven. 07 juil. 2017 09:15
par Yle
Bonjour,
Eh bien non, çà ne fonctionne pas après avoir fait : "tout sélectionner" et CTRL-C
Résultat, même erreur mais pas à la même ligne :

>"d:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "d:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "D:\AU3\TESTTT.au3" /UserParams
+>09:13:26 Starting AutoIt3Wrapper v.15.920.938.0 SciTE v.3.6.0.0 Keyboard:0000040C OS:WIN_10/ CPU:X64 OS:X64 Environment(Language:040C)
+> SciTEDir => d:\Program Files (x86)\AutoIt3\SciTE UserDir => d:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper SCITE_USERHOME => E:\AutoIt v3\SciTE
>Running AU3Check (3.3.14.2) from:d:\Program Files (x86)\AutoIt3 input:D:\AU3\TESTTT.au3
"D:\AU3\TESTTT.au3"(10,1) : error: missing EndIf. (illegal character)
 
^
"D:\AU3\TESTTT.au3"(9,19) : REF: missing EndIf.
If @error = 2 Then
~~~~~~~~~~~~~~~~~~^
D:\AU3\TESTTT.au3 - 1 error(s), 0 warning(s)
!>09:13:27 AU3Check ended. Press F4 to jump to next error.rc:2
+>09:13:27 AutoIt3Wrapper Finished.
>Exit code: 2 Time: 1.94