IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Nombre de lignes <> '' dans une colonne Excel


Sujet :

Delphi

  1. #1
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut Nombre de lignes <> '' dans une colonne Excel
    Bonjour à tous,

    je sais que ce sujet est assez courant, mais il me manque néanmoins certains détails. Je dois connaitre le nombre de lignes nons vides que comporte une colonne. Ceci afin de boucler jusqu'a la fin de cette colonne et en récupérer les valeurs pour les mettre dans un tableau dynamique.

    J'essaie à tout prix d'éviter le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MaFeuille.Cells.Item[i,2]<>'' then ...
    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ExcelApplication1.Connect;                        // Connection à Excel
          MonClasseur:=ExcelApplication1.Workbooks.Open('E:\Borland\Delphi7\Projects\Code Postaux\Files\code_postaux.xls',False,False,
                EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
          ExcelApplication1.Visible[0]:=false;     // Mettre false pour cacher excel
          MaFeuille:=MonClasseur.Worksheets[1] as _worksheet;
     
      SetLength(MyArray,MaFeuille.Range['A2',EmptyParam].Count);
      showmessage(inttostr(MaFeuille.Rows.Count));
     //MaFeuille.Range['A2',MaFeuille.Rows.Count;
      for i:=2 to MaFeuille.Range['A2',EmptyParam].Count do
      begin
        showmessage(MaFeuille.Cells.Item[i,2]);
      end;
      ExcelApplication1.Disconnect;
      ExcelApplication1.Workbooks.Close(0);
    J'ai beasoin de connaitre ce nombre afin de déterminer ma boucle for

    Pouvez-vous me filer un coup de pouce ?
    Merci beaucoup
    [Il était une fois Delphi ....]


  2. #2
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Salut,

    Je ne sais pas si ma réponse (très personnelle) va te convenir, mais la voici :

    - Sur mon tableur Excel la colonne A contient les lignes 1 à 65'536. Peu importe à Excel que je mette dans chaque cellule du texte, des chiffres ou rien. La colonne est toujours l'ensemble A1..A65536.

    - Si tu veux que ton programme arrête de lire à partir de la n-ième ligne il faut soit le lui dire (soit explicitement for i := 2 to 100, soit avec ton test de cellule vide -- pourvu qu'il ne manque jamais une donnée dans ta colonne --par exemple), soit le rendre suffisemment doué pour il interprète seul (et comme toi) que la colonne de donnée s'interrompt et qu'il ne sert à rien de lire en dessous ...

    de là à rendre une puce intelligente

    Sinon , je te proposerais d'utiliser une cellule du tableau qui te donnera la réponse à exploiter par ton programme. Cette cellule contiendrait une formule excel du style =BDNB() ou =BDNBVAL(). Tu récupères la valeur et tu fais boucler ton programme jusqu'à ce qu'il ait trouvé ledit nombre de cellules non vides. CQFD
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  3. #3
    Membre habitué Avatar de MelkInarian
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 144
    Points
    144
    Par défaut Aller à la dernière cellule
    Je ne suis pas sur d'avoir compris,
    1) si l'idée est de connaître la dernière cellule utilisée pour travailler avec une boucle, voici la fonction que j'utilise.
    2) sinon une solution qui n'est pas élégante mais qui doit fonctionner.
    C'est une boucle partant de la fin (65535) et remontant jusqu'à trouver une cellule non vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Var
       vMSExcel,
       vXLClasseurs,
       vXLClasIEP,
       vXLClasTbl,
       vFeuilIEP,
       vFeuilTbl,
       vRangeIEP,
       vRangeTbl   : variant;
       CptT, CptP  : Word;
       Nouvel, K   : Word;
       NbCol       : Byte;
       CptTable    : Byte;
       PDeb, PFin  : Byte;
       Colonne     : String[2];
       LChamps     : TStrings;
       LChpsIE     : TStrings;
       ChampAbsent : Boolean;
       AffTrouve   : Boolean;
       sChCh, Ch,
       ChIEP,
       ChTbl   : String;
    begin
        LChamps           := Tstringlist.Create;
        LChamps.LoadFromFile(ChBasR + 'ListeChamps_E.TXT'); // Charge depuis le fichier
    
        FBaseT := ChBasR + FTbl_E;
        FBaseD := ChBasR + FIEP_E;
        Memo2.Lines.Add('FBaseT: ' + FBaseT);
        Memo2.Lines.Add('FBaseD: ' + FBaseD);
        BtMaJTable_E.Enabled := true;
        ChampAbsent := False;
        AffTrouve   := False;
    
          vMSExcel := CreateOleObject('Excel.Application');     // Crée l'interface
          vMSExcel.Visible := False;                            // Interface invisible
          vMSExcel.DisplayAlerts := False ;                     // message d'alerte en route
          try
            vXLClasseurs := vMSExcel.Workbooks;
            // BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE - BASE -
            vXLClasTbl    := vXLClasseurs.Open(FBaseT,unassigned,True); // IEP  ReadOnly à True
            vFeuilTbl     := vXLClasTbl.WorkSheets[1];
            vFeuilTbl.UsedRange.Select;                        // La plage de cellules utilisées est sélectionnée        Memo2.Lines.Add('Feuille de Table_x sélectionnée');
            vFeuilTbl.UsedRange.Sort(vFeuilTbl.Range['A1','A1'], xlDescending,
              EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
              xlGuess, 1, False, xlTopToBottom, EmptyParam);    // La plage sélectionnée est triée
            Memo2.Lines.Add('plage de Table_x sélectionnée est triée');
            NbTLigT := vFeuilTbl.UsedRange.Rows.count;         // Nombre de lignes utilisées dans la table        Nouvel := NbTLigT + 1;                             // 1ère ligne disponible
            Memo2.Lines.Add('Nombre de lignes utilisées dans la table Table_x : ' + IntToStr(NbTLigT));
            vRangeTbl :=  vFeuilTbl.Range['A1', 'U' + IntToStr(NbTLigT+1500)].Value;
            Memo2.Lines.Add('vRangeTbl: A1-U' + IntToStr(NbTLigT));
          Finally
            vXLClasTbl.Close;   // vXLWorkbook.Close(vSaveChanges, aFileName);
            VarClear(vXLClasTbl);                               // Variant effacé
            VarClear(vFeuilTbl);                                // Variant effacé

  4. #4
    Nouveau membre du Club

    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par archonte
    Salut,


    Sinon , je te proposerais d'utiliser une cellule du tableau qui te donnera la réponse à exploiter par ton programme. Cette cellule contiendrait une formule excel du style =BDNB() ou =BDNBVAL(). Tu récupères la valeur et tu fais boucler ton programme jusqu'à ce qu'il ait trouvé ledit nombre de cellules non vides. CQFD

    J'aime bien cette idée. Mais pour lire cette donnée, il va falloir connaître la cellule,non? Dans ce cas on tourne en rond

  5. #5
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Salut à tous !

    Merci pour vos réponses.

    archonte a écrit :
    Salut,


    Sinon , je te proposerais d'utiliser une cellule du tableau qui te donnera la réponse à exploiter par ton programme. Cette cellule contiendrait une formule excel du style =BDNB() ou =BDNBVAL(). Tu récupères la valeur et tu fais boucler ton programme jusqu'à ce qu'il ait trouvé ledit nombre de cellules non vides. CQFD
    C'est idée n'est pas mauvaise du tout, mais j'aimerais ne pas devoir référencer une cellule en particulier, car il s'agit d'un fichier se trouvant sur un réseau et celui-ci est susceptible d'être modifié.

    Je ne suis pas sur d'avoir compris,
    1) si l'idée est de connaître la dernière cellule utilisée pour travailler avec une boucle, voici la fonction que j'utilise.
    2) sinon une solution qui n'est pas élégante mais qui doit fonctionner.
    C'est une boucle partant de la fin (65535) et remontant jusqu'à trouver une cellule non vide.
    Le problème de cette solution est que mon fichier comporte entre 2.000 et 3.000 record grand max. Ce qui fait environ 63000 boucles inutiles.
    [Il était une fois Delphi ....]


  6. #6
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    1) si l'idée est de connaître la dernière cellule utilisée pour travailler avec une boucle, voici la fonction que j'utilise.
    Super, c'est ça que je voulais !
    Un grand merci.

    @+
    [Il était une fois Delphi ....]


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

Discussions similaires

  1. [XL-2003] calcule le nombre de ligne non vide dans une colonne donnée
    Par aefmaaradji dans le forum Excel
    Réponses: 2
    Dernier message: 27/07/2010, 15h08
  2. Masquer une ligne selon resultat dans une colonne
    Par amne26 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/10/2008, 23h45
  3. Réponses: 5
    Dernier message: 22/02/2008, 19h34
  4. nombre de cellule dans une colonne excel
    Par mahboub dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/11/2006, 23h00
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo