Import dans une partie des colonnes d'un tableau (VBA)

Bonjour
Je souhaite pouvoir importé dans les n première colonne d' tableau Exel un fichier CSV.
les colonnes restante du tableau contienne des formule que je souhaite conserver et ne pas écraser.
je m'en sortais jusque la en vidant le tableau et en copiant collant dans les première case.
Je souhaite simplifier la manœuvre a l'aide d'un scripte vba.
J'ai donc réalisé le scripte ci dessous :
Function UpdateTableauCSV(MonFichier As String, table As String, NBCol As Integer)
    Application.ScreenUpdating = False
    If Range(table).ListObject.ListRows.Count > 0 Then
        Range(table).ListObject.DataBodyRange.Delete
    End If
    Dim ContenuLigne As Variant
    Dim IndexFichier As Integer
    IndexFichier = FreeFile()
    Open MonFichier For Input As #IndexFichier
    Line Input #IndexFichier, ContenuLigne
    While Not EOF(IndexFichier)
        Line Input #IndexFichier, ContenuLigne
        Dim tblRow As Range
        Set tblRow = Range(table).ListObject.ListRows.Add.Range
        With tblRow
            For i = 1 To NBCol
                .Cells(i) = Split(ContenuLigne, ";")(i - 1)
            Next
        End With
    Wend
    Close #IndexFichier
    Application.ScreenUpdating = True

End Function

Private Sub UpdateDepuisCSV_Click()
    UpdateTableauCSV "K:\Public\BENGLOO\test exel\sourceCSV.csv", "Tableau1", 10
End Sub
image
5test.xlsm (31.90 Ko)
5sourcecsv.csv (379.00 Octets)
ce scripte fonctionne mais est beaucoup trop lent comme je travaille sur des tableau de 3000 ligne et 25 colonne

j'ai déjà essayé d'affecter le tableau directement comme ci dessous , pour réduire la complexité mais cela écrase mes dernière formule de colonne que je souhaite conserver
.Cells = Split(ContenuLigne, ";"

des optimisations son elle possible ?

je peux travaillé avec un import exel au lieux de csv si besoin.

Je m'en remet à vos conseilles .

merci d'avance

bonjour,

Function UpdateTableauCSV(MonFichier As String, table As String, NBCol As Integer)
     Dim ContenuLigne As Variant, IndexFichier As Integer, Res()

     With Range(table).ListObject
          If .ListRows.Count > 1 Then .DataBodyRange.Offset(1).Resize(.ListRows.Count - 1).Delete               'vider le tableau sauf ligne1
          On Error Resume Next
          .DataBodyRange.SpecialCells(xlConstants).ClearContents     'effacer tout sauf les formules
          On Error GoTo 0

          IndexFichier = FreeFile()
          Open MonFichier For Input As IndexFichier
          a = Split(Input$(LOF(IndexFichier), IndexFichier), vbCrLf)     'lire et séparer les données au "saut de ligne"  ici c'est ascii 13+10 (mais ce n'est pas toujours comme ca !!!!)
          Close #fileNo     'fermer le fichier

          ReDim Res(1 To UBound(a), NBCol-1)     'préparer matrice pour output, de manière qu'il ne sait pas écraser les formules
          For i = 1 To UBound(a)
               sp = Split(a(i), ";")
               For j = 0 To Application.Min(UBound(sp), UBound(Res, 2))
                    Res(i, j) = Trim(sp(j))
               Next
          Next

          If UBound(res) > 0 Then .ListRows.Add.Range.Range("A1").Resize(UBound(Res), UBound(Res, 2) + 1).Value = Res     'seulement une fois écrire vers la feuille = plus vite

     End With

End Function

Private Sub UpdateDepuisCSV_Click()
     'UpdateTableauCSV "K:\Public\BENGLOO\test exel\sourceCSV.csv", "Tableau1", 10
     UpdateTableauCSV ThisWorkbook.Path & "\sourceCSV.csv", "Tableau1", 10   '>>>>>>>>>   pour moi

End Sub

Merci beaucoup pour ta réponse je teste ça

le scripte que vous aviez donné avais visiblement quelque bug pour des tableau grand

j'ai finalement bricolé la solution si dessous

Function UpdateTableauCSV(tableDest As String, RepSource As String, ficSource As String, ficDest As String)
    Dim tbl As Range
    Application.ScreenUpdating = False
    If Range(tableDest).ListObject.ListRows.Count > 0 Then
        If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
            ActiveSheet.ShowAllData
        End If
        Range(tableDest).ListObject.DataBodyRange.Delete
    End If
    Workbooks.OpenText Filename:=(Sheets("date update").Cells(10, "B").Value) & ficSource, Origin:=65001, DataType:=xlDelimited, Other:=True, OtherChar:=";", Local:=True
    Set tbl = ActiveCell.CurrentRegion
    tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select
    Selection.Copy
    Application.DisplayAlerts = False
    Workbooks(ficSource).Close savechanges:=False
    Range(tableDest).Select

    ActiveSheet.Paste
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Function

ces bugs, c'était avec ce "sourceCSV.csv" ou avec un autre CSV ? à quelle ligne ?

Mais si cela fonctionne maintenant ...

sur le sourceCSV.CSV il y'avait des ligne vide en plus qui apparaissais à la fin et au début du tableau en plus de l'import , je me souvient plus des lignes il falait juste décalé deux indice dans le code , par contre quand j'essayé avec mon fichier plus lourd, chose qui n'avait pas été pris en compte et qu'il puisse y avoir d'autre tableau en dessous et ta méthode d'insertion les écrasé au lieux de décaler. j'avoue ne pas avoir plus testé ta solution et ces performance.

mis au propre j'en suis arrivé ça .

Function UpdateTableauCSV(tableDest As String, ficSource As String)
    Dim tbl As Range
    Application.ScreenUpdating = False
    If Range(tableDest).ListObject.ListRows.Count > 0 Then
        If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then
            ActiveSheet.ShowAllData
        End If
        Range(tableDest).ListObject.DataBodyRange.Delete
    End If
    Workbooks.OpenText Filename:=(Sheets("date update").Cells(1, "B").Value) & ficSource, Origin:=65001, DataType:=xlDelimited, Local:=True, TextQualifier:=xlTextQualifierDoubleQuote, semicolon:=True
    Set tbl = ActiveCell.CurrentRegion
    tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select
    Selection.Copy
    Application.DisplayAlerts = False
    Workbooks(ficSource).Close savechanges:=False
    Range(tableDest).Select

    ActiveSheet.Paste
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Function

Le seul beug pas trop dérangeant est que le csv ne peux pas contenir de ";" à l'intérieur de ces chaine de text sans quoi il l'interprète en deux champ , je pense changer le séparateur du csv en un caractère improbable comme ‡ pour esquiver le problème .

merci de ton aide en tout cas .

Rechercher des sujets similaires à "import partie colonnes tableau vba"