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

C++Builder Discussion :

[Excel] Mise en forme Txt


Sujet :

C++Builder

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut [Excel] Mise en forme Txt
    Salut tout le monde !

    Je suis en 2ème année de DUT GEII et je dois réaliser un programme.
    Ce programme doit me permettre de mettre en forme un fichier txt en tableau Excel sans passer par Excel. Tout doit être fait automatiquement pour permettre d'avoir un tableau Excel béton ...

    Ce tableau sera ma base de donnée, le traitement du tableau est facile grâce au tuto et à la faq (même s'il y a quelques erreurs ^^).

    Le hic c'est pour mettre en forme le txt... (rien dans le tuto et dans la FaQ donc je navigue dans l'inconnue)
    Mon idée était de le faire manuellement et d'enregistrer une macro
    voila ce que j'obtiens en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     ChDir "A:\"
        Workbooks.OpenText Filename:="A:\168.txt", Origin:=xlMSDOS, StartRow:=1, _
            DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(10, 1), Array(20, 1) _
            , Array(34, 1), Array(48, 1), Array(60, 1), Array(94, 1), Array(112, 1)), _
            TrailingMinusNumbers:=True
    Alors j'arrive bien à ouvrir un txt sous excel mais je n'arrive pas à changer l'origine (c'est à dire que je me retrouve avec des virgule à la place des accents aigu)
    Je vais essayer en attendant vos réponses de modifier mes champs (paramètres FieldInfo et Array)

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut ptit fab:
    Alors premierement si tu a releve des erreurs dans la FAQ dis nous ou qu'on les fasse corriger au plus vite
    Tu charge ton fichier sous Excel est il bien presente dans chaque colonne?
    Qu'appel tu changer d'origine?
    Est ce que ton probleme ne serait pas de charger un fichier TXT ou CSV dans Excel en ayant le formatage des colonnes a l'ouverture, exemple colonne TXT, colonne DATE ...?
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Lu

    En faite le fichier que je récupère est un fichier .imp auquel on change l'extension en .txt.
    Dans ce fichier il y a plusieurs colonne Date, heure , nom, informations concernées.
    Le problème c'est les deux dernière colonnes ... car les noms et les informations concernées ont des espaces et Excel quand il voit un espace (TAB ou ESPACE) il crée une nouvelle colonne et c'est que je veux supprimer.... il me fait donc un près traitement mais que je dois améliorer.

    Ce soir si j'ai le temps je vous mettrai quelque imprime écran pour être plus clair de ce que je fais et ce que je veux à la fin.

    Hors Sujet :
    J'ai un petit problème pour copier-coller un fichier dans un autre, j'ai pas eu le temps de regarder s'il y avait quelque chose dans le forum.

    Pour les erreurs :
    il y a souvent écrit OleProdedure à la place de OleProcedure
    Et il me semble que pour fermer ce n'est pas :
    vMSExcel.OleProcedure("Close") mais vMSExcel.OleFunction("Close");
    Je vous le confirmerai ce soir

    @++

  4. #4
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Bonjour

    Bon voilà j'ai avancé un peu et mon problème c'est la fonction Array sous VB que je n'arrive pas à retranscrire sous C++
    Si quelqu'un à une idée ...

    @++

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Re-Bonjour,

    J'ai regardé de plus près ce que je faisais et je me suis rendu compte que quand on utilise la fonction opentext il nous le charge en csv c'est à dire qu'il cherche un caractère de délimitation. Or quand je le fais à la main, c'est à dire quand sous Excel je fais Ouvrir\av.txt il me lance l'Assitant d'importation de texte dans l'étape 1 dans Type de données d'origine on a le choix entre délimité (csv) et largeur fixe et c'est ca que je veux mais je n'arrive pas à le lancer depuis builder et ca me

    Si quelqu'un à déja réussi ....

    @++

  6. #6
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Re-Re-bonjour,

    bon j'avance je pense avoir trouver la solution à mo problème c'est la fonction : TextTocolumns.
    Si quelqu'un s'en est servi peut-il m'aider ...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 118
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par ptit fab
    Bonjour

    Bon voilà j'ai avancé un peu et mon problème c'est la fonction Array sous VB que je n'arrive pas à retranscrire sous C++
    Si quelqu'un à une idée ...

    @++
    Salut ptit fab,

    j'avais tenter d'expliquer la fonction Array dans un post :

    http://www.developpez.net/forums/sho...d.php?t=194199


    En espérant t'avoir aider

    @+

    Xav

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse Xav++, j'essayerai ca demain car je vais bientot débauché ...
    Par contre j'ai un autre problème quand je veux copier-coller.

    En faite j'ouvre plusieurs fichier que je mets en forme et à la fin je veux en avoir un seul...
    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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    void __fastcall TForm1::Bp_LancerClick(TObject *Sender)
    {
            //Ouvre Excel, Charge le fichier *.xls, Met en forme le fichier, Sauvegarde
     
            bool res;
            Variant vCopy,vDestination;
            AnsiString aDestination;
            try
            {
                    vMSExcel = Variant::GetActiveObject("Excel.Application");
            }
            catch(...)
            {
                    vMSExcel = Variant::CreateObject("Excel.Application");
            }
            vMSExcel.OlePropertySet("Visible", true);
            vMSExcel.OlePropertySet("ScreenUpdating", true);
            Excel = 1;
            //Ouverture du ou des fichiers
            Variant title = StringToOleStr("Ouvrir"); // titre à donner à la boite de dialogue
            Variant multiselect = true; // selection multiple autorisée
            fichier = ExcelApplication1->GetOpenFilename(EmptyParam, EmptyParam, title, EmptyParam, multiselect, 0);
            if(fichier.IsArray())
            {
                    lirets->Enabled = true;
                    test->Enabled = true;
                    derlin->Enabled = true;
                    Lire->Enabled = true;
                    Miseenforme->Enabled = true;
                    Filtre->Enabled = true;
                    test->Enabled = true;
                    for(j=1 ; j<=fichier.ArrayHighBound(1) ; j++)
                    {
                            vFileName = fichier.GetElement(j);
                            vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                            vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName);
                            vMSExcel.OlePropertySet("DisplayAlerts", false);//Désactive les alertes
                            vMSExcel.OlePropertySet("WindowState", -4140);//Minimise la fenêtre Excel
                            //Mise en Forme
                            iLigneLimite = CompteurLigne(vXLWorkbook);
                            i=1;k=1;
                            do
                            {
                                    vCol=StringToOleStr("B");
                                    vLin=StringToOleStr((AnsiString)i);
                                    vWsRange=vCol+vLin;
                                    vCell = vWorksheet.OlePropertyGet("Range", vWsRange);
                                    aCell=vCell;
                                    if((aCell=="")||(aCell=="Heure"))
                                    {
                                            iLinSupp=i;
                                            vLin=StringToOleStr((AnsiString)iLinSupp);
                                            vRow=vWorksheet.OlePropertyGet("Rows", vLin);
                                            vRow.OleProcedure("Delete", -4162);
                                    }
                                    else
                                    {
                                            i++;
                                    }
                                    k++;
                            }
                            while(k<=iLigneLimite);
                            if(j>1)
                            {
                                    iLigneLimite = CompteurLigne(vXLWorkbook);
                                    vCol=StringToOleStr("A");
                                    vLin=StringToOleStr((AnsiString)iLigneLimite);
                                    vDestination = vCol+vLin;
                                    //Memo1->Text = vDestination;
                                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
                                    vWorksheet.OleProcedure("Paste",vDestination);
                            }
                            vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
                            vUsedRange = vWorksheet.OlePropertyGet("UsedRange");
                            vCopy = vUsedRange.OleFunction("Copy");
                    }
                    //vFileName="c:\\affsiam\\transfert.xls";
                    //vXLWorkbook.OleFunction("Saveas", vFileName);
                    vMSExcel.OlePropertySet("ScreenUpdating", true);
            }
    }
    Et j'ai le droit à la super erreur "Une exception s'est produite" (J'ai envie de lui faire bouffer son erreur je vais devenir dingue à force de la voir )
    Le pire c'est qu'il copie bien ....

    Merci d'avance

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut ptit fab:
    J'ai tente de tester ton code mais il manque trop de definition de variables, si tu peu poster un code plus complet je verrais si je peu trouver ton probleme
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  10. #10
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Salut, tout le monde !!

    Bon pour commencer, j'ai testé ton code ce matin Xav++ et bien je dois te dire Merci !!!!!!!!!!!!!!!!

    Pour blondelle voici le code avec les variables.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
       //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    int CompteurLigne (Variant vSrc);
    Variant vCopy,vDestination,vMSExcel,fichier,vXLWorkbooks,vXLWorkbook,vCol,vLin,vWsRange,vCell,vFileName,vWorksheet,vRow,vUsedRange,vLines;
    int j,i,k,iLigneLimite,iLinSupp;
    AnsiString aDestination,aCell;
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "Excel_2K_SRVR"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //Ouvre Excel, Charge le fichier *.xls, Met en forme le fichier, Sauvegarde
     
            bool res;
            vMSExcel = Variant::CreateObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
            vMSExcel.OlePropertySet("ScreenUpdating", true);
            //Ouverture du ou des fichiers
            Variant title = StringToOleStr("Ouvrir"); // titre à donner à la boite de dialogue
            Variant multiselect = true; // selection multiple autorisée
            fichier = ExcelApplication1->GetOpenFilename(EmptyParam, EmptyParam, title, EmptyParam, multiselect, 0);
            if(fichier.IsArray())
            {
                    for(j=1 ; j<=fichier.ArrayHighBound(1) ; j++)
                    {
                            vFileName = fichier.GetElement(j);
                            vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                            vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName);
                            vMSExcel.OlePropertySet("DisplayAlerts", false);//Désactive les alertes
                            vMSExcel.OlePropertySet("WindowState", -4140);//Minimise la fenêtre Excel
                            //Mise en Forme
                            iLigneLimite = CompteurLigne(vXLWorkbook);
                            /*if(j>1)
                            {
                                    iLigneLimite = CompteurLigne(vXLWorkbook);
                                    vCol=StringToOleStr("A");
                                    vLin=StringToOleStr((AnsiString)iLigneLimite);
                                    vDestination = vCol+vLin;
                                    //Memo1->Text = vDestination;
                                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
                                    vWorksheet.OleProcedure("Paste",vDestination);
                            }*/
                            i=1;k=1;
                            do
                            {
                                    vCol=StringToOleStr("B");
                                    vLin=StringToOleStr((AnsiString)i);
                                    vWsRange=vCol+vLin;
                                    vCell = vWorksheet.OlePropertyGet("Range", vWsRange);
                                    aCell=vCell;
                                    if((aCell=="")||(aCell=="Heure"))
                                    {
                                            iLinSupp=i;
                                            vLin=StringToOleStr((AnsiString)iLinSupp);
                                            vRow=vWorksheet.OlePropertyGet("Rows", vLin);
                                            vRow.OleProcedure("Delete", -4162);
                                    }
                                    else
                                    {
                                            i++;
                                    }
                                    k++;
                            }
                            while(k<=iLigneLimite);
                            if(j>1)
                            {
                                    iLigneLimite = CompteurLigne(vXLWorkbook);
                                    vCol=StringToOleStr("A");
                                    vLin=StringToOleStr((AnsiString)iLigneLimite);
                                    vDestination = vCol+vLin;
                                    //Memo1->Text = vDestination;
                                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
                                    vWorksheet.OleProcedure("Paste",vDestination);
                            }
                            vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
                            vUsedRange = vWorksheet.OlePropertyGet("UsedRange");
                            vCopy = vUsedRange.OleFunction("Copy");
                    }
                    //vFileName="c:\\affsiam\\transfert.xls";
                    //vXLWorkbook.OleFunction("Saveas", vFileName);
                    vMSExcel.OlePropertySet("ScreenUpdating", true);
            }
    }
    ////////////////////////////////////////////
    ////////////    Sous-Fonction   ////////////
    ////////////////////////////////////////////
     
    int CompteurLigne (Variant vSrc)
    {
            int iNbrLigne;
            vWorksheet = vSrc.OlePropertyGet("Worksheets", 1);
            vUsedRange = vWorksheet.OlePropertyGet("UsedRange");
            vLines = vUsedRange.OlePropertyGet("Rows");
            iNbrLigne = vLines.OlePropertyGet("Count");
            return iNbrLigne;
    }
    //---------------------------------------------------------------------------
    Il faudra ajouter sur la Form un bouton standard et un objet ExcelApplication.
    J'ai essayé ce code il fonctionne chez moi (jusqu'à l'erreur en tout cas ^^).
    Par contre je fait une mise en forme veux-tu que je t'envoie 2 fichiers excel ?

    Merci d'avance !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 118
    Points : 93
    Points
    93
    Par défaut
    Salut ptit fab,

    je suis content d'avoir pu t'aider, surtout que ces Array m'avait comment dirai-je
    quelque peu énervé

    pour ta deuxième question, j'essaierai aussi de tester ton code dès que je le
    pourrai mais tu es entre de bonne main avec notre docteur es OLE Blondelle


    @+

    Xav

  12. #12
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Re-bonjour,

    Pour changer j'ai un problème ....

    Cette fois-ci je n'arrive pas à sauvegarder mon fichier que je mets en forme et pourtant j'ai suivi toute les informations que vous avez mis sur le forum je commence à en avoir marre du serveur ole ...
    Comme d'habitude je vous donne le 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
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    String vFileName;
            Variant vXLWorkbooks, vXLWorkbook, vMSExcel,fichier;
            Variant vOrigin = 3; // = xlMSDOS format MSDOS
            Variant vStartRow = 1; // on commence à la 1ère ligne (par défaut)
            Variant vDataType = 2; // = xlFixedWidth format délimité (par défaut)
            Variant vTextQualifier = 1; // = xlTextQualifierDoubleQuote qualificateur de texte (par défaut)
            Variant vConsecutiveDelimiter = false; // pas de délimitateur consécutif
            Variant vTab = false; // pas délimitateur tab
            Variant vSemicolon = true; // délimitateur ";"
            Variant vComma = false; // pas délimitateur virgule
            Variant vSpace = false; // pas délimitateur espace
            Variant vOther = false; // pas délimitateur autre
            Variant vOtherChar = NULL ; // délimitateur Other non actif
     
            Variant vFieldInfo;     // On veut {{0,1},{10,1},{20,1},{34,1},{48,1},{60,1},{94,1},{112,1}}
            vFieldInfo = VarArrayCreate(OPENARRAY(int, (0, 7, 0, 1)), varInteger);
            vFieldInfo.PutElement(0,0,0); //on affecte 0 à la ligne 0 colonne 0 du tab
            vFieldInfo.PutElement(1,0,1); //on affecte 1 à la ligne 0 colonne 1 du tab
            vFieldInfo.PutElement(10,1,0); //on affecte 10 à la ligne 1 colonne 0 du tab
            vFieldInfo.PutElement(1,1,1); //on affecte 1 à la ligne 1 colonne 1 du tab
            vFieldInfo.PutElement(20,2,0); //on affecte 20 à la ligne 2 colonne 0 du tab
            vFieldInfo.PutElement(1,2,1); //on affecte 1 à la ligne 2 colonne 1 du tab
            vFieldInfo.PutElement(34,3,0); //on affecte 34 à la ligne 3 colonne 0 du tab
            vFieldInfo.PutElement(1,3,1); //on affecte 1 à la ligne 3 colonne 1 du tab
            vFieldInfo.PutElement(48,4,0); //on affecte 48 à la ligne 4 colonne 0 du tab
            vFieldInfo.PutElement(1,4,1); //on affecte 1 à la ligne 1 colonne 1 du tab
            vFieldInfo.PutElement(60,5,0); //on affecte 60 à la ligne 5 colonne 0 du tab
            vFieldInfo.PutElement(1,5,1); //on affecte 1 à la ligne 5 colonne 1 du tab
            vFieldInfo.PutElement(94,6,0); //on affecte 60 à la ligne 6 colonne 0 du tab
            vFieldInfo.PutElement(1,6,1); //on affecte 1 à la ligne 6 colonne 1 du tab
            vFieldInfo.PutElement(112,7,0); //on affecte 112 à la ligne 7 colonne 0 du tab
            vFieldInfo.PutElement(1,7,1); //on affecte 1 à la ligne 7 colonne 1 du tab
            try
            {
                    vMSExcel = Variant::GetActiveObject("Excel.Application");
            }
            catch(...)
            {
                    vMSExcel = Variant::CreateObject("Excel.Application");
     
            }
            Excel = 1;
            vMSExcel.OlePropertySet("Visible", true);
            vMSExcel.OlePropertySet("ScreenUpdating",true);
            Variant title = StringToOleStr("Ouvrir"); // titre à donner à la boite de dialogue
            Variant multiselect = true; // selection multiple autorisée
            fichier = vMSExcel.OleFunction("GetOpenFilename",EmptyParam, EmptyParam, title, EmptyParam, multiselect);
            if(fichier.IsArray())
            {
                    for(j=1 ; j<=fichier.ArrayHighBound(1) ; j++)
                    {
                            vFileName = fichier.GetElement(j);
                            vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                            vXLWorkbook = vXLWorkbooks.OleFunction("OpenText", vFileName.c_str(), vOrigin, vStartRow, vDataType, vTextQualifier, vConsecutiveDelimiter, vTab, vSemicolon, vComma, vSpace, vOther, vOtherChar, vFieldInfo);
                            vMSExcel.OlePropertySet("DisplayAlerts", false);//Désactive les alertes
                            vMSExcel.OlePropertySet("WindowState", -4140);//Minimise la fenêtre Excel
                            vFileName = "c:\\Affsiam\\test.csv";
                            Variant FileFormat = 6; // fichier CSV (extension .csv)
                            //FileFormat = -4158; //fichier TXT et separateur tabulation (extension .txt)
                            //FileFormat = 36; //fichier TXT et separateur espace (extension .prn)
                            //FileFormat = -4143; // valeur de xlNormal "sauvegarde sous format classeur excel"
                            // pour les autres format de sauvegarde faire un essai avec VBE
                            // creation d'un mot de passe protegeant l'ouverture du fichier
                            //Mot_passe = Unassigned; //"jpb"; // pour la protection du fichier
                            Variant Password = Unassigned; //Mot_passe; // mot de passe pour proteger le fichier
                            Variant WriteResPassword = Unassigned; //Mot_passe; // confirmation du mot de passe
                            Variant ReadOnlyRecommended = false; // fichier en lecture seule (False True Unassigned)
                            // creation d'une copie si le fichier existe deja
                            Variant CreateBackup = false;  //Unassigned; // creation d'une copie (False True Unassigned)
                            // fermeture d'un fichier (ouvert au format csv) au format xls
                            vFileName = "C:\\essais.csv";
                            vXLWorkbook.OleProcedure("Saveas", vFileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup);
                    }
            }
    }
    Ca bloque à la dernière ligne avec le message "EVariantTypeCastError Impossible de convertir le Variant de type boolean en type Dispatch"

    Merci d'avance ...

  13. #13
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut ptit fab:
    Tu t'ennuierais si Ole etait facile, et tu n'aurais pas le plaisir de poster
    Si ton fichier "C:\\essais.csv" existe deja je pense qu'il faut le supprimer avant la sauvegarde en programmation BCB ce n'est pas fait automatiquement.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Re,


    J'ai essayé mais ca ne change rien ...

    PS: si le serveur ole serait facile je vous demanderai d'autre chose comme est-il possible de créer un tableau pour gérer environ 50 objets image

    merci

  15. #15
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je serais disponible apres 17h30
    A+
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  16. #16
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Alors je sais que cela vient de
    vXLWorkbook.OleProcedure("Saveas"
    "vXLWorkbook" a pour valeur -1, alors qu'il devrait avoir {{ }} quand on pointe le curseur de souris en mode pas a pas.
    Je n'ai pas encore d'explication.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  17. #17
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Salut Blondelle,

    Bon j'ai réussi à sauvegarder le mon fichier txt en xls.

    J'ai relu la FaQ et j'ai lu que pour récupérer le chemin pour ouvrir un fichier il faut passer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            Variant title = StringToOleStr("Ouvrir"); // titre à donner à la boite de dialogue
            Variant multiselect = true; // selection multiple autorisée
            fichier = vMSExcel.OleFunction("GetOpenFilename",EmptyParam, EmptyParam, title, EmptyParam, multiselect);
    D'ailleurs il y a une erreur dans la FaQ par que il y a écrit :
    Cela n'est pas possible en pilotage OLE Excel (impossible de récupérer l'ensemble sélectionné car l'appel se fait par une 'OleProcedure' qui par définition ne renvoie pas de résultat). Nous sommes obligés de passer par le composant TExcelApplication
    Alors que j'y arrive bien par le serveur Ole

    Pour sauvegarder j'ai pensé que c'était le même problème donc j'ai essayé mais j'avais toujours l'erreur avec vXLWorkbook = -1

    En faite c'est tout simple pour ouvrir il faut simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vXLWorkbooks.OleFunction("OpenText", vFileName.c_str(), vOrigin, vStartRow, vDataType, vTextQualifier, vConsecutiveDelimiter, vTab, vSemicolon, vComma, vSpace, vOther, vOtherChar, vFieldInfo);
    C'est à dire ne pas mettre vXLWorkbook et pour sauvegarder il faut récupérer
    le Workbook grâce à cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vXLWorkbook = vXLWorkbooks.OlePropertyGet("Item", 1);
    Au final pour sauvegarder j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Variant FileFormat;
    FileFormat = -4143; // valeur de xlNormal "sauvegarde sous format classeur excel"
    Variant Password = Unassigned;
    Variant WriteResPassword = Unassigned;
    Variant ReadOnlyRecommended = false;
    Variant CreateBackup = false;
    Variant fichier2;
    vFileName = "c:\\Affsiam\\test.xls";
    fichier2 = vMSExcel.OleFunction("GetSaveAsFilename",vFileName.c_str(),EmptyParam, EmptyParam,"Enregistrer Sous",EmptyParam);
    Memo1->Text = fichier2;
    vXLWorkbook = vXLWorkbooks.OlePropertyGet("Item", 1);
    vXLWorkbook.OleProcedure("Saveas", fichier2, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup);
    Je vais quand même essayer de sauvegarder sans passer par la boîte d'Excel si j'y arrive je vous mets au courant.

    Voilà, en espérant que ca aidera d'autre personne.

    PS: je n'ai toujours pas résolu le problème pour copier coller mais bon je perds pas espoir ^^
    Sinon pas d'idée pour le tableau de Timage

  18. #18
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Re,

    Bon j'ai regardé pour sauvegarder, je pense que l'on est obligé de passer par la boite de sauvegarde d'Excel car j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vFileName = StringToOleStr("c:\\Affsiam\\test.xls");
    Et en mode pas à pas quand je passe le surseur sur cette ligne de code
    vFileName = {Data:'c:\Affsiam\test.xls'}
    Mais quand j'utilise la boite d'Excel
    fichier2 = {VOleStr: ...}

    @+

  19. #19
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je pense que ton probleme vient du fait que tu est dans une boucle il y a surement un classeur en preparation mais non defini ce qui provoque l'erreur, je pense qu'il faudrait voir en VBE si ce que tu veu faire est realisable, si oui enregistrer le code VBE et le traduire en BCB.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  20. #20
    En attente de confirmation mail
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Salut,

    Je ne pense pas que ça soit ça parce que j'essaye de faire un copier coller quand j'appuie sur un bouton et ca ne fonctionne toujours pas.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
            vCol=StringToOleStr("A");
            vLin=StringToOleStr(2);
            vWsRange=vCol+vLin;
            vWorksheet.OlePropertyGet("Range", vWsRange).OleFunction("Copy");
            vMSExcel.OlePropertySet("CutCopyMode",false);
            vCol=StringToOleStr("A");
            vLin=StringToOleStr(1);
            vWsRange=vCol+vLin;
            vWorksheet.OlePropertyGet("Range", vWsRange).OleFunction("Select");
            vWorksheet.OleProcedure("Paste");
    J'ai toujours l'erreur 'Une exception s'est produite'

    Merci d'avance

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA-Excel] Mise en forme d'un classeur
    Par snooopy007 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/07/2006, 18h37
  2. vb6 & excel : mise en forme d'une cellule
    Par couscoussier dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/03/2006, 18h12
  3. Mise en forme TXT
    Par niko40 dans le forum C++
    Réponses: 2
    Dernier message: 23/02/2006, 12h07
  4. [VBA][Excel] mise en forme conditionnelle
    Par titflocon dans le forum Access
    Réponses: 9
    Dernier message: 19/12/2005, 10h13
  5. [ACCESS-EXCEL] Mise en forme des tableaux
    Par mpascolo dans le forum Access
    Réponses: 4
    Dernier message: 20/10/2005, 16h03

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