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 :

[VB.NET | Excel] Utilisation d'excel lors d'un traitement automatique générant un fichier excel


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut [VB.NET | Excel] Utilisation d'excel lors d'un traitement automatique générant un fichier excel
    Bonjour,

    Je développe une application qui génére un fichier excel.

    Actuellement pendant la génération du fichier excel sur un poste, si un utilisateur tente d'utiliser excel lors de l'export, mon application "plante".

    Je voulais savoir si il etait possible de cloisoner une intance d'un fichier excel utiliser lors d'une génération automatique et une instance d'un fichier excel permettant à un utilisateur de travailler sur l'outil excel pendant la génération.

    Est-ce possible?

    cordialement.

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,
    Je trouve cela bizarre car je n'ai aucun problème quand je génère un fichier excel, je peux continué a utiliser, ouvrir, fermer à ma guise des instances de l'application. Peux-tu nous montrer comment tu exportes tes données?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    bonjour,

    voici le code que j'utilise pour ouvrir mon instance de fichier excel dans lequel je vais ecrire met donnée :

    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
    ''' <summary>
           ''' Description : Crée, ouvre et enregistre un classeur excel à partir d'un model contenant une seule feuille nommée "general"
        ''' </summary>
        ''' <param name="chemin">chemin de sauvegarde du fichier excel</param>
        ''' <param name="ExcelInst">Il s'agit d'un élément modifié par la procedure. Instance application Excel</param>
        ''' <param name="WB">Il s'agit d'un élément modifié par la procedure. Classeur excel à enregistrer</param>
        ''' <param name="RepFichModel">adresse du model à utiliser pour le fichier excel. Il ne contient qu'une feuille nommée general</param>
        ''' <param name="genSheet">Il s'agit d'un élément modifié par la procédure. Feuille du classeur WB</param>
        ''' <remarks></remarks>
        Public Sub OuvrirFichierGenere(ByVal chemin As String, ByRef ExcelInst As Excel.Application, ByRef WB As Excel.Workbook, ByVal RepFichModel As String, ByRef genSheet As Excel.Worksheet)
            Dim nomFeuil As String
     
            WB = ExcelInst.Workbooks.Open(RepFichModel)
            WB.SaveAs(chemin)
            nomFeuil = WB.Worksheets(1).name
            genSheet = WB.Worksheets(nomFeuil)
            'ExcelInst.Visible = True
        End Sub
    En fait j'utilise comme modèle un autre fichier dont je fait une copie, et dans lequel je vais écrire mes données. J'ai utilisé cette solution car lorsqu'un fichier est créé il contient par défaut 3 feuille, vierge.

    Et j'écrit dedans comme suis, ici il s'agit de la création d'un entête pour le 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    ''' <summary>
        ''' Description  : Crée les entête de colonne fixe : RESSOURCE|MAITRISE|SECTEUR|MATRICULE CP(restant à poser)|RA(restant à poser)
        ''' </summary>
        ''' <param name="nomFeuille">nom de la feuille à traiter</param>
        ''' <param name="WB">nom du classeur auquel appartient la feuille</param>
        ''' <remarks></remarks>
        Public Sub CreateEnteteFixe(ByVal nomFeuille As String, ByVal WB As Excel.Workbook)
            Dim feuille As Excel.Worksheet = WB.Worksheets(nomFeuille)
            Dim range As Excel.Range
     
            PoliceFont(feuille)
     
            feuille.Range(feuille.Cells(1, 1), feuille.Cells(4, 1)).Merge()
            range = feuille.Range(feuille.Cells(1, 1), feuille.Cells(4, 1))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 1) = "RESSOURCE"
     
            feuille.Range(feuille.Cells(1, 2), feuille.Cells(4, 2)).Merge()
            range = feuille.Range(feuille.Cells(1, 2), feuille.Cells(4, 2))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 2) = "MAITRISE"
     
            feuille.Range(feuille.Cells(1, 3), feuille.Cells(4, 3)).Merge()
            range = feuille.Range(feuille.Cells(1, 3), feuille.Cells(4, 3))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 3) = "SECTEUR"
     
            feuille.Range(feuille.Cells(1, 4), feuille.Cells(4, 4)).Merge()
            range = feuille.Range(feuille.Cells(1, 4), feuille.Cells(4, 4))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 4) = "MATRICULE"
     
            feuille.Range(feuille.Cells(1, 5), feuille.Cells(4, 5)).Merge()
            range = feuille.Range(feuille.Cells(1, 1), feuille.Cells(4, 5))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 5) = "CP (restant à poser)"
     
            feuille.Range(feuille.Cells(1, 6), feuille.Cells(4, 6)).Merge()
            range = feuille.Range(feuille.Cells(1, 1), feuille.Cells(4, 6))
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            range.Cells.Borders.Weight = 2
            feuille.Cells(1, 6) = "RA (restant à poser)"
        End Sub
    Je suis preneur de toute remarque.

    Merci d'avance

    ++

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,
    comment obtiens-tu l'instance Excel : ExcelInst que tu passe en paramètre à ta méthode : OuvrirFichierGenere ???

    concernant :
    En fait j'utilise comme modèle un autre fichier dont je fait une copie, et dans lequel je vais écrire mes données. J'ai utilisé cette solution car lorsqu'un fichier est créé il contient par défaut 3 feuille, vierge.
    Ce n'est pas mauvais, mais tu pourrais l'éviter en effaçant les deux page en trop, c'est juste plus beau mais ca ne change rien à ton problème

    et es-ce que cela fonctionne? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Cells(1, 1) = "RESSOURCE"
    car moi j'utilise la propriété .value2 de cette manière pour assigné une valeur à un range :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Cells(1, 1).value2 = "RESSOURCE"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour

    Et merci pour ta réponse.

    ExcelInstance est une variable globale de mon projet et je la déclare ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ExcelInstance As Excel.Application
    Je l'instancie ensuite dans mon programme au moment ou je vais avoir besoin de commencer à écrire dans mon fichier excel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExcelInstance = New Excel.Application
    Puis je fait appel à ma fonction générant la copie du fichier excel avec lequel mon application va travailler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OuvrirFichierGenere(cheminFichierGenere, ExcelInstance, egWB, RepFichierExpModel, egSheet)
    Ce n'est pas mauvais, mais tu pourrais l'éviter en effaçant les deux page en trop, c'est juste plus beau mais ca ne change rien à ton problème
    J'y avait réfléchit au début de mon projet quand je ne savais encore rien faire avec les fichiers excel, et je crois que l'une des améliorations que j'aimerai faire est justement de supprimer le model et de formater le fichier excel de base par programme.

    J'avais d'ailleur fait des tests mais la je n'ai plus trop le temps de toucher à un élément qui semble correctement fonctionner pour cette première version .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille.Cells(1, 1) = "RESSOURCE"
    Oui cela fonctionne, il écrit en effet correctement dans les cases que je lui indique, ce que je lui indique. J'utilise cette méthode dans tout mon projet.

    http://support.microsoft.com/kb/213719/fr

    d'après cette article value2 semble être utile pour les valeurs monétaires et de type date?

    Encore merci pour ta réponse.

    ++

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Je ne vois pas ce qui pourrait être différent de ce que moi j'utilise, mis à part l'ouverture du model, mais ce n'est pas ca qui pourrait faire en sorte que Excel mélange les instances de l'application et plante quand tu utilises une autre instance de l'application...
    Je ne comprend pas le pourquoi du plantage, je vais faire tout de suite quelque test ^^

  7. #7
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    J'ai fais une application rapide qui écrit non stop dans un excel :
    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
    Imports Microsoft.Office.Interop
     
    Public Class Form1
        Private wa As Excel.Application
        Private wb As Excel.Workbook
        Private ws As Excel.Worksheet
     
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            wa = New Excel.Application
            wb = wa.Workbooks.Add()
            ws = wb.Worksheets(1)
            wa.Visible = True
            For x As Integer = 1 To 1000
                For y As Integer = 1 To 100
                    ws.Cells(x, y) = x + y
                Next
            Next
     
     
        End Sub
    End Class
    Et j'ai ouvert, modifié, enregistré, fermé, ré-ouvert des Excel à coté pendant le traitement et je n'ai aucun problème

    Le seul problème que je puisse avoir est si j'essaye de modifier l'excel qui est en cours d'utilisation par le programme suite à
    mais ca c'est normal...

    Je ne sais pas d'où vient ton problème désolé

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Je viens de refaire un test .

    En fait mon application plante lorsque par exemple j'utilise un raccourcis excel de mon bureau par exemple ma TODO liste.

    En fait elle ne génére pas d'erreur c comme si elle allait directement à la fin de mon traitement sans continuer à écrire des donnée.

    Or moi vu que je met le visible à false, si un utilisateur lance comme moi un raccourcis le fichier excel va se lancer dans l'instance courante d'excel, celle la même ou mon appli écrit des données.

    Je vois pas bien comment contourner ce problème


    ++

  9. #9
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    J'ai bien remis la propriété à false, j'ai ajouté un console.writeline(position) et je vois qu'il continue malgré tout les test d'ouverture excel ou raccourcis excel :
    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
    Imports Microsoft.Office.Interop
     
    Public Class Form1
        Private we As Excel.Application
        Private wb As Excel.Workbook
        Private ws As Excel.Worksheet
     
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            we = New Excel.Application
            wb = we.Workbooks.Add()
            ws = wb.Worksheets(1)
            we.Visible = False
            For x As Integer = 1 To 1000
                For y As Integer = 1 To 100
                    ws.Cells(x, y) = x + y
                    Console.WriteLine("Position : " & x & " " & y)
                Next
            Next
        End Sub
    End Class
    de plus quand je regarde en mémoire il me crée bien plusieurs instance d'excel (voir fichier joint).
    Je ne comprend pas qu'il ne fasse pas pareil chez toi
    Images attachées Images attachées  

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    Est ce que chez toi lorsque tu ouvres un raccourcis Excel, Excel ouvre une instance de l'application, ou alors ouvre-t-il ton workbook dans l'instance courante?

    ++

  11. #11
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Quelle version d'Excel avez-vous Sankasssss et narutobaka ?

  12. #12
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par narutobaka Voir le message
    Bonjour,

    Est ce que chez toi lorsque tu ouvres un raccourcis Excel, Excel ouvre une instance de l'application, ou alors ouvre-t-il ton workbook dans l'instance courante?

    ++
    Dans une nouvelle instance. (deux Excel existe en mémoire et forcer l'arrêt de l'un n'empêche pas le fonctionnement de l'autre...)

    Citation Envoyé par Skalp Voir le message
    Quelle version d'Excel avez-vous Sankasssss et narutobaka ?
    La version que j'ai utilisé aujourd'hui était la 2007 car j'étais en congé (donc pc personnel) mais je n'ai jamais eu ce problème avec Excel 2003 utilisé au boulot... (Je vérifierai cela demain pour en être certain)

  13. #13
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par Sankasssss Voir le message
    (Je vérifierai cela demain pour en être certain)
    Vérifié et je n'ai aucun problème avec la 2003 non plus.
    Désolé je ne comprend pas

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    La version d'excel que j'utilise est 2003.

    Moi quand j'ouvre un raccourcis il ouvre ce dernier dans la même fenêtre ouverte par mon programme qui est en invisible. Il ouvre le workbook de mon raccourcis dans la fenetre de mon fichier génére et paf ca plante (et non pas ca fait de chocapic, ca serai pas mal ca ceci dit ....).

    Quand tu ouvres un raccourcis as tu le même comportement?

    ++

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2014, 17h34
  2. [XL-2010] connaitre les fichiers Excel utilisant un fichier source
    Par Djohn dans le forum Excel
    Réponses: 3
    Dernier message: 04/10/2012, 15h19
  3. Problème lors de la création automatique d'un classeur excel
    Par petiteabeille64 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/04/2008, 17h45
  4. Generation automatique d'un fichier excel
    Par Morphine dans le forum Access
    Réponses: 8
    Dernier message: 24/03/2006, 11h09
  5. Réponses: 17
    Dernier message: 20/09/2005, 22h18

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