Liste déroulante Avec Excel

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Liste déroulante Avec Excel

#1

Message par Benso »

Bonjour à tous !

J'aimerai depuis un fichier Excel réaliser une liste déroulante dans mon programme Autoit.

Mon fichier Excel se compose simplement de deux colonnes (noms et prénoms). Je précise qu'il peut y avoir plusieurs fois le même prénom.

Ce que je sais faire :
-Ouvrir le fichier via autoit:
Local $oExcel= _ExcelBookOpen(....)
-Lire une cellule Excel choisie :
Local $sReadCell = _ExcelReadCell(mon_fichier,"ma cellule")
-Faire une liste déroulante simple:
$MaListeDeroulante= GUICtrlCreateCombo("Premiere valeur", 500, 13,55,50)
-Alimenter la liste déroulante de manière simple :
GUICtrlSetData (-1,"1|2|3|4|5|6|7)
-Récupérer ce que choisi l'utilisateur dans liste via un bouton.

Maintenant ce que j'aimerai faire , c'est d'ouvrir le fichier excel et alimenter ma liste déroulante des prénoms. Et ne pas afficher deux fois le même prénom dans ma liste.
Ce que je pensais faire : Faire une boucle qui va lire toute la colonne des prénoms dans Excel un truc du genre :
$MonTableau[50]
for $i=0 To 50 Step 1
    $MonTableau[$i]= _ExcelReadCell($oExcel, "A"& $i) ; A étant la colonne des prénoms
Next
J'ai mis 50 car je ne vois pas comment faire pour deviner le nombre de prénoms dans mon fichier Excel ( peut être jusqu'à ce que la cellule soit vide ? )
Apres je ne vois pas comment y intégrer dans ma liste déroulante combo ni comment éviter les doublons.
En espérant avoir été le plus compréhensible possible. Merci de votre aide.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: Liste déroulante Avec Excel

#2

Message par Hugues »

