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

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    mars 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2018
    Messages : 2
    Points : 3
    Points
    3

    Par défaut VBA Importer des données texte à partir d'un fichier Xlsx Fermé *connexion ADODB

    Bonjour,
    Tout d'abord j'aimerai remercier SilkyRoad pour le partage de sa base de connaissance, et tout particulièrement la lecture et l'écriture dans les fichiers fermés.
    J'utilise de plus en plus cette méthode dans mes développements de reporting avec la programmation de TCD et graphiques temporaires.
    Cependant j'ai une question à laquelle je ne trouve pas de réponse.
    Je me suis créé une petite fonction générique pour importer mes données à partir d'un fichier Xlsx. bien entendu ce fichier est structuré en base de données( Titre de colonne sur la ligne 1, mots courts, pas d'espace, pas de caractères accentués, pas de signes opératoires, et pas de caractères spéciaux)

    Les arguments de la fonction sont:
    P$ Path,
    ff$ FileFrom,
    wsf SheetFrom,
    r Row ( ligne à partir de à laquelle on veut placer les données importées),
    c Column (colonne à partir de la quelle on veut placer les données importées),
    mFolder Optional Répertoire principal (\\Path\mFolder\),
    sFolder Optional Sous-répertoire (\\Path\mFolder\SFolder),
    Optional Clearcontents: si Vrai, Suppression des données éventuellement présentes dans la feuille qui va recevoir les données,
    rg$ nom du champ qui sera supprimé si Optional Clearcontents: = Vrai,
    La fonction Function X1cFileExists(f$) As Boolean permet tester si le fichier que l'on veut importer existe


    Tout cela fonctionne très bien, mais le problème est le suivant.
    si dans une des colonne une cellule contient du texte de plus de 255 caratères et que cette cellule se situe dans les 8 premières lignes du fichier importé alors tout va bien, et on pourra importer du texte de plus de 255 caratères dans les cellules de cette colonne.
    si dans les 8 premières lignes de notre fichier à importer aucune cellule ne possède de texte de plus de 255 caractères, alors la dimension est figée à maximum 255 caractères pour toutes les cellules de cette colonne.

    Savez-vous comment faire en sorte que le nombre de caractères ne soit pas limité, en utilisant cette méthode d'importation?
    Un grand merci à ceux qui pourrons orienter mes recherches ou me donner la solution.

    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
    Function X1cImportDataXlsx(P$, ff$, wsf$, wst$, r&, c&, Optional mFold$, Optional sFold$, Optional ClearContent As Boolean, Optional rg$)
    '99.21-Set Parameter to import Data From Xlsx File (XlOneClick: G.Charrault  Inspiration:  SilkyRoad)
        Dim i As Integer
        Dim wb As Workbook
        Dim ws As Worksheet
        Dim cn As ADODB.Connection
        Dim SQLText As String
        Dim rst As ADODB.Recordset
        Dim XlsxFileFrom As String
        Set wb = ThisWorkbook
        Set ws = wb.Worksheets(wst)
        FileFrom = ff
        If Len(FileFrom) < 5 Then FileFrom = FileFrom & ".xlsx"
        If UCase(Right(FileFrom, 5)) <> ".XLSX" Then FileFrom = FileFrom & ".xlsx"
        XlsxFileFrom = ""
        If Right(P, 1) <> "\" Then P = P & "\"
        If mFold <> "" Then
            If Right(mFold, 1) <> "\" Then P = P & mFold & "\"
        End If
        If sFold <> "" Then
            If Right(sFold, 1) <> "\" Then P = P & sFold & "\"
        End If
        XlsxFileFrom = P & FileFrom 'XlsxFile FullFileName
        If X1cFileExists(XlsxFileFrom) = False Then
            MsgBox ("file is not existing")
            ErrorExit = True
            Exit Function
        End If
        If ClearContent = True Then
            ws.Select
            ws.Cells.ClearContents
        Else
            Do While ws.Cells(r, c) <> ""
                r = r + 1
            Loop
        End If
        Set cn = New ADODB.Connection
        'Code to connect Xlsx File (2007-2010)
        With cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & XlsxFileFrom & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
     
      ' ----Une case à cocher ou checkBox (Chb_Message) dans une feuille Name: wsMenu qui permet d'afficher le chemin complet du fichier pour un debugging----
      ' If wsMenu.Chb_Message.Value = True Then MsgBox ("Import xlsx File From: " & XlsxFileFrom & Chr(10) & Chr(13) _
      '                                                  & "SheetFrom: " & wsf & Chr(10) & Chr(13) _
      '                                                   & "SheetTo: " & wst & Chr(10) & Chr(13))
      '                                                 
     
        SQLText = "SELECT * FROM [" & wsf & "$]"
        Set rst = New ADODB.Recordset
        Set rst = cn.Execute(SQLText)
        For i = 0 To rst.Fields.Count - 1
            ws.Cells(r, c + i) = rst.Fields(i).Name
        Next i
        ws.Cells(r + 1, c).CopyFromRecordset rst
        cn.Close
     
        Set rst = Nothing
        Set wb = Nothing
        Set cn = Nothing
        Set ws = Nothing
     End Function
     
    Function X1cFileExists(f$) As Boolean
    '99.13-Test If File Exist (XlOneClick: G.Charrault)
    'This function will test and return a boolean if the xml file exist
        X1cFileExists = Dir(f) <> ""
    End Function

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2012
    Messages
    9 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : avril 2012
    Messages : 9 699
    Points : 16 564
    Points
    16 564
    Billets dans le blog
    1

    Par défaut

    bonjour,
    en fait il n'existe pas de typage de cellules comme il existe un typage de champs dans une base de données.

    c'est ADO qui si colle, par apprentissage et effectivement la norme dit 8 ligne.

    il est possible d’augmenter ce paramètre en bricolant la base de registre de Windows. en revanche il est possible que ça affecte le performance.

    le chemin de l’enfer est semé de bonne intentions.

    en fait je dirais non.

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    mars 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2018
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Merci pour votre réponse. Je vais donc conserver ma solution de bricolage en créant une première ligne de formatage dans ma base avec dans la colonne que je souhaite avoir plus de 255 caractères une chaîne de caractères de plus de 255 du type “Forcer a plus de 255 caractères *********************Etc... et pour les autres colonnes le format que je souhaite. Pas très esthétique mais bon ça fonctionne. En tout cas merci pour cette réponse rapide.

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

Discussions similaires

  1. Importer des données a partir d'un fichier csv
    Par aimer_Delphi dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/05/2016, 18h46
  2. [XL-2003] Importer des données textes sans ouvrir un nouveau classeur
    Par brownthefou dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/05/2012, 19h52
  3. Réponses: 0
    Dernier message: 22/09/2009, 17h51
  4. [XL-2007] Importation des données texte
    Par taoufik007 dans le forum Excel
    Réponses: 1
    Dernier message: 14/07/2009, 08h43
  5. [Forum] Importer des données texte et excel
    Par chaffar dans le forum Outils
    Réponses: 9
    Dernier message: 30/04/2009, 14h38

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