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

Macros et VBA Excel Discussion :

Besoin d'aide pour extraire les données d'un csv [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut Besoin d'aide pour extraire les données d'un csv
    Bonjour à tous,


    Je travaille sur une macro qui, grâce à un bouton, permet d'aller chercher un fichier csv dont le nom et l'emplacement sont variables.

    Ce fichier est composé d'un grand nombre de lignes telle que celle-ci :
    "_93_XT";"d20";"2200";"23";"1";"93028_02;Rem1";"1"

    Avec ma macro, ce fichier s'ouvre dans un nouveau classeur Excel et le chiffre qui est écrit dans la colonne C (dans l'exemple c'est donc 2200), doit être remplacé par une autre valeur (suite à des recherches dans mon fichier principal) dans une nouvelle version de ce fichier csv.

    Les valeurs des autres colonnes ne changent pas.

    Pendant la macro, le nouveau csv est créé avec les valeurs converties puis ouvert à la fin sous Notepad++.

    La macro fonctionne, seulement je me demande si il est possible d'arriver au même résultat sans que le fichier csv de départ sois affiché car il est inutile de le visualiser.

    J'ai essayé pas mal de méthodes mais çà coince toujours.

    Merci par avance à celui ou celle qui pourrait m'aider !




    Le premier code se situe dans un Userform afin d'aller chercher le CSV puis de lancer une autre macro "Transposer_2"
    Certaines des variables sont déclarées dans Option Explicit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub Valider_Click()
     
    Set Autorib= ThisWorkbook
    Unload UserForm2
    Start_rib = Application.GetOpenFilename("Fichiers csv, *.csv")
        If Start_rib <> False Then
            Transposer_2 Start_rib
        End If
     
    End Sub

    Voici le code de la seconde macro :

    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
    Public Sub Transposer_2(ByVal sNomFichier As String)
     
    Dim PtSource As Range, LPtSource As Range, Pos_source As Range, LPos_source As Range, Pos_cible As Range, LPtCible As Range, PtCible As Range
     
    Workbooks.OpenText Filename:=Start_rib, Origin:=xlWindows, _
    StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
     
    Set Test_Source = Autorib.Sheets("Transposer").Range("b3")
    Set Projet = Autorib.Sheets("Transposer").Range("d1")
     
    If Test_Source = "TCA" Then
    CTS = 2
    PTS = 1
    End If
    If Test_Source = "TCB" Then
    CTS = 3
    PTS = 2
    End If
    If Test_Source = "TCC" Then
    CTS = 4
    PTS = 3
    End If
    If Test_Source = "TCD" Then
    CTS = 5
    PTS = 4
    End If
     
    If Test_Cible = "TCA" Then
    CTC = 1
    End If
    If Test_Cible = "TCB" Then
    CTC = 2
    End If
    If Test_Cible = "TCC" Then
    CTC = 3
    End If
    If Test_Cible = "TCD" Then
    CTC = 4
    End If
     
    Coffre = Autorib.Sheets("Disposition").Range("b1")
    EndLigne = Range("A" & Rows.Count).End(xlUp).Row
     
    NomFichier = "C:\Users\" & Environ("username") & "\AppData\Local\Temp\" & Projet & "_" & Test_Cible & "_" & Coffre & "_New.csv"
    Open NomFichier For Output As #1
     
    For i = 1 To EndLigne
     
        Set PtSource = Cells(i, 3)
        With Autorib.Sheets("Traitement").Columns(CTS)
            Set LPtSource = .Find(PtSource, LookIn:=xlValues, Lookat:=xlWhole)
            Set Pos_source = LPtSource.Offset(0, -PTS)
        End With
        With Autorib.Sheets("Transposer").Columns("d")
            Set LPos_source = .Find(Left(Pos_source, InStr(Pos_source, "_") - 1), LookIn:=xlValues)
            Set Pos_cible = LPos_source.Offset(0, Col_decal)
        End With
        With Autorib.Sheets("Traitement").Columns("a")
            Set LPtCible = .Find(Pos_cible & "_" & Mid(Pos_source, InStr(Pos_source, "_") + 1), LookIn:=xlValues)
            Set PtCible = LPtCible.Offset(0, CTC)
        End With
        Tmp = ""
        Tmp = Tmp & ";" & Range("a" & i).Text & ";" & Range("b" & i).Text & ";" & PtCible & ";" & Range("d" & i).Text & ";" & Range("e" & i).Text & ";" & Range("f" & i).Text & ";" & Range("g" & i).Text
        Print #1, Mid(Tmp, Len(";") + 1)
        Debug.Print Tmp
     
    Next
     
    Close #1
    Shell "C:\Program Files (x86)\Notepad++\notepad++.exe " & NomFichier, vbNormalFocus
     
    End Sub

  2. #2
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.


    Tu peux cacher le classeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Application.ScreenUpdating = False
     
        Workbooks.OpenText Filename:=Start_rib, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
     
        Set Wb_Csv = ActiveWorkbook
        Set f_CSV = ActiveSheet
     
         ActiveWindow.Visible = False
     
        ThisWorkbook.Activate

  3. #3
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut
    Bonjour et merci Docmarti pour cette réponse.

    Je vais faire le test !

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Pour aller avec ton code, ceci serait préférable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        Workbooks.OpenText Filename:=Start_rib, Origin:=xlWindows, _
        StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
     
        ActiveWindow.Visible = False

  5. #5
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut
    Bonjour et merci pour de bien vouloir m'aider.


    En ajoutant le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.Visible = False
    j'obtiens un message d'erreur à la ligne 55 de ma seconde macro "Argument ou appel de procédure incorrect"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set LPos_source = .Find(Left(Pos_source, InStr(Pos_source, "_") - 1), LookIn:=xlValues)


    J'étais en train d'essayer une autre approche, celui d'aller lire ligne par ligne le csv, sans l'ouvrir puis d'identifier la colonne où la valeur doit être changée à chaque fois.

    Faire la transposition de cette valeur par l'autre et faire le nouveau csv (pour cette partie, je m'en sors avec mon code de départ)

    J'ai repris un début de code de lecture de fichier :

    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
       Dim i As Long, j As Long, ar
       Dim sRepertoire As String, sNomFichier As String
       Dim iFile As Integer
       Dim data
       Dim ws As Worksheet
     
       sRepertoire = "C:\Users\.........\"             'A modifier car le nom et l'emplacement ne sont pas connus, je dois aller chercher manuellement le fichier
       sNomFichier = "..........csv"
     
     
       Set ws = Sheets("csv")          'A modifier car je ne veux pas écrire dans un onglet
       ws.UsedRange.Clear                 
     
       'Ouvrir le 1er fichier
       iFile = FreeFile
       Open sRepertoire & sNomFichier For Input As #iFile 
     
       'Lecture du fichier et écriture dans Excel
       i = 1
       Do Until EOF(iFile)
          Line Input #iFile, data
          ws.Cells(i, 1) = data
          i = i + 1
       Loop    
     
       Close #iFile
    Pour l'instant cette macro va lire le csv sans l'ouvrir (c'est déja un bon début !) puis retranscrit les données du fichier csv dans un onglet "csv".

    Là, ce n'est pas ce que je veux car je veux, je souhaiterais écrire directement dans le nouveau fichier csv.

    Autre soucis, cette nouvelle macro ne prend pas en compte le séparateur, toute la ligne se retrouve dans une cellule.

    Dans mon exemple :

    "_93_XT";"d20";"2200";"23";"1";"93028_02;Rem1";"1"

    La 3ème valeur "2200" est celle que je dois transposée.

    Donc je me demande si mon approche de vouloir faire ancien csv vers nouveau csv sans coller dans Excel est possible si je veux pouvoir analyser cette 3ème valeur et la modifier.

    Je vois aussi qu'il y a la possibilité de passer par l'objet FSO, est-ce intéressant dans mon cas ?

    Merci d'avance !

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par Thierry_59300 Voir le message


    En ajoutant le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.Visible = False
    j'obtiens un message d'erreur à la ligne 55 de ma seconde macro "Argument ou appel de procédure incorrect"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set LPos_source = .Find(Left(Pos_source, InStr(Pos_source, "_") - 1), LookIn:=xlValues)
    L'erreur doit venir du fait que le caractère "_" n'est pas trouvé dans Pos_source.

    Probablement parce que Cells(i, 3) n'est bien pas identifié dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PtSource = Cells(i, 3)

    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Workbooks.OpenText Filename:=Start_rib, Origin:=xlWindows, _
       StartRow:=1, DataType:=xlDelimited, Local:=True, Semicolon:=True
     
        Set f_CSV = ActiveSheet
        ActiveWindow.Visible = False
    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PtSource = f_CSV.Cells(i, 3)

  7. #7
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut [XL-2010] Besoin d'aide pour extraire les données d'un csv
    Bonjour et merci pour cette réponse.

    Désolé de ma réponse tardive, je n'avais pas pu faire l'essai avant.

    J'ai fait le test et effectivement çà répond bien à mon besoin le classeur est bien caché.

    Un tout grand merci Docmarti !

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

Discussions similaires

  1. Besoin d'aide pour extraire des données d'une feuille à l'autre
    Par fransky dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/11/2010, 15h03
  2. Besoin d'aide pour extraire des données
    Par marsumo dans le forum VBScript
    Réponses: 1
    Dernier message: 04/06/2008, 09h55
  3. Pour extraire les données d'un fichier texte
    Par Floch dans le forum Access
    Réponses: 2
    Dernier message: 02/05/2006, 15h01
  4. Besoin d'aide pour recuperer les fichier d'un projet
    Par barthelv dans le forum Applications et environnements graphiques
    Réponses: 9
    Dernier message: 14/04/2006, 11h47
  5. Réponses: 3
    Dernier message: 05/12/2005, 02h30

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