Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité régulier
    Profil pro
    Inscrit en
    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 :

    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

  2. #2
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : avril 2002
    Messages : 1 292
    Points : 3 497
    Points
    3 497

    Par défaut

    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.

  3. #3
    Invité régulier
    Profil pro
    Inscrit en
    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

    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

  4. #4
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : avril 2002
    Messages : 1 292
    Points : 3 497
    Points
    3 497

    Par défaut

    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.

  5. #5
    Invité régulier
    Profil pro
    Inscrit en
    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

    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

  6. #6
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : avril 2002
    Messages : 1 292
    Points : 3 497
    Points
    3 497

    Par défaut

    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.

  7. #7
    Invité régulier
    Profil pro
    Inscrit en
    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

    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

  8. #8
    Invité régulier
    Profil pro
    Inscrit en
    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

    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 :
    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 :
    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

  9. #9
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : avril 2002
    Messages : 1 292
    Points : 3 497
    Points
    3 497

    Par défaut

    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.

  10. #10
    Invité régulier
    Profil pro
    Inscrit en
    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

    Bonjour,
    Impeccable ! Ca fonctionne.
    Merci pour ton aide.
    @+
    Stef

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •