Page 1 sur 1

Excel - récupérer la cellule suivante

Posté : ven. 05 oct. 2018 22:05
par devauto
Bonjour,
J'utilise _Excel_RangeFind() pour trouver les cellules comprenant un "certain texte" et _Excel_RangeRead() pour afficher la valeur de la colonne suivante. Exemple : _Excel_RangeFind() trouve la cellule "A20" et _Excel_RangeRead() affiche la valeur contenu dans "B20"

   Local $oExcel = _Excel_Open()
   Local $oWorkbook = _Excel_BookOpen($oExcel, "file.csv", false)
   Local $aResult = _Excel_RangeFind($oWorkbook, "keyword")
   for $i=0 to ubound($aResult)-1
    MsgBox($MB_SYSTEMMODAL, "Excel",_Excel_RangeRead($oWorkbook, Default, StringReplace($aResult[$i][2], "A", "B")))
   Next

Ça marche comme ça de "A" vers "B" mais le StringReplace() n'est pas approprié... Lorsque $aResult va trouvé la cellule "D20" ça va récupérer "B20" alors qu'il me faudrait "E20".
Quel serait la syntaxe pour indiquer à _Excel_RangeRead() de récupérer la valeur de la colonne suivante ?

Re: Excel - récupérer la cellule suivante  

Posté : jeu. 11 oct. 2018 13:49
par walkson
Bonjour,

Code : Tout sélectionner

#include <Array.au3>
#include <Excel.au3>
Local $oExcel = _Excel_Open()
   Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\text.csv")
   Local $aResult = _Excel_RangeFind($oWorkbook, "test")
   _ArrayDisplay($aResult)
   for $i=0 to ubound($aResult)-1
	   $oRange = $aResult[$i][2]
	   MsgBox(0,"",$oRange & @CRLF & $oExcel.Range($oRange).Offset(0,1).Value)
   Next

Ne pas oublier de mettre à jour le chemin du fichier et la valeur recherchée

A titre d'info, pour ceux qui sont sous la version AutoIt 3.3.14.3, il y a quelques bugs sur l'UDF Excel. Voir https://www.autoitscript.com/forum/topi ... docsaveas/

Re: Excel - récupérer la cellule suivante

Posté : sam. 13 oct. 2018 16:05
par devauto
Merci c'est exactement ce que je cherchais :)

J'en déduis que ce n'est pas possible de faire un offset directement sur _Excel_RangeRead()
La fonction $oExcel.Range() est elle plus récente que _Excel_RangeRead() ?
Mieux vaut il lire une cellule avec l'une ou l'autre ?

Re: Excel - récupérer la cellule suivante

Posté : sam. 13 oct. 2018 19:08
par walkson
Bonjour,
$oExcel.Range($oRange).Offset(0,1).Value n'est pas une fonction, c'est la conversion de VBA en Autoit, une simple ligne de code.
Pour être une fonction, le code commence par Func functioname() avec ou sans arguments et finit par EndFunc
_Excel_RangeRead() est une fonction. Je vous invite à regarder l'include Excel.au3 (par Scite, Outils => open include en sélectionnant le nom de l'include) afin de voir les constructions des fonctions
Pour lire une cellule ou une plage de cellules, mieux vaut utiliser _Excel_RangeRead() mais pour une lecture décalée (Offset) il semblerait d'être obligé par ma ligne de code (artisanale). Les fonctions Excels sont très complètes mais ne répondent pas toujours à la demande, d'où l'obligation d'écrire le code à ses souhaits. A titre d'exemple

Code : Tout sélectionner

#include <Array.au3>
#include <Excel.au3>
;====================================================== création de CSV ===========================================================================
$open = FileOpen(@ScriptDir & "\CSV.csv", 2 + 8)
$text = "a;z;e;r;t;y;u;i;o;p" & @CRLF
$text1 = "a;z;e;r;test;Y;u;i;o;p" & @CRLF
$text2 = "test;Z;e;r;t;y;u;i;o;p" & @CRLF
For $i = 1 To 200
	FileWrite($open,$text)
	If $i = 100 Then FileWrite($open,$text1)
	If $i = 110 Then FileWrite($open,$text1)
	If $i = 113 Then FileWrite($open,$text2)
Next
FileClose($open)
;=============================================================================================================================================
Local $oExcel = _Excel_Open() ; = ObjCreate("", "Excel.Application")
   Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & "\CSV.csv")
   Local $aResult = _Excel_RangeFind($oWorkbook, "test")
   _ArrayDisplay($aResult)
   for $i=0 to ubound($aResult)-1
	   $oRange = $aResult[$i][2]
	   $oExcel.Range($oRange).Select
	   MsgBox(0,"valeur et adresse",$oRange & @CRLF & "Valeur offset " & $oExcel.Range($oRange).Offset(0,1).Value & @CRLF & "adresse offset " & $oExcel.Range($oRange).Offset(0,1).Address)
		$qq = $oExcel.Range($oRange).End(-4159).Address(False, False);cell à gauche xltoleft = -4159
		$ww = $oExcel.Range($qq, $oExcel.Range($qq).End(-4161)).Address(False, False);ligne vers droite xlToRight = -4161
		$oExcel.Range($ww).Interior.Color = 65535 ;colore la ligne cell gauche à cell droite en jaune
   Next
   MsgBox(0,"","Fin du code Exit")
   _Excel_Close($oExcel)
   FileDelete(@ScriptDir & "\CSV.csv")


Re: Excel - récupérer la cellule suivante

Posté : dim. 21 oct. 2018 23:33
par devauto
Merci pour ces précisions.
Ce bout de code qui va bien m'aider :)