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 :

Créer des feuilles Excel via compteurs


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Créer des feuilles Excel via compteurs
    Bonjour à tous,

    Voilà j'ai une windows form contenant 4 ListView de 50 cases, je les remplis progressivement et une fois le nombre de cases voulu remplies, je les vides et transferts les données dans un fichiers excel.
    Le probléme est que parfois j'ai plus de 200 cases à remplir, je voudrais donc pouvoir créer des worksheet excel dans le même fichier à la suite. Malheureusement j'obtiens toujours des erreurs . Un peu de code vous aidera à comprendre

    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
    'Appel de la fonction 
    TransfertExcel(Compteur)
     
     
    Public Function TransfertExcel(ByVal Compteurfeuille As Integer)
     
           '        '----------------------------------------
            '        'Procédure d'export vers le fichier excel
            '        '----------------------------------------
     
     
            Dim xlApp As Application
            Dim xlBook As Workbook
            Dim xlSheet As Worksheet
     
     
            xlApp = CType(CreateObject("Excel.Application"), Application)
              xlBook = xlApp.Workbooks.Open("D:\Lecteur Datamatrix Elts seuls\bin\Feuille no de serie.xls")
           *** xlSheet = CType(xlBook.Worksheets(Compteurfeuille), Worksheet)
     
     
           ' ici on affiche les résultat dans excel
            xlSheet.Application.Visible = False
     
            'Copie du tableau dans la feuille Excel
            xlSheet.Range("C3").Value = DateJour
            xlSheet.Range("C4").Value = Temperature
    J'obtiens l'erreur au niveau du triple asterix, où j'ai le message suivant:

    Une exception non gérée du type 'System.Runtime.InteropServices.COMException' s'est produite dans WindowsApplication1.exe

    Informations supplémentaires*: Index non valide.
    Mon index valait dans se cas là 2.


    Merci d'avance,

    Damien

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Pas oublier que Excel compte à partir de 1 et pas à partir de 0 (pour les colonne et les cellules, mais ptete aussi pour les feuilles).

    Autrement il faut essayer d'utiliser le nom de la feuille (string) plutôt que l'indice dans la liste.

    Ne pas oublier non plus qu'il y a des contraintes de caractère au niveau du nommage d'une feuille Excel. Faut donc en théorie vérifier la chaine pour éviter les noms illégaux.

    Je te conseille aussi de faire des .Save du classeur régulièrement, il y a en effet un bug dans certaines versions d'Excel (sur 2003 en tout cas) qui provoque une erreur si trop de feuilles sont crées sans sauvegarde du fichier.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    on peut attaquer excel par oledb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE Sheet1 (nomcol1 int, nomcol2 date)
    INSERT INTO Sheet1 VALUES (...)
    ca ne permet pas la mise en page comme depuis l'interop mais ca doit être plus performant

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut Compteur additif de feuilles à un classeur ouvert
    bonjour damdam

    voici un code qui repondra à tes soucis.
    Primo :quand tu appelles workbook.worksheets.add() c'est une fonction qui ne renvoie une feuille mais renvoie un boolean Success ou Echec.fais attention.
    Secundo:la feuille ajoute devient la feuille active.

    bref voici le code:

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    Imports Microsoft.Office.Interop.Excel
    Imports Microsoft.Office.Interop
    Imports System.IO
    Imports System.Management
    Imports System.Exception
    Imports System.Runtime.InteropServices
    Imports System.Reflection
     
    Public Class Form1
       'variable  en portee globale forme
        '
        Private xlBook As Workbook
        Private xlSheet As Worksheet
        Private xlApp As Excel.Application
     
        Private strChemin As String = Directory.GetCurrentDirectory & "\TESTCLASSEUR.xls"
        Private DateJour As Date
        Private Temperature As Double
        Private Compteur As Integer
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'EMPECHE MINIMIZE FORM (GENANT POUR USER)
            Me.TopMost = True
        End Sub
     
        'CHARGER LE CLASSEUR DE TRAVAIL
        Private Sub btnLoadWorkBook_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadWorkBook.Click
            Try
                'INIT FEUILLE ET CLASSEUR
                xlSheet = Nothing
                xlBook = Nothing
     
                'DEMARRE EXCEL
                xlApp = New Excel.Application
                'xlApp = CType(CreateObject("Excel.Application"), Application)
     
                'OUVRE CLASSEUR
                xlBook = xlApp.Workbooks.Open(strChemin)
                xlApp.Visible = True
     
            Catch ex As Exception
                MessageBox.Show("erreur " & ex.Message)
            End Try
        End Sub
     
        'AJOUTE FEUILLES TANT QUE CLASSEUR OUVERT
        Private Sub btnAddWorkSheet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddWorkSheet.Click
            'Appel de la fonction 
            DateJour = Date.Today.ToLongTimeString
            Temperature = 45.0
            Compteur = 0
            'si classeur toujours ouvert
            If xlApp IsNot Nothing And xlBook IsNot Nothing Then
                Compteur = TransfertExcel(Compteur)
                'AFFICHE NBRE  FEUILLES AJOUTEES
                Me.TextBox1.Text = Me.TextBox1.Text & xlSheet.Name & " - " & Compteur.ToString & vbCrLf
            End If
        End Sub
        Public Function TransfertExcel(ByVal Compteurfeuille As Integer) As Integer
            '        '----------------------------------------
            '        'Procédure d'export vers le fichier excel
            '        '----------------------------------------
     
            Try
                'NB:EXCEL AUGMENTE INDICE DE SA COLLECTION FEUILLES AUTO 
                'AJOUTE LA FEUILLE 
                xlBook.Worksheets.Add()
                xlSheet = xlBook.ActiveSheet
     
                'NBRE FEUILLE  APRES AJOUT NOUVELLE FEUILE 
                Compteurfeuille = xlApp.Worksheets.Count
     
                'LUI DONNE UN LABEL NOM POUR UTILISATEUR
                xlSheet.Name = "MAFEUILLE" & Compteurfeuille.ToString
     
                'ICI ON AFFICHE LES RÉSULTAT DANS EXCEL
                xlSheet.Activate()
                'COPIE DU TABLEAU DANS LA FEUILLE EXCEL
                xlSheet.Range("C3").Value = DateJour.ToLongDateString
                xlSheet.Range("C4").Value = Temperature.ToString
     
                'RENVOI NBRE  FEUILLES 
                Return Compteurfeuille
            Catch ex As COMException
                MessageBox.Show("erreur " & ex.ErrorCode & ex.Message)
            End Try
            Return Compteurfeuille
        End Function
     
        'SAUVE ET QUITTE
        Private Sub btnSaveQuitWorkBook_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveQuitWorkBook.Click
            If xlApp IsNot Nothing Then
                xlBook.Save()
                xlBook = Nothing
                xlSheet = Nothing
                xlApp.Quit()
                xlApp = Nothing
            End If
        End Sub
     
     
    End Class
    Bon code....

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci MABROUKI pour ta réponse, ainsi qu'aux autres qui m'ont répondu.

    Ton programme marche que si un fichier excel TESTCLASSEUR.xls existe déjà dans notre répertoire. Malheureusement, je souhaiterai le généré puis écrire dedans, par la suite je souhaiterai le créée, l'imprimer et ensuite le supprimer.

    Pour l'impression et la suppression c'est bon, c'est juste pour la création à partir de l'adresse où je coince.

    J'ai essayé un petit code simple avant pour essayer:


    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
     
    Public Class Form1
       'variable  en portee globale forme
     
     
    Private xlBook As Workbook
    Private xlSheet As Worksheet
    Private xlApp As Excel.Application
    Private strChemin As String = Directory.GetCurrentDirectory & "\TESTCLASSEUR.xls"
     
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
     
    ***xlBook.Worksheets.Add(strChemin)
    xlSheet = xlBook.ActiveSheet
     
     
    xlSheet.Range("C3").Value = "Test de création du fichier excel"
     
     
    xlBook.Save()
    xlBook = Nothing
    xlSheet = Nothing
    xlApp.Quit()
    xlApp = Nothing
     
    End Sub
     
    End Class


    J'obtiens une erreur au niveau des 3 astérix avec le message suivant:

    Une exception non gérée du type 'System.NullReferenceException' s'est produite dans New_Excel.exe

    Informations supplémentaires*: La référence d'objet n'est pas définie à une instance d'un objet.
    Merci d'avance.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    le plus simple c'est d'aller dans excel, tu démarres l'enregistrement d'une macro tu fais ce que tu veux faire et tu récupères le code de la macro pour le mettre dans vb.net (en l'adaptant un peu)

    tu peux donc aller dans excel et faire un macro ou tu créés un nouveau fichier et créé un sheet

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut creer un classeur
    bonjour
    j'ai repondu à ton premier poste car tu voulais ajouter des feuilles à ton classeur
    si tu veux en plus creer un nouveau classeur le meme code est à modifier legerement comme suit:
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
     
    Imports Microsoft.Office.Interop.Excel
    Imports Microsoft.Office.Interop
    Imports System.IO
    Imports System.Management
    Imports System.Exception
    Imports System.Runtime.InteropServices
    Imports System.Reflection
     
    Public Class Form1
       'variable  en portee globale forme
        '
        Private xlBook As Workbook
        Private xlSheet As Worksheet
        Private xlApp As Excel.Application
     
        Private strChemin As String = Directory.GetCurrentDirectory & "\TESTCLASSEUR.xls"
        Private DateJour As Date
        Private Temperature As Double
        Private Compteur As Integer
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'EMPECHE MINIMIZE FORM (GENANT POUR USER)
            Me.TopMost = True
        End Sub
     
        'CHARGER LE CLASSEUR DE TRAVAIL
        Private Sub btnLoadWorkBook_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadWorkBook.Click
            Try
                'INIT FEUILLE ET CLASSEUR
                xlSheet = Nothing
                xlBook = Nothing
     
                'DEMARRE EXCEL
                xlApp = New Excel.Application
                'xlApp = CType(CreateObject("Excel.Application"), Application)
     
                ' OUVRE CLASSEUR
                ' devient  CREE UN NOUVEAU CLASSEUR(remplace Open par Add       
                ' ca ressemble un peu à ce qu'on à fait pour la feuille)
                ----------------------------------------------------------
                xlBook = xlApp.Workbooks.Add()
                xlApp.Visible = True
     
            Catch ex As Exception
                MessageBox.Show("erreur " & ex.Message)
            End Try
        End Sub
     
        'AJOUTE FEUILLES TANT QUE CLASSEUR OUVERT
        Private Sub btnAddWorkSheet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddWorkSheet.Click
            'Appel de la fonction 
            DateJour = Date.Today.ToLongTimeString
            Temperature = 45.0
            Compteur = 0
            'si classeur toujours ouvert
            If xlApp IsNot Nothing And xlBook IsNot Nothing Then
                Compteur = TransfertExcel(Compteur)
                'AFFICHE NBRE  FEUILLES AJOUTEES
                Me.TextBox1.Text = Me.TextBox1.Text & xlSheet.Name & " - " & Compteur.ToString & vbCrLf
            End If
        End Sub
        Public Function TransfertExcel(ByVal Compteurfeuille As Integer) As Integer
            '        '----------------------------------------
            '        'Procédure d'export vers le fichier excel
            '        '----------------------------------------
     
            Try
                'NB:EXCEL AUGMENTE INDICE DE SA COLLECTION FEUILLES AUTO 
                'AJOUTE LA FEUILLE 
                xlBook.Worksheets.Add()
                xlSheet = xlBook.ActiveSheet
     
                'NBRE FEUILLE  APRES AJOUT NOUVELLE FEUILE 
                Compteurfeuille = xlApp.Worksheets.Count
     
                'LUI DONNE UN LABEL NOM POUR UTILISATEUR
                xlSheet.Name = "MAFEUILLE" & Compteurfeuille.ToString
     
                'ICI ON AFFICHE LES RÉSULTAT DANS EXCEL
                xlSheet.Activate()
                'COPIE DU TABLEAU DANS LA FEUILLE EXCEL
                xlSheet.Range("C3").Value = DateJour.ToLongDateString
                xlSheet.Range("C4").Value = Temperature.ToString
     
                'RENVOI NBRE  FEUILLES 
                Return Compteurfeuille
            Catch ex As COMException
                MessageBox.Show("erreur " & ex.ErrorCode & ex.Message)
            End Try
            Return Compteurfeuille
        End Function
     
        'SAUVE ET QUITTE
        Private Sub btnSaveQuitWorkBook_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveQuitWorkBook.Click
            If xlApp IsNot Nothing Then
                'MODIFIE CETTE LIGNE POUR  SAUVEGARDER TON NOUVEAU
                ' CLASSEUR
                '----------------------------------------------------------
                xlBook.Save(strChemin)
     
               xlBook = Nothing
                xlSheet = Nothing
                xlApp.Quit()
                xlApp = Nothing
            End If
        End Sub
     
     
    End Class
    Attention le message que tu as c'est parce que tu manipule une feuille alors que le le classeur n'existe pas.
    C'est pour cela que j'ai mis xlApp.Visible = True pour que tu te rendes compte qu'un classeur est bien ouvert ou cree.

    bon code....

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup MABROUKI pour ta réponse ! C'est exactement ce que je souhaité !

    Je remercie aussi les autres pour le temps qu'ils ont passés sur mon probléme.

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

Discussions similaires

  1. [XL-2013] Créer des feuilles et les nommer via une plage de données
    Par rafale.76 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/10/2014, 23h46
  2. Créer des fichiers excel à partir d'une feuille et d'une liste
    Par chmouf dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/05/2014, 20h57
  3. Réponses: 7
    Dernier message: 14/03/2014, 13h39
  4. Créer des feuilles excel à partir d'une liste+données
    Par sof_011 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/11/2013, 15h14
  5. Réponses: 5
    Dernier message: 20/05/2010, 14h40

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