[R] vlookup - recherchev - lire excel sans ouvrir

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

[R] vlookup - recherchev - lire excel sans ouvrir

#1

Message par JulienBoul »

Bonjour,

Je précise que j'ai effectué des recherches sur le forum car je suis plus que surpris de n'avoir rien trouvé ici à ce sujet (Au risque de passer non pas pour un imbécile, mais pour un aveugle du coup ^^).

Je cherche a effectuer une rechercheV dans un fichier excel lorsqu'il est fermé.
En gros, j'ai une variable dans autoit. Cette variable, je veux la chercher (dans Excel) dans colonne A, et afficher (dans Autoit) la valeur de la colonne B (située dans Excel).

Merci aux pères Noël :)
Julien.

Edit 1: voici l'url du forum ou j'ai trouvé le bout de code, il reste maintenant à l'adapter à mon usage.
https://www.autoitscript.com/forum/topi ... 3-vlookup/
Edit 2: J'ai réussi entre temps à mettre à jour le script qui datait de 2009 donc plus besoin d'aide pour ça, voyez plutot:

#Include <Excel.au3>
$sFilePath1 = "C:\Users\XXX\Desktop\lookup.csv"
$oExcel = _Excel_BookOpen(_Excel_Open(),$sFilePath1)
#Include <Array.au3>
$aArray = _Excel_RangeRead($oExcel) ;Using Default Parameters
_Excel_BookClose($oExcel) ; And finally we close out
_ArrayDisplay($aArray, "Array using Default Parameters")
#include <Array.au3>
$sSearch = "Ref2"
If @error Then Exit
$iIndex = _ArraySearch($aArray, $sSearch, 0, 0, 0, 1)
If @error Then
    MsgBox(0, "Not Found", '"' & $sSearch & '" was not found in the array.')
Else
    MsgBox(0, "Found", '"' & $sSearch & '" was found in the array at position ' & $iIndex & ".")
EndIf
Modifié en dernier par JulienBoul le jeu. 15 déc. 2016 15:50, modifié 1 fois.
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: [..] vlookup - recherchev - lire excel sans ouvrir

#2

Message par Benso »

Pour rechercher dans ton fichier excel sans l'ouvrir rajoute le paramètre 0 :
$oExcel = _ExcelBookOpen($sFilePath, $fVisible = 1, $fReadOnly = False, $sPassword = "", $sWritePassword = "")
$fVisible
(0=pas visible, 1=visible) (defaut=1)
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] vlookup - recherchev - lire excel sans ouvrir

#3

Message par Hugues »

Salut,

Si c'est un fichier CSV essaye ça pour mettre le contenu de ton fichier CSV dans un tableau, ensuite tu pourras faire la recherche que tu désires.
#include <Array.au3>
#include <File.au3>

Global $aArray

_ReadCSVFileWith_CSV2Array()

Func _ReadCSVFileWith_CSV2Array()
   $aArray = _CSV2Array(@ScriptDir & "\MonFichierCSV.csv")
   _ArrayDisplay($aArray, "_CSV2Array")
EndFunc   ;==>_ReadCSVFile

; #FUNCTION# ===================================================================
; Name ..........: _CSV2Array
; Description ...:
; AutoIt Version : V3.3.0.0
; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True[, $iColumnMode = 0]]])
; Parameter(s): .: $hFile       - Handle for the CSV file to Read
;                  $cSeperator  - Optional: (Default = "auto") : Tries to find the separator char (; or , or TAB or | or space)
;                               | Data-seperator-char
;                               | Empty-string = Opt("GUIDataSeparatorChar")
;                  $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
;                  $iColumnMode - Optional: (Default = 0) :
;                               | 0: Sets error if lines have different columns and @extended to the csv-line number
;                               | 1: returns lines with different columns numbers comparing to the first line, too
;                               | 2: removing all columns > column numbers in the first line
; Return Value ..: Success      - 2-dim Array
;                  Failure      - 0
;                  @ERROR       - 1: error file read
;                  @ERROR       - 2: different number of columns / @EXTENDED = CSV-line
;                               - 3: parameter error
; Author(s) .....: Thorsten Willert
; Date ..........: Mon Dec 07 18:59:46 CET 2009
; ==============================================================================
Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)

    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")

    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
        $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
        $aLines = StringSplit($s, @CR)
    Else
        $aLines = StringSplit($s, @LF)
    EndIf

    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
        Local $iMax = 0
        Local $iC[5] = [0, 0, 0, 0, 0]
        Local $sC[5] = [";", ",", @TAB, "|", " "]

        $aTMP = StringRegExp($aLines[1], ";", 3)
        If Not @error Then $iC[0] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], ",", 3)
        If Not @error Then $iC[1] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\t", 3)
        If Not @error Then $iC[2] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\|", 3)
        If Not @error Then $iC[3] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "[ ]", 3)
        If Not @error Then $iC[4] = UBound($aTMP)

        For $i = 0 To UBound($sC) - 1
            If $iC[$i] > $iMax Then
                $iMax = $iC[$i]
                $cSeperator = $sC[$i]
            EndIf
        Next
    EndIf

    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]

    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
        $aTMP = StringSplit($aLines[$i], $cSeperator)
        If @error Then ContinueLoop
        If $aTMP[0] > $iCol Then
            Switch $iColumnMode
                Case 0
                    Return SetError(2, $i)
                Case 1
                    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
                Case 2
                    $aTMP[0] = $iCol
                Case Else
                    Return SetError(3)
            EndSwitch
        EndIf
        For $j = 1 To $aTMP[0]
            $aTMP[$j] = StringStripWS($aTMP[$j], 3)

            ; removing leading and trailing " or '
            If $bFilterString Then $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')

            $aRet[$i ][$j - 1] = $aTMP[$j]
        Next ; /cols
    Next ; /lines

    Return $aRet
