Problème de récupération de valeur dans un fichier csv

fitzjames Messages postés 55 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 27 février 2009 - 25 févr. 2009 à 17:58
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 - 27 févr. 2009 à 19:42
Bonjour,

J'ai le souci suivant, je souhaiterai récupérer dans mon fichier 1 ligne particulière ex: ligne2.
Je sais pas trop comment m' y prendre ?

Les variables Navigateur, country, Networks et Network sont de type variant.
'=============================================================
'Ouverture fichier
'=============================================================
Public Sub Reseaux(Navigateur, Country, Networks, Network)


 'Lecture du fichier
Dim Fichier As String, Chemin As String
        Navigateur = ""
        Country = ""
        Networks = ""
        Network = ""
       
    Chemin = "C:\jeux"
    Fichier = "Reseau.csv"
    ' on verifie que le chemin et/ou le fichier specicifie sont bon
    If Not Dir(Chemin & Fichier) = "" Then
        Fichier = Chemin & Fichier
        LireCSV Fichier, Navigateur, Country, Networks, Network
    Else
        MsgBox "aucun fichier trouvé !", vbExclamation
        Exit Sub
    End If
End Sub
'===============================================================
' Lecture du fichier
'===============================================================
Private Sub LireCSV(ByVal NomFichier As String, Navigateur, Country, Networks, Network)
    Dim Navigator()
    Dim Pays()
    Dim Reseaux()
    Dim Reseau()
    Dim Chaine As String
    Dim Ar() As String
    Dim i As Long
    Dim NumFichier As Integer
    Dim Separateur As String * 1
   
    Separateur = ";"
    'Application.ScreenUpdating = False
    NumFichier = FreeFile
   
    Open NomFichier For Input As #NumFichier
   
    Do Until EOF(NumFichier)
   
        Line Input #NumFichier, Chaine
        Ar = Split(Chaine, Separateur)
        ReDim Preserve Navigator(i)
        Navigator(i) = Ar(0)
        ReDim Preserve Pays(i)
        Pays(i) = Ar(1)
        ReDim Preserve Reseaux(i)
        Reseaux(i) = Ar(2)
        ReDim Preserve Reseau(i)
        Reseau(i) = Ar(2)
        i = i + 1
       
    Loop
 Close #NumFichier
 'Application.ScreenUpdating = True
 
Navigateur = CVar(Navigator)
Country = CVar(Pays)
Networks = CVar(Reseaux)
Network = CVar(Reseau)


End Sub

Je pense que la partie qui me pose problème est en rose.

Merci d'avance pour votre aide.

[?] Estelle[8D]

11 réponses

cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
25 févr. 2009 à 18:22
Bonjour

Si au lieu de passer les parametres sans types (variant) tu les déclaraient au niveaux du module en String cela serait moins lourd pas de recopie à la sortie de LireCSV


"LireCSV" n'aurait qu'un paramétre et "Reseaux" aucun
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 févr. 2009 à 18:46
Salut
En effet, tes paramètres sont tantôt des String, tantôt des tableaux : Il faut choisir.
Exemple d'utilisation de tableau :

Private Sub maSub1()
    Dim a() As String
    Call maSub2(a)
    MsgBox a(5)
End Sub



Private Sub maSub2(ByRef monTableau() As String)
    ReDim monTableau(10)
    monTableau(5) = "Coucou"
End Sub




Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés





<hr />

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
25 févr. 2009 à 18:48
Bien sûr, ta deuxième ligne se retrouvera dans 
   a(1)
puisque les tableaux commencent à l'index 0 par défaut
0
fitzjames Messages postés 55 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 27 février 2009 1
26 févr. 2009 à 16:38
Bonjour,

Même si je met mes variables sont en string cela ne règle pas mon problème de ne récupérer que ma ligne 2.

Cordialement,
[?] Estelle[8D]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fitzjames Messages postés 55 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 27 février 2009 1
26 févr. 2009 à 16:48
Jack : Bien sûr, ta deuxième ligne se retrouvera dans 
   a(1)
puisque les tableaux commencent à l'index 0 par défaut

Mais pour a(1), je ne comprend pas trop bien comment ça marche ?
je veux juste récupérer la ligne 2
Mon tableau se présente comme cela :
IE; ES; II; IO
IE; ES; II; PO
FF;PT;YY;IO

Cordialement,
[?] Estelle[8D]
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
26 févr. 2009 à 17:16
Salut
Et pourquoi pas ça seulement:

  Open NomFichier For Input As #NumFichier   
        Line Input #NumFichier, Chaine   ' 1iere ligne
        Line Input #NumFichier, Chaine   ' 2ieme ligne
   Close #NumFichier
        Ar = Split(Chaine, Separateur)
        Navigateur = Ar(0)
        Country = Ar(1)
        Networks = Ar(2)
        Network = Ar(2)

 
CNTJC
0
fitzjames Messages postés 55 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 27 février 2009 1
27 févr. 2009 à 11:33
Bonjour,

Je ne comprend pas comment il identifie les lignes dans ton code ?

[?] Estelle[8D]
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
27 févr. 2009 à 12:16
Bonjour
S'il s'agit de récupérer une ligne particulière du fichier "CSV", il faut lire séquentiellement jusqu'à cette ligne et ça en bouclant sur le nombre de lignes représentant le numéro de la ligne voulue.