Salut,
Pourquoi ne pas simplement mettre le nom et prénom de tes contacts dans un fichier texte (1 contact par ligne par exemple), ensuite tu lis ton fichier avec _FileReadToArray() (de mémoire, voir l'aide), ensuite tu alimente ta ComboBox avec une boucle.
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Liste déroulante Avec Excel

#3

Message par Benso »

Bonjour Hugues , En effet je n'y avais pas songé.

Du coup j'ai tout placé dans un fichier txt comme conseillé.
J'ai quelque chose du genre :

NOM Prenom Age
---------------------
DUPONT Florent 8
MARCEL Albert 12
XXXXXxxx AAAAAaaaa 36
.....
J'ai vus que pour lire ligne par ligne on utilise la fonction FileReadLine($file)
Mais comme vous le remarquez , mes noms et prénoms n'ont pas la même longueur de caractères. Du coup pour stocker mes noms dans un array comment procéder? De même si je veux isoler un age ou un prénom ? Je suppose qu'il s'agit de split mais je suis trop peu expérimenter pour concrétiser cette idée.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Liste déroulante Avec Excel

#4

Message par orax »

_FileReadToArray() devrait faire l'affaire.

édité : :oops: Je n'avais pas vu que Hugues avait déjà proposé _FileReadToArray.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Liste déroulante Avec Excel

#5

Message par Benso »

Re !

Donc voila ce que j'ai fait pour le moment :
$file = FileOpen("monfichier.txt", 0);Chargement du fichier .txt

If $file = -1 Then;test Du chargement du fichier .txt
    MsgBox(0, "Erreur", "Chargement des données impossible")
    Exit
EndIf

While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
   MsgBox($MB_SYSTEMMODAL, "", StringSplit($line, '   ', $STR_ENTIRESPLIT)[2]) ; affiche le deuxieme mot de la ligne
Wend
Orax tu me dis d'utiliser _FileReadToArray du coup j'ai fait ça en reprenant le code de l'aide f1
Func Example()
    ; Define a variable to pass to _FileReadToArray.
    Local $aArray = 0
$file = FileOpen("test.txt", 0);Chargement du fichier .txt
    ; Read the current script file into an array using the variable defined previously.
    ; $iFlag is specified as 0 in which the array count will not be defined. Use UBound() to find the size of the array.
    If Not _FileReadToArray($file, $aArray, 0) Then
        MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file.
    EndIf

    ; Display the array in _ArrayDisplay.
    _ArrayDisplay($aArray)
EndFunc   ;==>Example
Mais du coup j'ai le tableau qui affiche ligne par ligne . Je précise que je veux récupérer uniquement le prénom ou le nom dans mon array.
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Liste déroulante Avec Excel

#6

Message par Benso »

Je me suis peut être mal exprimé et m'en excuse

Je reformule ma question :

J'ai un fichier .txt contenant sur chaque lignes : prénom nom âge

J'aimerai lister les prénoms , les noms et les âges dans des lites déroulantes. Voila.
Comment faire ? Merci de votre aide.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Liste déroulante Avec Excel

#7

Message par orax »

Il manquait le délimiteur pour _FileReadToArray (le caractère "espace", en l'occurrence).

Fichier test.txt

Code : Tout sélectionner

NOM Prenom Age
DUPONT Florent 8
MARCEL Albert 12
TRUC Albert 36
#include <Array.au3>

Example()

Func Example()
   ; Define a variable to pass to _FileReadToArray.
   Local $aArray = 0
   ; Read the current script file into an array using the variable defined previously.
   ; $iFlag is specified as 0 in which the array count will not be defined. Use UBound() to find the size of the array.
   If Not _FileReadToArray("test.txt", $aArray, 0, " ") Then
      MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file.
   EndIf

   ; Display the array in _ArrayDisplay.
   _ArrayDisplay($aArray)

   ; on parcourt le tableau à partir de la deuxième ligne
   For $i = 1 To UBound($aArray) - 1
      ConsoleWrite("Nom = " & $aArray[$i][0] & @CRLF)
      ConsoleWrite("Prénom = " & $aArray[$i][1] & @CRLF)
      ConsoleWrite("Âge = " & $aArray[$i][2] & @CRLF)
      ConsoleWrite("----------" & @CRLF)
   Next
EndFunc   ;==>Example
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Liste déroulante Avec Excel

#8

Message par Benso »

Orax tu es mon sauveur ! J'ai repris ton code et ca éclaire pas mal de truc ! Le Ubound($array) super pratique.
Juste quelques questions pour bien que je comprenne :

Local $aArray = 0
Pourquoi mettre = 0?

ConsoleWrite("N°Groupe:" & $aArray[$i][0] & @CRLF)
$aArray est donc un tableau à deux dimensions ? $i représentant la ligne et [0] la colonne ?

Au lieu d'afficher dans ma console , je veux y stocker dans une variable array à une dimension ,
$MonArray[Ubound($aArray)] = 0 ( je suppose ) ; je déclare ma variable tableau
et dans ma boucle for
$MonArray[$i]=$aArray[$i][0]

Est ce que je suis sur la bonne voie ?
( promis je cloture apres :p)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Liste déroulante Avec Excel  

#9

Message par orax »

Local $aArray = 0
Le 0 n'est pas nécessaire. C'était comme ça dans l'exemple, alors je ne l'ai pas modifié. Ce qui est important dans ce cas, c'est simplement de déclarer $aArray, car _FileReadToArray retourne le tableau dans la variable $aArray. C'est le mot clé ByRef qui fait ça. Avec ce mot clé, $aArray peut être modifiée dans _FileReadToArray.
$aArray est donc un tableau à deux dimensions ? $i représentant la ligne et [0] la colonne ?
Oui. $tableau2D[ligne][colonne]
Au lieu d'afficher dans ma console , je veux y stocker dans une variable array à une dimension ,
$MonArray[Ubound($aArray)] = 0 ( je suppose ) ; je déclare ma variable tableau
et dans ma boucle for
$MonArray[$i]=$aArray[$i][0]
Oui mais il faudrait Local ou Global pour déclarer le tableau : Local $MonArray[Ubound($aArray)]

Avec $FRTA_INTARRAYS, on pourrait avoir un tableau 1D qui contient d'autres tableaux.
#include <Array.au3>
#include <File.au3>

Example()

Func Example()
   ; Define a variable to pass to _FileReadToArray.
   Local $aArray, $aArray2
   ; Read the current script file into an array using the variable defined previously.
   ; $iFlag is specified as 0 in which the array count will not be defined. Use UBound() to find the size of the array.
   If Not _FileReadToArray("test.txt", $aArray, $FRTA_INTARRAYS, " ") Then
      MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file.
   EndIf

   For $i = 1 To UBound($aArray) - 1
      ConsoleWrite("Nom = " & ($aArray[$i])[0] & @CRLF)
      ConsoleWrite("Prénom = " & ($aArray[$i])[1] & @CRLF)
      ConsoleWrite("Âge = " & ($aArray[$i])[2] & @CRLF)

      ; ou (syntaxe différente)
      $aArray2 = $aArray[$i]
      ConsoleWrite("Nom = " & $aArray2[0] & @CRLF)
      ConsoleWrite("Prénom = " & $aArray2[1] & @CRLF)
      ConsoleWrite("Âge = " & $aArray2[2] & @CRLF)

      ConsoleWrite("----------" & @CRLF)
   Next
EndFunc   ;==>Example
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Benso
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mar. 06 déc. 2016 11:57
Status : Hors ligne

Re: Liste déroulante Avec Excel

#10

Message par Benso »

Au top tu as résolu mon problème ! Et j'ai appris pleins de chose Merci !
Répondre