EndFunc   ;==>_CSV2Array
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

Re: [..] vlookup - recherchev - lire excel sans ouvrir

#4

Message par JulienBoul »

@Benso

Merci pour ces conseils, j'ai pu tester un peu ce matin, et la différence n'est pas l'ouverture d'excel (qui s'ouvre toujours) mais bien l'affichage de la feuille que tu peux afficher ou non.
En soit, ces nuances importent peu dans mon script.
De plus, il semblerai que _ExcelBookOpen soit l'ancien UDF, il faut comprendre _Excel_BookOpen, tu me corrigeras si je me trompe.
Les paramètres $fVisible = 1 et $fReadOnly = False sont inversés dans le nouvel UDF d'après le wiki.

Non, ce que je cherche, c'est en réalité c'est d'écrire ma fonction Vlookup dans autoit de la même façon que je l'écrirai dans Excel suivant le modèle:
=RECHERCHEV(recherche; tableau; colonne; type)



@Hugues

Merci d'avoir pris le temps de me répondre et de ta proposition.

J'avais pensé à utiliser CSV2Array mais les tableaux Excel que je suis amené à manipuler peuvent atteindre 1M de lignes (pour le moment 800 000 mais je vois la situation au pire). Ainsi, j'ai peur de saturer la mémoire vive de données importantes, surtout si mon tableur fait plusieurs colonnes... Qu'en penses tu?


N'existe-t-il vraiement pas de possibilité d'effectuer cette rechercheV même via un VBA? J'ai cru lire que qu'Autoit pouvait manier plusieurs langages, lancer du batch, gérer du html, peut il gérer du VBA? Est ce une piste qu'il convient d'exploiter?


@+, Julien.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] vlookup - recherchev - lire excel sans ouvrir

#5

Message par Hugues »

1M de lignes... :shock: Tu stockes des données pour la NASA lol? Ton fichier CSV ne se corrompt pas avec tant de données lol?

J'ai trouvé ça sur le Net, pas sur que ça foctionne...
Global Const $dataBaseFilePath = "..."

$oExcel = ObjCreate( "Excel.Application" )

With $oExcel
    .Visible = 0
    .WorkBooks.Open( $dataBaseFilePath )
EndWith

;Documentation of the VLOOKUP function: http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx?CTT=5&origin=HP005204211
;Note: the lookup value must be valid, otherwise the script will not execute
$value = $oExcel.Application.WorksheetFunction.VLOOKUP( "keyValue", $oExcel.Range("A1:B250"), 2, FALSE )

ConsoleWrite( $value & @CRLF)

$oExcel.Quit
Pas facile à dire... Tu pourrais stocker le contenu de ton fichier CSV dans une base SQL temporaire pour faire tes requêtes, mais ça te fait une opération supplémentaire..
JulienBoul
Niveau 4
Niveau 4
Messages : 82
Enregistré le : ven. 04 déc. 2015 13:55
Status : Hors ligne

Re: [..] vlookup - recherchev - lire excel sans ouvrir

#6

Message par JulienBoul »

Hello Hugues,

Non, je travaille pour le père nöel, ce sont les coordonnées des enfants à livrer, la galère...

Ton script fonctionne à la perfection, voici la structure de mon csv suivi de mon script pour ceux que ça intéressera à l'avenir.

Merci, je laise un post-it au patron pour ajouter ton adresse, joyeux Nöel en avance !

Structure du fichier csv: (espace = changement de colonne, soit tableau de 9 lignes 3 colonnes)
ref1 ZZA A
ref2 ZZB b
ref3 ZZc c
ref4 ZZD D
ref5 ZZE E
ref6 ZZF F
ref7 ZZG G
ref8 ZZH H
ref9 ZZI I
Code complet:
Global Const $dataBaseFilePath = "ICI INSCRIRE LE CHEMIN D'ACCES DU CSV"

$oExcel = ObjCreate( "Excel.Application" )

With $oExcel
    .Visible = 0
    .WorkBooks.Open( $dataBaseFilePath )
EndWith

;Documentation of the VLOOKUP function: <!-- m --><a class=\"postlink\" href=\"http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx?CTT=5&origin=HP005204211\">http://office.microsoft.com/en-us/excel ... P005204211</a><!-- m -->
;Note: the lookup value must be valid, otherwise the script will not execute
$value = $oExcel.Application.WorksheetFunction.VLOOKUP( "Ref6", $oExcel.Range("A1:C250"), 2, FALSE ) ; Ref6 est la valeur recherchée///Range est la zone ou la fonction recherchev est exécutée///2 correspond à l'affichage de la valeur colonne B (1=A et 3=C)

msgbox("","",$value)
$oExcel.Quit
Répondre