Private Sub LireCSV(ByVal NomFichier As String, Navigateur, Country, Networks, Network)
  Dim i As Long
  Open NomFichier For Input As #NumFichier   
    For i = 1 To NumLigne   
        Line Input #NumFichier, Chaine 
    Next i
   Close #NumFichier
        Ar = Split(Chaine, Separateur)
        Navigateur = Ar(0)
        Country = Ar(1)
        Networks = Ar(2)
        Network = Ar(2)
 End Sub

Salut
CNTJC
0
fitzjames Messages postés 55 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 27 février 2009 1
27 févr. 2009 à 14:39
bonjour,

J'ai le message d'erreur suivant :

[javascript:hhobj_3.Click() tableau] doit être affectée individuellement. Causes et solutions de cette erreur :

<li class= "LB1">Vous avez essayé par inadvertance d'affecter une valeur à une [javascript:hhobj_4.Click() variable] de tableau sans spécifier l'élément auquel la valeur devait être affectée.
Pour affecter une valeur à un élément de tableau, vous devez spécifier l'élément dans un indice. Par exemple, si
MyArray
est un tableau d'entiers, l'[javascript:hhobj_5.Click() expression]
MyArray = 5
est incorrecte, alors que l'expression qui suit est valide :

MyArray(UBound(MyArray)) = 5


</li><li class="LB1">Vous avez essayé d'affecter la totalité d'un tableau à un autre tableau. Si, par exemple,
Arr1
et
Arr2
sont deux tableaux différents, les deux affectations suivantes sont toutes deux incorrectes :
Arr1 = Arr2    ' Affectation incorrecte.
Arr1() = Arr2()    ' Affectation incorrecte.


Pour affecter un tableau à un autre, assurez-vous que le tableau à gauche de l'affectation est redimensionnable et que les types de tableaux sont compatibles.

Note    Vous pouvez placer la totalité d'un tableau dans un Variant et obtenir ainsi une variable de type variant contenant l'ensemble du tableau :

Dim MyArr As Variant
MyVar  = Arr2()


Vous pouvez ensuite référencer les éléments du tableau dans la variable de type variant avec une notation d'indice identique à celle d'un tableau ordinaire, par exemple :

MyVar(3) = MyVar(1) + MyVar(5)


</li>Pour plus d'informations, sélectionnez l'élément en question et appuyez sur F1 (sous Windows) ou sur AIDE (sur Macintosh).

il me faudrai une fonctionalité comme la fonction cells,

Do While Not EOF(NumFichier)
        iCol = 1
        iRow = 2
        Line Input #NumFichier, Chaine
        Ar = Split(Chaine, Separateur)
        For i = LBound(Ar) To UBound(Ar)
            Cells(iRow, iCol) = Ar(i)
            iCol = iCol + 1
        Next i
    Loop

existe t'elle ?

Merci d'avance

[?] Estelle[8D]
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 févr. 2009 à 19:02
Re
Dans ton code initial, tu fais une boucle de lecture, ligne par ligne, de ton fichier.
Chaque ligne est découpée et stockée dans des variables tableau dont l'index s'incrémente à chaque ligne.
Les éléments correspondant à la ligne 2 se trouvent donc dans chacune des variables dont l'index est 1.


Dans ma première réponse, je t'ai donné un exemple de passage de tableau en paramètre de Sub.
Inspire t-en pour corriger ton code, le type Variant ne règle pas toujours tout, soyons précis, cela évite les surprises :
Par exemple, tu fais un
   Navigateur = ""
VB pense donc que ta variable est une chaine.
Et plus loin, tu lui colles un tableau
Il n'est pas trop mal luné, il fera la conversion, mais attends toi un jour à ce que cela ne marche pas.


Si tu dois recevoir un tableau, définis tes variables en tableau
Apprends à les manipuler avec les instructions Dim, ReDim [Preserve] ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés


<hr />
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
27 févr. 2009 à 19:42
Bonsoir
Pourrais tu préciser ton attente. Tu parles de 2ième ligne de quoi?
S'agit-il du fichier "xxxx.CSV" ou du classeur dans lequel les données du dit fichier ont été copiées?
Dans ton dernier Post, il est question de d'écriture dans une feuille Excel, alors je te propose cette solution:

    Open NomFichier For Input As #NumFichier
  
    iRow = 2    ' référence ligne de début
    Do Until EOF(NumFichier)
        Line Input #NumFichier, Chaine
        Ar = Split(Chaine, Separateur)
        ReDim Preserve Navigator(i)
        Navigator(i) = Ar(0)
        ReDim Preserve Pays(i)
        Pays(i) = Ar(1)
        ReDim Preserve Reseaux(i)
        Reseaux(i) = Ar(2)
        ReDim Preserve Reseau(i)
        Reseau(i) = Ar(2)
        i = i + 1
        iCol = 1    ' référence colonne de début
        For i = LBound(Ar) To UBound(Ar)
            ' Ecriture dans la feuille active du classeur
            ActiveSheet.Cells(iRow, iCol).Value = Ar(i)
            iCol = iCol + 1     ' incrément sur les colonnes
        Next i
        iRow = iRow + 1     ' incrément sur les lignes
    Loop
 Close #NumFichier

  A+

CNTJC
0
Rejoignez-nous