Excel - récupérer la cellule suivante

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
devauto
Niveau 1
Niveau 1
Messages : 5
Enregistré le : mer. 17 févr. 2016 10:36
Status : Hors ligne

Excel - récupérer la cellule suivante

#1

Message 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 ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#2

Message 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/
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
devauto
Niveau 1
Niveau 1
Messages : 5
Enregistré le : mer. 17 févr. 2016 10:36
Status : Hors ligne

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

#3

Message 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 ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#4

Message 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")

Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
devauto
Niveau 1
Niveau 1
Messages : 5
Enregistré le : mer. 17 févr. 2016 10:36
Status : Hors ligne

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

#5

Message par devauto »

Merci pour ces précisions.
Ce bout de code qui va bien m'aider :)
Répondre