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

API, COM et SDKs Delphi Discussion :

[D10.4] Range Excel Via RefToCell : simplification du code


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut [D10.4] Range Excel Via RefToCell : simplification du code
    Bonjour,
    j'ai récupéré un code d'export de AdoDataset vers excel qui fait appel à une function qui ne supporte que 26 colonnes.
    L'appel a cette fonction me sert a alimenter la première ligne de la feuille excel avec le nom des champs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
       for Index  := 0 to AdoDataSet1.fields.count - 1 do
            Sheet.Range[RefToCell(1, Index + 1), RefToCell(1, Index + 1)].Value := AdoDataSet1.Fields.Fields[Index].DisplayLabel;
     .....
     
      function RefToCell(ARow, ACol: Integer): string;
        begin
            Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
        end;
    J'ai commencé à modifier RefToCall car mes dataset on bien plus de colonnes. ce code modifié fonctionne parfaitement mais je voudrais le simplifier car il est .. stupide..
    Je ne trouve pas la logique en utilisant par exemple INT et MOD pour le simplifier.

    le voici dans sa version limitées à 78 colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function RefToCell(ARow, ACol: Integer): string;
        begin
            case Acol of
               1..26 :  Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
               27..52 : Result := 'A' + Chr(Ord('A') + ACol - 27) + IntToStr(ARow);
               53..78 : Result := 'B' + Chr(Ord('A') + ACol - 53) + IntToStr(ARow);
            end;
        end;
    Si l'un d'entre vous à une idée ou une version dynamique et courte, j'en serais ravi.

    Excellente journée a tous.

    PS : j'espère que j'ai balisé ma demande correctement, car ça fait des années que je n'ai plus pointé le bout de mon nez ici.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Transformer un nombre décimal en suite de lettre A..Z, ce n'est au final qu'une conversion de base, à l'instar du Hexa, mais uniquement avec des lettres

    J'ai ça dans un coin sur le forum
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Sinon, l'objet Range OLE de Excel Sheet supporte très bien la numérotation décimale


    J'ai retrouvé cette version simpliste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function RangeExcel(iLigne, iColonne: Integer): string;
    var
      iPremiereLettre, iSecondeLettre: Integer;
    begin
      if iColonne <= 26 then
        result := Chr(iColonne+64) + IntToStr(iLigne)
      else
      begin
        iPremiereLettre := Trunc((iColonne-1) / 26);
        iSecondeLettre := iColonne - iPremiereLettre*26;
        result := Chr(iPremiereLettre+64) + Chr(iSecondeLettre+64) + IntToStr(iLigne);
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, l'objet Range OLE de Excel Sheet supporte très bien la numérotation décimale
    C'est effectivement l'idéal, mais je ne parviens pas à mettre la main sur la doc de cet objet OLE ou je pourrais trouver comment remplacer la méthode RANGE par quelque-chose comme CELL

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, l'objet Range OLE de Excel Sheet supporte très bien la numérotation décimale


    J'ai retrouvé cette version simpliste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function RangeExcel(iLigne, iColonne: Integer): string;
    var
      iPremiereLettre, iSecondeLettre: Integer;
    begin
      if iColonne <= 26 then
        result := Chr(iColonne+64) + IntToStr(iLigne)
      else
      begin
        iPremiereLettre := Trunc((iColonne-1) / 26);
        iSecondeLettre := iColonne - iPremiereLettre*26;
        result := Chr(iPremiereLettre+64) + Chr(iSecondeLettre+64) + IntToStr(iLigne);
      end;
    end;

    yes, c'est ca qu'il me faut. merciiiii Je teste direct.

  6. #6
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Ca marche impec. Un immense merci. je cloture.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Sinon pour illustrer la conversion de base si la version si Excel dépasse ZZ ce qui est peut-être possible maintenant

    ConversionIntToBase peut aussi servir pour l'octal '01234567' ou l'hexa '0123456789ABCDEF' même le binaire '01'

    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
    function ConversionIntToBase(Value: Int64; Base: string): string;
    var
      BaseLen: Integer;
      pResult: PChar;
      k: integer;
      kk: extended;
    begin
      BaseLen := Length(Base);
      if BaseLen >= 0 then
      begin
        if Value >= BaseLen then
        begin
          SetLength(Result, Math.Floor(LogN(BaseLen, Value)) + 1); // LogN est-il plus rapide que des réallocations de chaine dans une boucle ?
          pResult := @Result[Length(Result)];
     
          while Value > 0 do
          begin
            pResult^ := Base[Value mod BaseLen + 1];
            Value := Value div BaseLen;
            Dec(pResult);
          end;
        end
        else
          Result := Base[Value + 1];
      end
      else
        Result := '';
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function RangeExcel(iLigne, iColonne: Integer): string;
    begin
      Result :=ConversionIntToBase(iColonne - 1, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') +  IntToStr(iLigne);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Top. Encore merci

  10. #10
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon pour illustrer la conversion de base si la version si Excel dépasse ZZ ce qui est peut-être possible maintenant

    ConversionIntToBase peut aussi servir pour l'octal '01234567' ou l'hexa '0123456789ABCDEF' même le binaire '01'

    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
    function ConversionIntToBase(Value: Int64; Base: string): string;
    var
      BaseLen: Integer;
      pResult: PChar;
      k: integer;
      kk: extended;
    begin
      BaseLen := Length(Base);
      if BaseLen >= 0 then
      begin
        if Value >= BaseLen then
        begin
          SetLength(Result, Math.Floor(LogN(BaseLen, Value)) + 1); // LogN est-il plus rapide que des réallocations de chaine dans une boucle ?
          pResult := @Result[Length(Result)];
     
          while Value > 0 do
          begin
            pResult^ := Base[Value mod BaseLen + 1];
            Value := Value div BaseLen;
            Dec(pResult);
          end;
        end
        else
          Result := Base[Value + 1];
      end
      else
        Result := '';
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function RangeExcel(iLigne, iColonne: Integer): string;
    begin
      Result :=ConversionIntToBase(iColonne - 1, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') +  IntToStr(iLigne);
    end;
    Je viens de tester ton dernier code, tant qu'à faire.
    J'ai 2 soucis :
    1/ J'ai du remplacer Math.Floor( par .Floor.

    Au niveau fonctionnel il y a un bug.
    Les colonnes de titres de AA a AZ sont vides, ce qui signifie qu'il passe de Z a BA.

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Ah oui, c'est logique, A = 0 et B = 1 donc A..Z forcément le passage à la "dizaine" suivante c'est BA sur le même motif que 10 pour le décimal car AA c'est en fait 00

    Faudra que je cherche si j'ai la version boucle qui gère ExcelRangeLetter sans limite
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Automation excel via Access -
    Par Celia1303 dans le forum Access
    Réponses: 4
    Dernier message: 18/11/2005, 12h45
  2. [VB.NET] problème d'utilisation de substotal (excel via VB)
    Par Pynuch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/11/2005, 13h53
  3. [débutant] manipulation de doc Excel via C++
    Par htcrusoe dans le forum C++
    Réponses: 4
    Dernier message: 17/03/2005, 19h57
  4. Connection avec MS Query (Excel) via ODBC MySQL
    Par javigle dans le forum Installation
    Réponses: 7
    Dernier message: 23/11/2003, 21h03
  5. [Kylix] Excel via kylix
    Par Billy joel dans le forum EDI
    Réponses: 1
    Dernier message: 23/05/2002, 11h57

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