[R] Excel - Copier jusqu'à une cellule vide

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Shenazen
Niveau 2
Niveau 2
Messages : 18
Enregistré le : jeu. 19 oct. 2017 11:45
Status : Hors ligne

[R] Excel - Copier jusqu'à une cellule vide

#1

Message par Shenazen »

Bonjour à vous,

Et oui, c'est encore moi, je suis revenu depuis la semaine dernière. Alors je vous écris cette fois car malgré mes recherches non fructueuses, je n'arrive pas à faire sur Excel une copie des données jusqu'à une cellule vide. Je m'explique :

Copier une cellule, aller la coller sur un autre fichier. Revenir sur Excel, copier la cellule juste en dessous, la coller à nouveau sur cet autre fichier. Etc...

Jusque là, tout vas bien, je m'en sors à merveille. Par contre je souhaiterai, que dès lors que celui-ci tombe sur une cellule vide, qu'il arrête le script. Et ça je n'arrive pas à le faire et je n'ai rien trouvé pouvant m'aider malgré des tonnes de tentatives en vain.

Voici un bout de mon code :

Code : Tout sélectionner

While 1
	If $copycell = "" Then
		$fin = True
	Else
		WinActivate ("Copie de Compte supprimés pour essai.xls  [Mode de compatibilité] - Excel")
		$copycell = $oExcel.Activesheet.Cells($ligne , $colonne).Copy
		Sleep (1000)
			ETC...
Donc, quand il arrive à la boucle, si la cellule est vide, il arrête le script. Sinon il va faire la suite. Donc c'est ce que je dois mettre dans le If que je n'arrive pas à trouver ni comprendre.

Merci d'avance pour votre aide.


Edit : Désolé, j'ai oublié de préciser que c'est sur AutoIt, même si ça paraît logique.

Cordialement.
Modifié en dernier par Shenazen le ven. 27 oct. 2017 09:18, modifié 1 fois.
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 - Copier jusqu'à une cellule vide

#2

Message par walkson »

Bonjour,
Peut être comme cela ?
Je suppose que les données sont dans la colonne A que je sélectionne (A1: A fin)
#include <Excel.au3>
$oXl = _Excel_Open(True)  
$oXX = _Excel_BookOpen($oXl,  @ScriptDir & "\Test.xlsx")
$xlDown = -4121
$fin = $oXX.ActiveSheet.Cells(1,1)
$oRange = $oXX.ActiveSheet.Range("A1", $fin.End($xlDown)).Address
MsgBox(0,"",$oRange)
_Excel_RangeCopyPaste($oXX.ActiveSheet, $oRange, "D1")
Ici je colle en D1 mais vous pouvez coller sur Excel_Book externe (voir exemple 2 _Excel_RangeCopyPaste() )
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Shenazen
Niveau 2
Niveau 2
Messages : 18
Enregistré le : jeu. 19 oct. 2017 11:45
Status : Hors ligne

Re: Excel - Copier jusqu'à une cellule vide

#3

Message par Shenazen »

Bien le bonjour,

Mmmmmh... Ca ressemble à ce dont j'ai besoin, mais je n'arrive pas à le faire fonctionner correctement. En faites ce que je recherche :

Code : Tout sélectionner

#include <Excel.au3>

Global $verifFin
Global $fin=false

;Activer le fichier Excel des comptes supprimés
$oExcel = ShellExecute ("Copie de Compte supprimés pour essai.xls", "La destination du fichier.xls")
WinActivate ($oExcel)
Sleep (2500)
	_imgagrandirexcel() ;Agrandir la page Excel
$colonne = 2
$ligne = 2
Local $oExcel = ObjGet("C:\Users\I15276\Desktop\Test Alexandre\Projet Robot\Copie de Compte supprimés pour essai.xls")


;--------------------------------------------------------------------------------------------------------
;----------------------------------- MAINTENANT LE CORPS DU CODE -----------------------------
;--------------------------------------------------------------------------------------------------------

While 1
	WinActivate ("Copie de Compte supprimés pour essai.xls  [Mode de compatibilité] - Excel")
	$copycell = $oExcel.Activesheet.Cells($ligne , $colonne).Copy
	;$Cellvide = _Excel_RangeRead ($oExcel, Default, Default)
	$verifFin = ClipGet()
	_verificationFin()

		If($verifFin="") Then
			$fin=True
		Else
			Sleep (1000)
			; Maintenant on peut aller le mettre dans les références client dans CLOE
			WinActivate ("CLOE")
				_imgagrandirie() ; Agrandie la page IE (Ne se fera qu'au premier tour de la boucle)
			Sleep (500)
				_imgcomptes() ; Clic sur "Comptes"
				_imgcomptesactif() ; Clic sur "Comptes" si celui-ci est déjà actif
			Sleep (3000)
				_imgrefcompte() ; Sélectionne la case où coller le référence de compte
			Send ("^v")
				_imgrechercher() ; Clic sur "Rechercher"
			Sleep (5000)


			;ICI VIENDRA SE RAJOUTER LA SUITE DU CODE QUI, POUR L'INSTANT, N'EST PAS OPERATIONNEL


			$ligne = $ligne + 1
		EndIf
Wend
Voilà une bonne partie de mon code, ce que je veux en faites, c'est que sur des données que j'ai en colonne B (Comme je vais vous le montrer sur l'image après), si il y a une référence (du contenu) alors il copie la référence (PARTIE ELSE). Sauf qu'avant dans la partie IF, il faudrait vérifier si il y a des données. Si ce n'est pas le cas, il faudrait que le script s'arrête. Sachant qu'on ne peut jamais prévoir combien de ligne il y aura à traiter. Parfois 2, parfois 100... C'est variable le nombre de ligne.
001.png
001.png (5.95 Kio) Vu 3331 fois
lpau63
Niveau 1
Niveau 1
Messages : 10
Enregistré le : jeu. 23 mars 2017 15:44
Status : Hors ligne

Re: Excel - Copier jusqu'à une cellule vide

#4

Message par lpau63 »

hello,
pourquoi ne pas utiliser la fonction _ExcelReadSheetToArray ?
et ensuite traiter chaque lignes de ton tableau

un bout de code a tester pour ton projet
#include <array.au3>
#include <Excel.au3>


local $sFilePath = "c:\temp\Cptes.xls"
Local $oExcel = _ExcelBookOpen($sFilePath,0,true) ; non visible + en lecture seul
local $Comptes = _ExcelReadSheetToArray($oExcel,2,2,0,1,"Liste des comptes") ;chargement de la colonne 2 a partir de la ligne 2
_ExcelBookClose($oExcel , 0)

For $i = 1 To ($Comptes[0][0])
      ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Comptes[1][' & $i & '] = ' & $Comptes[$i][0] & @crlf) ;### Debug Console
Next

_ArrayDisplay($Comptes)

Exit
Shenazen
Niveau 2
Niveau 2
Messages : 18
Enregistré le : jeu. 19 oct. 2017 11:45
Status : Hors ligne

Re: Excel - Copier jusqu'à une cellule vide

#5

Message par Shenazen »

Je te remercie pour ta réponse, malheureusement ça ne marche pas et suite à ça, j'ai le code qui ne fonctionne plus à cause d'une erreur qu'il me trouve sur Array.au3. J'ai beau avoir enlevé ton code, enlevé l'include, vérifié qu'aucune fonction n'appelle Array mais ça me ramène toujours sur cette erreur. Donc je vais trouver pour ce soucis de Array, mais du coup, je ne sais toujours pas comment faire en sorte qu'Excel détecte si il y a du contenu à copier et qu'il le copie, et que si il n'y a pas de contenu qu'il s'arrête ;)
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 - Copier jusqu'à une cellule vide

#6

Message par walkson »

Bonjour,
Je ne vois pas l’intérêt de passer par un array
Concernant votre code, je suis très étonné la manière d'ouvrir Excel. Si vous utilisez #include <Excel.au3> alors utilisez les fonctions de l'UDF qui sont plus simples avec une bonne gestion des erreurs ! (WinActivate ($oExcel) devient inutile !!!)
De même, si vous utilisez une boucle, il faudra penser un jour d'en sortir (Exit ou ExitLoop) :P Est elle indispensable pour le fonctionnement de votre code ?
Concernant votre question,
$xlDown = -4121
$fin = $oXX.ActiveSheet.Cells(1,1)
$oRange = $oXX.ActiveSheet.Range("A1", $fin.End($xlDown)).Address
ceci sélectionne dans la colonne A toutes les données jusqu'à la première cellule vide donc inutile de chercher une cellule vide. Et si la cellule A11 est vide et que les données reprennent à la suite (A12:A51233), seul, sera sélectionné A1:A10. (équivalent au raccourci CTRL + Schift + flèche vers le bas)
Pour sélectionner dans la colonne B avec entête, on a
#include <Excel.au3>
$oXl = _Excel_Open(True)  
$oXX = _Excel_BookOpen($oXl,  @ScriptDir & "\Test.xlsx")
$xlDown = -4121
$fin = $oXX.ActiveSheet.Cells(2,2) ;correspond à B2
$oRange = $oXX.ActiveSheet.Range("B2", $fin.End($xlDown)).Address
MsgBox(0,"",$oRange)
_Excel_RangeCopyPaste($oXX.ActiveSheet, $oRange, "D1")
Si on voulait sélectionner 2 colonnes (B et C) $fin = $oXX.ActiveSheet.Cells(2,3)
En espérant vous avoir porté une aide
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
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 - Copier jusqu'à une cellule vide  

#7

Message par walkson »

sinon un petit exemple avec une boucle
le seul intérêt, à mon avis, est de contrôler les données dans chaque cellule
#include <Excel.au3>
$oXl = _Excel_Open()
$oXX = _Excel_BookNew($oXl,  1)

For $i = 1 to 500 ;écriture des données pour l'exemple
   $oXX.ActiveSheet.Cells($i,2).Value = @SEC &"-"& @MSEC &"-"& ChrW($i)
Next

$oXXnew = _Excel_BookNew ($oXl,1) ; pour la copie
Local $cell = 1

While 1
   $lire = $oXX.ActiveSheet.Cells($cell,2).Value

      $oXXnew.ActiveSheet.Cells($cell,1).Value = $lire ;écrire

   $cell += 1
   If $lire = "" Then ExitLoop
WEnd
 
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Shenazen
Niveau 2
Niveau 2
Messages : 18
Enregistré le : jeu. 19 oct. 2017 11:45
Status : Hors ligne

Re: Excel - Copier jusqu'à une cellule vide

#8

Message par Shenazen »

Yes, ça y est, ça fonctionne. Ton code était ce qu'il me fallait Walkson. Je l'ai adapté à mon code et ça fonctionne, c'est parfait. Voici comment je l'ai adapté :

Code : Tout sélectionner

#include <Excel.au3>


$ligne = 2
Local $oExcel = ObjGet("C:\Users\I15276\Desktop\Test Alexandre\Projet Robot\Creer Demande\Copie de Compte supprimés pour essai.xls")

While 1

	$lire = $oExcel.ActiveSheet.Cells($ligne,2).Value

	If $lire = "" Then
		ExitLoop
	Else
		$copycell = $oExcel.Activesheet.Cells($ligne, 2).Copy
		Sleep(1000)
		
		; Après il y a la suite du code
Merci Walkson, grâce à ça, il me prends les valeurs de la colonne B, à partir de la deuxième ligne, et il me copie la valeur dans le fichier qui est prévu, ensuite il revient sur Excel, et me prends la valeur suivant de la colonne B et ainsi de suite jusqu'à ce qu'il tombe sur une cellule vide. C'est exactement que je voulais ;) Je vais donc mettre un [R] et merci beaucoup Walkson !!! Merci quand même aussi à ceux qui ont essayé de me trouver une solution, je reviendrai très rapidement, ce dans la journée je pense, car j'ai encore un autre soucis que je n'arrive pas à faire et que je cherche depuis pas mal de temps, donc on se retrouve dans un prochain topic ;)

Merci à tous ;)
Répondre