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

VB.NET Discussion :

Conversion multiple de fichiers


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut Conversion multiple de fichiers
    Bonjour à tous,

    Voilà mon soucis:

    J'ai réussi à coder une application capable d'ouvrir un fichier Excel, récupérer 2 colonnes, puis créer et écrire ces 2 colonnes séparées d'un ";" dans un fichier texte. J'aimerai maintenant, de la même manière, pouvoir faire tourner ce programme pour TOUS les fichiers d'un même dossier. Merci d'avance pour l'aide précieuse que vous pourriez m'apporter sur le sujet.

    Voici mon code actuel:

    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
    Imports System.IO
    Imports Microsoft.Office.Interop
     
    Public Class Form1
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BT_CONVERSION.Click
     
            Dim xlApp As New Excel.Application
            Dim xlWb As Excel.Workbook
            Dim xlSh As Excel.Worksheet
            Dim colonne_outil(Reglages.TB_OUTIL2.Text) As String
            Dim colonne_cotation(Reglages.TB_OUTIL2.Text) As String
            xlWb = xlApp.Workbooks.Open(Reglages.TB_EXCEL.Text)
            xlSh = xlWb.Worksheets(1)
            Dim sw As New StreamWriter(Reglages.TB_TEXTE.Text)
            For i As Integer = 0 To colonne_outil.Length - 1
                colonne_outil(i) = xlSh.Cells(i + Reglages.TB_DEBUT.Text, Reglages.TB_OUTIL.Text).Value 'Format du type (Ligne, Colonne)
                colonne_cotation(i) = xlSh.Cells(i + Reglages.TB_DEBUT.Text, Reglages.TB_COTATION.Text).Value
                If Not IsNumeric(colonne_cotation(i)) Then i = i + 1
                If colonne_outil(i) Is Nothing Or Not IsNumeric(colonne_outil(i)) Then i = i + 1 Else sw.WriteLine(colonne_outil(i) & ";" & colonne_cotation(i))
            Next
            sw.Close()
     
        End Sub
     
        Private Sub BT_REGLAGES_Click(sender As Object, e As EventArgs) Handles BT_REGLAGES.Click
            Reglages.Show()
        End Sub
     
    End Class

  2. #2
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Salut,
    Pour avoir une fenêtre de sélection d'un dossier : FolderBrowserDialog
    Pour obtenir une liste de fichiers dans un dossier : DirectoryInfo.GetFiles

    Bon code...

  3. #3
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Il te faudra également utiliser une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For each .... Next
    Et surtout ne pas oublier à chaque tour de boucle :

    --> de fermer ton classeur :

    --> de quitter ton instance :

    A+

  4. #4
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Salut,
    Merci beaucoup pour vos réponses, j'arrive maintenant à convertir plusieurs fichiers dans un dossier ! Cependant, nouveau problème que je n'arrive pas à résoudre: j'ai 3 fichiers dans mon dossier, le programme convertit bien les 2 premiers et s'arrête au milieu du 3ème avec cette erreur : " "System.IndexOutOfRangeException*: 'L'index se trouve en dehors des limites du tableau.' ". Auriez-vous une piste ?

    EDIT: Quand je passe le 3eme fichier seul, la conversion marche sans problème..

    Voici le programme : (ligne où ça bloque spécifiée en commentaire)

    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
    Imports System.IO
    Imports Microsoft.Office.Interop
     
    Public Class Form1
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BT_CONVERSION.Click
     
            Dim Excel_App As New Excel.Application
            Dim Excel_Wb As Excel.Workbook 
            Dim Excel_Ws As Excel.Worksheet
            Dim colonne_outil(Reglages.TB_OUTIL2.Text) As String 
            Dim colonne_cotation(Reglages.TB_OUTIL2.Text) As String 
            Dim Fichiers As String() = Directory.GetFiles(Reglages.TB_DOSSIER.Text) 
            Dim Excel As String 
            For Each Excel In Fichiers 
                Excel_Wb = Excel_App.Workbooks.Open(Excel) 
                Excel_Ws = Excel_Wb.Worksheets(1) 
                Dim Fichier_txt As New StreamWriter(Excel & ".txt") 
                For i As Integer = 0 To colonne_outil.Length - 1
                    colonne_outil(i) = Excel_Ws.Cells(i + Reglages.TB_DEBUT.Text, Reglages.TB_OUTIL.Text).Value
                    colonne_cotation(i) = Excel_Ws.Cells(i + Reglages.TB_DEBUT.Text, Reglages.TB_COTATION.Text).Value 
                    If Not IsNumeric(colonne_cotation(i)) Then i = i + 1 
                    If colonne_outil(i) Is Nothing Or Not IsNumeric(colonne_outil(i)) Then i = i + 1 Else Fichier_txt.WriteLine(colonne_outil(i) & ";" & colonne_cotation(i)) 'Bloque sur cette ligne au niveau de colonne.outil is Noting Or Not IsNumeric
                Next
                Fichier_txt.Close() 
                Excel_Wb.Close()
                Excel_App.Quit()
     
            Next
     
        End Sub
     
        Private Sub BT_REGLAGES_Click(sender As Object, e As EventArgs) Handles BT_REGLAGES.Click
            Reglages.Show() 'Ouvrir la fenêtre réglages
        End Sub
    End Class

  5. #5
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Citation Envoyé par kravken Voir le message
    Cependant, nouveau problème que je n'arrive pas à résoudre: j'ai 3 fichiers dans mon dossier, le programme convertit bien les 2 premiers et s'arrête au milieu du 3ème avec cette erreur : " "System.IndexOutOfRangeException*: 'L'index se trouve en dehors des limites du tableau.' ". Auriez-vous une piste ?
    Cela veut dire que ta variable i dépasse la limite colonne_outil.Length - 1

    Je ne sais pas pourquoi tu boucles sur le nombre de caractère d’une chaine de texte. Je soupçonne que lorsque que tu fais If Not IsNumeric(colonne_cotation(i)) Then i = i + 1. Tu dépasses la limite. Pourquoi tu boucles sur chaine de texte et tu mets une condition sur une autre qui modifie le numérateur de la boucle ?

  6. #6
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Les colonnes outil et colonnes cotations peuvent être composées de texte que je ne dois pas extraire dans mon fichier .txt, donc je les déclare en string.

    Ce que je voudrais faire est de balayer toutes les valeurs de colonne outil (dans mon fichier excel) et les écrire dans mon fichier texte, et aussi récupérer les valeurs de colonnes cotation pour, de même, les écrire sur le fichier texte. Cependant, lorsque les cellules sont composées de texte ou d'un blanc (et non d'une valeur numérique), je passe à la ligne de mon tableau excel d'après.

    Je pense que ma manière de faire n'est pas la mieux, tu n'aurais pas des conseils ? Peut être qu'un boucle "tant que i n'est pas arrivé la fin du tableau" serait plus appropriée ? (même si je ne sais pas comment l'écrire en vb, je suppose que c'est possible)

  7. #7
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Essaye cela (Je n'ai pas eu le temps de tester ) :
    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
    Imports System.IO
    Imports Microsoft.Office.Interop
     
    Public Class Form1
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BT_CONVERSION.Click
     
            Dim Excel_App As New Excel.Application
            Dim Excel_Wb As Excel.Workbook 
            Dim Excel_Ws As Excel.Worksheet
            Dim colonne_outil(Reglages.TB_OUTIL2.Text) As String 
            Dim colonne_cotation(Reglages.TB_OUTIL2.Text) As String 
            Dim Fichiers As String() = Directory.GetFiles(Reglages.TB_DOSSIER.Text) 
            Dim Excel As String
     
            For Each Excel In Fichiers 
                Excel_Wb = Excel_App.Workbooks.Open(Excel) 
                Excel_Ws = Excel_Wb.Worksheets(1) 
                Dim Fichier_txt As New StreamWriter(Excel & ".txt") 
                Dim Ligne_fin_donnees As Integer, nColOutil As Integer = 1, nColCotation As Integer = 2 'Paramètre ici le numéro de tes colonnes
                Dim Cellule_depart As Range = Excel_Ws.Range("A1") 'Ici je suppose que ton tableau démarre en A1. Tu peux changer la cellule dde départ pour par exemple éviter les entêtes
                Dim Plage_Outil as Range, Plage_Cotation as Range
     
                Ligne_fin_donnees = Cellule_depart.End(XlDirection.xlDown).Row
                Plage_Outil = Excel_Ws.Range(Excel_Ws.Cells(Cellule_depart.Row, nColOutil,) Excel_Ws.Cells(Ligne_fin_donnees, nColOutil))
     
                For n As Integer = Cellule_depart.Row To Plage_Outil.Rows.Count
                    Cellule_Outil = Excel_Ws.Cells(n, nColOutil)
                    Cellule_Cotation = Excel_Ws.Cells(n, nColCotation)
                    If Not IsNothing(Cellule_Outil.Value) And IsNumeric(Cellule_Outil.value) Then
                        Fichier_txt.WriteLine(Cellule_Outil.Value & ";" & Cellule_Cotation.Value)
                    End If
                Next
     
                Fichier_txt.Close() 
                Excel_Wb.Close()
                Excel_App.Quit()
     
            Next 
        End Sub
     
        Private Sub BT_REGLAGES_Click(sender As Object, e As EventArgs) Handles BT_REGLAGES.Click
            Reglages.Show() 'Ouvrir la fenêtre réglages
        End Sub
    End Class

  8. #8
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Ca à l'air de bien marcher sur les quelques tests que j'ai pu faire, merci beaucoup!
    Tu pourrais expliquer ta démarche rapidement stp pour que je comprenne mieux?

  9. #9
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Citation Envoyé par kravken Voir le message
    Tu pourrais expliquer ta démarche rapidement stp pour que je comprenne mieux?
    Envoi nous ton code final et dis moi ce que tu ne comprend pas. Je te le commenterai.

  10. #10
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    C'est bon j'ai finalement bien compris ta démarche, merci beaucoup pour ton aide, sujet résolu!

  11. #11
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Finalement, il y a un problème dans le code: la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne_fin_donnees = Cellule_depart.End(XlDirection.xlDown).Row
    Cette ligne de code ne renvoie pas systématiquement à la dernière ligne du fichier, et je n'arrive pas bien à comprendre pourquoi, as tu une alternative ?

    Merci d'avance.

    EDIT: je pense que la fonction définit la fin de la colonne lorsqu'il y a une cellule vide, or mon tableau comporte parfois des cellules vides mais j'aimerai que le programme continue à tourner quand même, existe t'il une autre fonction pour renvoyer à la dernière ligne du tableau?

  12. #12
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Citation Envoyé par kravken Voir le message
    EDIT: je pense que la fonction définit la fin de la colonne lorsqu'il y a une cellule vide, or mon tableau comporte parfois des cellules vides mais j'aimerai que le programme continue à tourner quand même, existe t'il une autre fonction pour renvoyer à la dernière ligne du tableau?
    Salut,
    C'est bien cela.
    Soit la colonne est remplie de façon homogène, soit tu connais le nombre de lignes. Si non, on ne peut le deviner...

    Modification : Si ton tableau est un tableau nommé dans Excel tu peux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MaPlage As Range = FeuilleExcel.ListObjects(NomDeTonTableau).ListColumns(NomDeTaColonne).DataBodyRange
    For n As Integer = 0 To MaPlage.Rows.Count
       '(...)
    Next

  13. #13
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Je n'ai pas testé ce que tu me proposes mais j'ai trouvé une alternative assez intéressante (autrement dit qui marche) bien que le code soit un peu "brut" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne_fin_donnees = Excel_Ws.Range("A65536").End(XlDirection.xlUp).Row
    De plus je t'avoue que je ne comprend pas vraiment ton code, du moins je ne comprend pas le rapport avec le fait de récupérer la dernière ligne de la colonne...(je suis sûrement encore trop peu expérimenté en vb)

  14. #14
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Regarde cela et enfin ceci.
    Cela te permettra de nommée une plage. Ainsi, tu peux grâce à ce nom, connaitre facilement le nombre de ligne de cette plage et donc boucler sur chaque ligne.

  15. #15
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Avril 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Avril 2019
    Messages : 10
    Par défaut
    Effectivement méthode très intéressante, j'y penserai à l'avenir, c'est vrai que ça reste plus simple et optimisé que le code que j'utilise actuellement. Cependant dans mon cas il se trouve que j'ai beaucoup beaucoup (plus de 500) fichiers excel, de plus je n'ai pas la main dessus (pas les droits de modification) donc je dois tout coder en dur!
    En tout cas, merci beaucoup pour l'aide précieuse que tu m'as apporté

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2006, 11h58
  2. Conversion d'un fichier texte unix -> dos
    Par lejert dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 15/11/2005, 15h59
  3. Conversion d un fichier php en ini
    Par gilles641 dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2005, 16h54
  4. [JAR]conversion projet en fichier JAR
    Par alain34270 dans le forum Général Java
    Réponses: 3
    Dernier message: 08/06/2005, 15h29
  5. Conversion d'un fichier dos vers windows ?
    Par elitost dans le forum Windows
    Réponses: 4
    Dernier message: 10/02/2005, 17h42

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