Import Csv sous Excel 97

Import Csv sous Excel 97 - VB/VBA/VBS - Programmation

Marsh Posté le 04-09-2007 à 10:24:08    

Bonjour à tous :)
 
Je débute en VB et je cherche à faire un truc tout simple :
 
Je clique sur un bouton ( ça ça va encore :p ) qui me fait un l'import d'un fichier csv dans une feuille prédéfinie du classeur, le tout bien évidemment en remplaçant les ; par des colonnes distinctes.
 
Mon souci est que j'ai du mal à trouver un code pour faire ça. J'en ai trouvé un ou deux mais à chaque fois il y a une instruction qui pose pb ( genre la fonction split qui n'est pas sous excel 97 par exemple )
 
Pour résumer : import d'un fichier csv sur une feuille précise d'un classeur excel 97
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 04-09-2007 à 10:24:08   

Reply

Marsh Posté le 04-09-2007 à 10:31:51    

Je sais pas toi, mais quand j'ouvre un fichier csv par excel, il reconbnait le format et charge les infos dans les cases tout seul hein. Ou alors le séparateur de colonnes est pas le bon.

Reply

Marsh Posté le 04-09-2007 à 11:35:37    

Le but n'est pas d'ouvrir les fichiers sous excel ( on fait ouvrir > csv et il fait les colonnes toutes seules ) mais de l'importer dans un .xls déjà existant avec des feuilles déja existantes.
 
Si je fais ouvrir le .csv, il m'ouvre dans un nouveau classeur, moi je veux l'importer dans un classeur déjà existant.

Reply

Marsh Posté le 04-09-2007 à 14:24:44    

N'ayant pas 97 sera peut-être à adapter
Placer dans un Module

Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
 
Sub Tst97()
Dim Fichier As Variant
    ChDir ThisWorkbook.Path
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )
    If Fichier <> False Then Lire97 Fichier
End Sub
 
Private Sub Lire97(ByVal NomFichier As String)
Dim Chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim separateur As String * 1
 
    separateur = ";"
    Cells.Clear
    Application.ScreenUpdating = False
     
    Close
    NumFichier = FreeFile
 
    iRow = 0
    Open NomFichier For Input As #NumFichier
        Do While Not EOF(NumFichier)
            iCol = 1: iRow = iRow + 1
            Line Input #NumFichier, Chaine
            Ar = Split97(Chaine, separateur)
            For i = LBound(Ar) To UBound(Ar)
                Cells(iRow, iCol) = Ar(i)
                iCol = iCol + 1
            Next i
        Loop
    Close #NumFichier
     
    Application.ScreenUpdating = True
End Sub
 
Private Function Split97(ByVal s As String, ByVal sSep As String)
Dim Tableau() As String
Dim sStr As String, Pos As Integer
Dim i As Long, j As Long
    Erase Tableau
    sStr = s
    i = 1: j = 0
    Do While i < Len(sStr)
        If Mid(sStr, i, 1) = sSep Then
            ReDim Preserve Tableau(j)
            Pos = InStr(sStr, sSep)
            Tableau(j) = Left(sStr, Pos - 1)
            sStr = Right(sStr, Len(sStr) - Pos)
            j = j + 1: i = 0
        End If
        i = i + 1
    Loop
    ReDim Preserve Tableau(j)
    Tableau(j) = sStr
    Split97 = Tableau
End Function


Message édité par kiki29 le 05-10-2007 à 23:27:22
Reply

Marsh Posté le 04-09-2007 à 15:04:57    

j'avais trouvé un script dans ce genre qui me parait pas mal mais il me fait une erreur au niveau :
 
Ar = Split97(Chaine, separateur)
 
Erreur de compilation : impossible d'affecter à un tableau :(

Reply

Marsh Posté le 05-09-2007 à 08:49:28    

Peut-être que tes fichiers Csv nécessiteraient un Nettoyage du style
http://forum.hardware.fr/hfr/Progr [...] 7546_1.htm , encore à adapter puisque certaines instructions n'existent pas dans XL97


Message édité par kiki29 le 05-09-2007 à 23:07:47
Reply

Marsh Posté le 05-09-2007 à 09:19:56    

C'est le « Dim Ar() As String » qui pose problème
En Excel97 il faut écrire simplement « Dim Ar » (déclaration de type variant)

Voir plus bas.


Message édité par tegu le 05-09-2007 à 20:52:41
Reply

Marsh Posté le 05-09-2007 à 09:31:15    

Saint Cloud Tegu, et donc également le Tableau() du Split97, n'ayant plus 97 je n'ai pas pu le vérifier.@+


Message édité par kiki29 le 05-09-2007 à 21:14:28
Reply

Marsh Posté le 05-09-2007 à 20:56:26    

J'ai lu trop vite et confondu avec une autre particularité d'Excel97, désolé.
Le problème est la déclaration de la fonction Split97()
Elle doit renvoyer un tableau de String et sa déclaration devrait être

Private Function Split97(ByVal s As String, ByVal sSep As String) As String()

« Ar », ainsi que « Tableau » sont bien déclarés a priori (pas de Excel 97 sous la main).
Navré de la méprise.

Reply

Marsh Posté le 05-09-2007 à 22:40:43    

Solution testée sous XL97 ( sorti des décombres ) et XL2002  
Placer dans un Module

Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
 
Sub Tst97()
Dim Fichier As Variant
    ChDir ThisWorkbook.Path
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )
    If Fichier <> False Then Lire97 Fichier
End Sub
 
Private Sub Lire97(ByVal NomFichier As String)
Dim chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Sep As String * 1
Dim Debut As Long, Fin As Long
 
    Debut = GetTickCount
 
    Sep = ";"
    Cells.Clear
    Application.ScreenUpdating = False
 
    Close
    NumFichier = FreeFile
 
    iRow = 0
    Open NomFichier For Input As #NumFichier
    Do While Not EOF(NumFichier)
        iCol = 1: iRow = iRow + 1
        Line Input #NumFichier, chaine
        Split97 Ar(), chaine, Sep
        For i = LBound(Ar) To UBound(Ar)
            Cells(iRow, iCol) = Ar(i)
            iCol = iCol + 1
        Next i
    Loop
    Close #NumFichier
 
    Fin = GetTickCount
    Application.StatusBar = Format((Fin - Debut) / 1000, "0.00" )
    Application.ScreenUpdating = True
End Sub
 
Private Sub Split97(ByRef Ar() As String, ByVal s As String, ByVal sSep As String)
Dim Pos As Integer
Dim i As Long, j As Long
    Erase Ar
    i = 1: j = 0
    Do While i < Len(s)
        If Mid(s, i, 1) = sSep Then
            ReDim Preserve Ar(j)
            Pos = InStr(s, sSep)
            Ar(j) = Left(s, Pos - 1)
            s = Right(s, Len(s) - Pos)
            j = j + 1: i = 0
        End If
        i = i + 1
    Loop
    ReDim Preserve Ar(j)
    Ar(j) = s
End Sub


Message édité par kiki29 le 05-10-2007 à 23:27:05
Reply

Marsh Posté le 05-09-2007 à 22:40:43   

Reply

Marsh Posté le 06-09-2007 à 10:50:52    

Super ca fonctionne :)
 
Merci Bcp :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed