Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/12/2012, 20h19   #1
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Par défaut Excel : utilisation de la fonction tri

Bonjour,
Dans un nouveau projet je dois ajouté des données à la suite dans un fichier Excel. Grâce à la FAQ et à Google, j'ouvre Excel, place les données dans les bonne colonne/ligne sans soucis.
Mais voilà, une nouvelle demande des utilisateurs. Un bloc de donnée devrait être trier... heureusement pour l'instant sur un seul critère... mais qui sait si ils ne vont pas cherchés a me compliquer la vie !
Les données dans mon fichier excel ressemble à ca :

Citation:
1
4
8
3
67
3
2
43
34
76
Et le tout est dans la colonne B et débute à la ligne 5 (il y a des infos au dessus a ne pas toucher).

J'ai écris un petit programme de test pour comprendre.
Les variables utilisées en vrac sont :
Code :
1
2
3
4
5
 vMSExcel : variant;
    vXLWorkbooks, vXLWorkbook : variant;
    vWorksheet : variant;
    aSheetName : AnsiString;
    aFileName : AnsiString;
Il y a bien le "ComObj" dans le Uses.

L'ouverture de Excel, le chargement de la feuille Excel et le choix de l'onglet se passe comme ça:
Code :
1
2
3
4
5
6
        try
                vMSExcel := GetActiveOleObject('Excel.Application');
        except
                vMSExcel := CreateOleObject('Excel.Application');
        end;
        vMSExcel.Visible := true;
Code :
1
2
3
4
5
6
7
8
9
    // Ouvre le fichier Excel
    aFileName := ExtractFilePath(Application.ExeName)+'sort.xls';
    memo1.Lines.Add(aFileName);
 
    vXLWorkbooks := vMSExcel.Workbooks;
    vXLWorkbook := vXLWorkbooks.Open(aFileName);
 
    aSheetName := 'Feuil1';
    vWorksheet := vXLWorkbook.WorkSheets[aSheetName];

C'est à partir de là que ça coince...
Code :
1
2
3
procedure TForm1.Sort_XLSClick(Sender: TObject);
begin   vWorksheet.Range['B5','B15'].sort(vWorksheet.Range['B5','B5'],'xlAscending',EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,'xlGuess', 1, False, 'xlTopToBottom', EmptyParam);
end;
Si je ne met pas entre apostrophe les paramètres: "xlAscending, xlGuess, xlTopToBottom", j'ai un message d'erreur à la compilation : [DCC Erreur] Unit1.pas(53): E2003 Identificateur non déclaré : 'xlAscending'
Si je place des apostrophes, pas d'erreur de compilation, mais une erreur d’exécution :


Vous avez une idée, je galère depuis hier...
Je suis sous Delphi 2009.
Merci à l'avance pour votre aide.
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 22h13   #2
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Bonjour,
Citation:
Envoyé par Hicks90 Voir le message
...Il y a bien le "ComObj" dans le Uses.
Mais il n'y a pas Excel2000 ou ExcelXP ou autre dans la clause uses ?

Dans ce cas, il faut introduire les constantes qui sont présentes dans ces unités :

Code :
1
2
3
4
5
6
7
8
9
const
  xlAscending = $00000001;
  xlDescending = $00000002;
//...
  xlGuess = $00000000;
  xlNo = $00000002;
  xlYes = $00000001;
//...
  xlTopToBottom = $00000001;
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 23h55   #3
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Bonjour,
Citation:
Envoyé par Ph. B. Voir le message
Bonjour,

Mais il n'y a pas Excel2000 ou ExcelXP ou autre dans la clause uses ?
Merci pour ta réponse, c'est exactement ça

J'ai une autre question... que j'avais oublié dans ma question initiale
Dans mon programme de test j'utilise la syntaxe :
Code :
vWorksheet.Range['B5','B20'].sort(vWorksheet.Range['B5','B5']... etc
Dans le programme que je suis a modifier, j'utilise des variables integer pour les références de cellules :
Code :
vWorksheet.Cells[LastLine,1].value:= ... etc
Dans tout les exemples que j'ai vu avec la fonction Range, Sort (et d'autre) utilises des indices pour les cellules en string ('A1'). Est-ce qu'il est possible des d'utiliser ces fonctions avec des indices en integer ?

Merci encore,
Bonne soirée
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 14h13   #4
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Citation:
Envoyé par Hicks90 Voir le message
Dans le programme que je suis a modifier, j'utilise des variables integer pour les références de cellules :
Code :
vWorksheet.Cells[LastLine,1].value:= ... etc
Dans tout les exemples que j'ai vu avec la fonction Range, Sort (et d'autre) utilises des indices pour les cellules en string ('A1'). Est-ce qu'il est possible des d'utiliser ces fonctions avec des indices en integer ?
Il manque un petit quelque chose dans la ligne de code :
Code :
vWorksheet.Cells.Item[LastLine,1].value:= ... etc
Et c'était dans la FAQ, même si c'était indirectement...
Manipulation des cellules
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h05   #5
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Bonjour,
Citation:
Envoyé par Ph. B. Voir le message
Et c'était dans la FAQ, même si c'était indirectement...
Manipulation des cellules
Ce doit-être très indirecte... parce que j'ai arpenté la FAQ et cette page en particulier de long en large sans trouver
Désoler, je suis un boulet...


Bonne journée
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h13   #6
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Citation:
Envoyé par Hicks90 Voir le message
Ce doit-être très indirecte...
Plus précisément, c'est dans la question : Comment insérer ou supprimer des cellules ?
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 02h46   #7
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Bonjour,
Désoler, trop de boulot pour être revenu au cours de la journée.

Citation:
Envoyé par Ph. B. Voir le message
Il manque un petit quelque chose dans la ligne de code :
Code :
vWorksheet.Cells.Item[LastLine,1].value:= ... etc
Pas vraiment
J'ai essayé et :
Code :
1
2
    vWorksheet.Cells[2,2].value:='Allo';
    vWorksheet.Cells.Item[3,3].value:='La Terre';
Donnes le même résultat.

Citation:
Envoyé par Ph. B. Voir le message
Plus précisément, c'est dans la question : Comment insérer ou supprimer des cellules ?
Concernant ma question... j'ai vu et relu la FAQ...
Si j'ai bien compris:
Code :
1
2
    vWorksheet.Cells.Item[3,3].value:='La Terre';
    vWorksheet.Range['D4','D4'].value:='Je suis perdu';
La première ligne écris la valeur à C3 et l'autre à D4. La fonction utiliser est Cells en "chiffres" et Range en "lettre et chiffre".

J'ai fait un essai... et ça commence à fonctionner
Voila à syntaxe du tri:
Code :
vWorksheet.range.item[5,2,20,2].sort(vWorksheet.range.item[5,2],xlAscending,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,xlGuess, 1, False, xlTopToBottom, EmptyParam);
Avec ce message d'erreur:

Il y a 12 paramètres pour la fonction "Sort"... je me demande si il ne manque pas quelque chose...

Bonne journée
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 18h10   #8
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Bonjour,
J'ai pu refaire un essai ce matin. Toujours le même message d'erreur

Sur le site de Microsoft sur la méthode Sort: http://msdn.microsoft.com/en-us/libr.../ff840646.aspx
La syntaxe est :
Citation:
Syntax
expression .Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)
Avec toute une flopée de paramètres :
Citation:
Key1 - Optional -Variant
Specifies the first sort field, either as a range name (String) or Range object; determines the values to be sorted.

Order1-Optional-XlSortOrder
Determines the sort order for the values specified in Key1.

Key2-Optional-Variant
Second sort field; cannot be used when sorting a pivot table.

Type-Optional-Variant
Specified which elements are to be sorted.

Order2-Optional-XlSortOrder
Determines the sort order for the values specified in Key2.

Key3-Optional-Variant
Third sort field; cannot be used when sorting a pivot table.

Order3-Optional-XlSortOrder
Determines the sort order for the values specified in Key3.

Header-Optional-XlYesNoGuess
Specifies whether the first row contains header information. xlNo is the default value; specify xlGuess if you want Excel to attempt to determine the header.

OrderCustom-Optional-Variant
Specifies a one-based integer offset into the list of custom sort orders.

MatchCase-Optional-Variant
Set to True to perform a case-sensitive sort, False to perform non-case sensitive sort; cannot be used with pivot tables.

Orientation-Optional-XlSortOrientation
Specifies if the sort should be in acending or decending order.

SortMethod-Optional-XlSortMethod
Specifies the sort method.

DataOption1-Optional-XlSortDataOption
Specifies how to sort text in the range specified in Key1; does not apply to pivot table sorting.

DataOption2-Optional-XlSortDataOption
Specifies how to sort text in the range specified in Key2; does not apply to pivot table sorting.

DataOption3-Optional XlSortDataOption
Specifies how to sort text in the range specified in Key3; does not apply to pivot table sorting.
Ma ligne de code pour le tri est :
Code :
Worksheet.range.item[2,5,2,20].sort(vWorksheet.range.item[2,5],xlAscending,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlNo, EmptyParam, False, xlSortColumns, EmptyParam, xlSortnormal, EmptyParam, EmptyParam);
Les données à trier sont dans la colonne B de la ligne 5 à 20. Mais toujours le même message d'erreur : "Nombre de paramètre non valide"
Là je en vois plus du tout...

Merci pour votre aide
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 21h31   #9
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Citation:
Envoyé par Hicks90 Voir le message
Ma ligne de code pour le tri est :
Code :
Worksheet.range.item[2,5,2,20].sort(vWorksheet.range.item[2,5],xlAscending,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, xlNo, EmptyParam, False, xlSortColumns, EmptyParam, xlSortnormal, EmptyParam, EmptyParam);
J'écrirais plutôt un truc du genre :
Code :
Worksheet.Range[Worksheet.Cells.Item[2, 5], Worksheet.Cells.Item[2, 20]].Sort(Worksheet.Cells.Item[2, 5],...);
Et en passant par des variables intermédiaires, pour la lisibilité...
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/12/2012, 02h04   #10
Hicks90
Invité régulier
 
Inscription : mai 2009
Messages : 21
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2009
Messages : 21
Points : 6
Points : 6
Bonjour,
Impeccable ! Ca fonctionne.
Merci pour ton aide.
@+
Stef
Hicks90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h34.


 
 
 
 
Partenaires

Hébergement Web