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 :

Ouvrir et Fermer Excel en vb.NET sur 2 formulaire [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Ouvrir et Fermer Excel en vb.NET sur 2 formulaire
    Bonjour! Je suis nouveau et j’apprends en autodidacte VB.NET.

    J'ai face à moi un problème donc je ne trouve pas comment la régler.
    J'essaye de coder une Application Windows Form (.NET Framework) sur Visual Studio.
    Et dans le programme j'ai 2 formulaire :

    - Le 1er qui s'occupe de trouver un fichier Excel via un bouton Browser et lorsque l'on appuie le bouton Ouvrir,
    on ouvre le fichier Excel en background et on ferme le 1er formulaire et on ouvre le 2ème formulaire.

    - Le 2eme qui contient des comboBox pour permettre la sélection d'une valeur particulière dans les colonnes (pas encore faite, car je ne sais pas comment on prend une colonne d'un fichier Excel pour la mettre dans une comboBox)
    Ici on s'occupera plutôt de notre problème qui s'agit du bouton Retour , en effet j'essaye de faire en sorte que lorsque que l'on clic sur Retour, le 2eme se ferme Ainsi que l'Excel en cours d’exécution.
    Sauf que le programme me renvoie une erreur comme quoi "excel.Quit()" n'est pas referencé.

    Voici le programme ci-dessous des 2 formulaires :

    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
    Public Class Form1
        Public excel As Microsoft.Office.Interop.Excel.Application
     
        Private Sub Browse1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Browse1.Click
            ofd.Filter = "Excel Files(.xls)|*.xls|Excel Files(.xlsx)|*.xlsx|Excel Files(*.xlsm)|*.xlsm"
            If (ofd.ShowDialog() = DialogResult.OK) Then
                TextBox1.Text = ofd.FileName
            End If
        End Sub
     
        Private Sub Comfirm1_Click(sender As Object, e As EventArgs) Handles Comfirm1.Click
            Dim excel As New Microsoft.Office.Interop.Excel.Application
            Dim wb As Microsoft.Office.Interop.Excel.Workbook
            Dim FinderForm As New Form2
            If TextBox1.Text = "" Then
                MessageBox.Show("Wait!", "Please pick your file first!", MessageBoxButtons.OKCancel)
            Else
                wb = excel.Workbooks.Open(TextBox1.Text)
                excel.Visible = False
                wb.Activate()
                FinderForm.Show()
                Me.Hide()
            End If
     
        End Sub
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Form2
        Public excel As Microsoft.Office.Interop.Excel.Application
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim FinderFile As New Form1
            excel.Quit()
            FinderFile.Show()
            Me.Close()
        End Sub
    End Class
    Merci d'avance pour toute remarques/aides pouvant m'aider à apprendre plus.

    PS: Si vous avez besoin du dossier du projet pour compiler dite le moi .

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

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

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Salut,
    En fait tu dois créer qu'un seul objet "Excel" et qu’un seul objet "Workbook" et le partager entre tes formulaires.
    Dans ta Class Form1 tu as même créé deux fois le même objet "excel".

    Essaye ainsi :
    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
    Imports Microsoft.Office.Interop.Excel
     
    Public Class Form1
        Public Property ExcelApp As Application
        Public Property ExcelWorkBook As Workbook
     
        Private Sub Browse1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Browse1.Click
            ofd.Filter = "Excel Files(.xls)|*.xls|Excel Files(.xlsx)|*.xlsx|Excel Files(*.xlsm)|*.xlsm"
            If (ofd.ShowDialog() = DialogResult.OK) Then
                TextBox1.Text = ofd.FileName
            End If
        End Sub
     
        Private Sub Comfirm1_Click(sender As Object, e As EventArgs) Handles Comfirm1.Click
            Dim FinderForm As New Form2
            If TextBox1.Text = "" Then
                MessageBox.Show("Wait!", "Please pick your file first!", MessageBoxButtons.OKCancel)
            Else
                ExcelApp = New Application
                ExcelWorkBook = ExcelApp.Workbooks.Open(TextBox1.Text)
                ExcelApp.Visible = False
                ExcelWorkBook.Activate()
                FinderForm.Show()
                Me.Hide()
            End If
        End Sub
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Class Form2
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim FinderFile As New Form1
            FinderFile.ExcelApp.Quit()
            FinderFile.Show()
            Me.Close()
        End Sub
    End Class
    Merci de ainsi que d'utiliser les boutons et

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Salut!

    En essayant ton code, j'obtiens une exception non gérée : " System.NullReferenceException*: 'La référence d'objet n'est pas définie à une instance d'un objet.' " sur cette ligne de form2(5eme ligne) "FinderFile.ExcelApp.Quit()".

    Et merci de ta réponse!

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

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

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Effectivement tu créais un nouveau Objet Form1 dans ton Form2.

    Cette fois j'ai testé :
    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
    Imports Microsoft.Office.Interop.Excel
     
    Public Class Form1
        Public Property ExcelApp As Application
        Public Property ExcelWorkBook As Workbook
     
        Private Sub Browse1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Browse1.Click
            ofd.Filter = "Excel Files(.xls)|*.xls|Excel Files(.xlsx)|*.xlsx|Excel Files(*.xlsm)|*.xlsm"
            If (ofd.ShowDialog() = DialogResult.OK) Then
                TextBox1.Text = ofd.FileName
            End If
        End Sub
     
        Private Sub Comfirm1_Click(sender As Object, e As EventArgs) Handles comfirm1.Click
            If TextBox1.Text = "" Then
                MessageBox.Show("Wait!", "Please pick your file first!", MessageBoxButtons.OKCancel)
            Else
                ExcelApp = New Application
                ExcelWorkBook = ExcelApp.Workbooks.Open(TextBox1.Text)
                ExcelApp.Visible = False
                ExcelWorkBook.Activate()
                Dim FinderForm As New Form2(ExcelApp)
                FinderForm.Show()
                Me.Hide()
            End If
        End Sub
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Imports Microsoft.Office.Interop.Excel
    Public Class Form2
        Property ExcelApp As Application
     
        Sub New(ByRef App As Application)
            InitializeComponent()
            ExcelApp = App
        End Sub
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            ExcelApp.Quit()
            Me.Close()
        End Sub
    End Class
    Merci de ainsi que d'utiliser les boutons et

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'ai ajouté "Form1.Show()" a la Form2 sur la fonction Button1_Click pour pouvoir afficher le premier formulaire.

    Ce qui est bizarre c'est que sans la ligne ajouté, Excel ne se fermer pas dans le gestionnaire des taches mais bon la sa marche!

    Bon he bien il est temps de créer un nouveau post, cette fois ci pour la comboBox.
    Merci pour ton aide r.morel!

  6. #6
    Invité
    Invité(e)
    Par défaut
    bonjour,
    il faut informer Windows qu'il peut disposer de l'instance, c'est lui qui libère.

    voir Garbage Collectior (GC)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub releaseObject(ByVal obj AsObject)
    Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj =Nothing
        Catch ex AsException
            obj =Nothing
        Finally
            GC.Collect()
            'Not sure if the following line helps or hinders -- seems to lock things up once in a while
            'GC.WaitForPendingFinalizers()
        EndTry
    End Sub
    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
    Public Class Excel
        Implements IDisposable
        ' Field to handle multiple calls to Dispose gracefully.
        Dim disposed As Boolean = False
        Sub New()
            ' TODO: Complete member initialization 
        End Sub
        ' Implement IDisposable.
        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
        Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
            If disposed = False Then
                If disposing Then
                    ' Free other state (managed objects).
                    disposed = True
                End If
                ' Free your own state (unmanaged objects).
                ' Set large fields to null.
            End If
        End Sub
        Protected Overrides Sub Finalize()
            ' Simply call Dispose(False).
            Dispose(False)
        End Sub
         Private MyExcel As Interop.Excel.Application = Nothing
         Private wb As Object = Nothing
        Private _Fichier As String = ""
        Public Function GetObject(ByVal App As String) As Object
            Try
                Return Marshal.GetActiveObject(App)
            Catch ex As Exception
                Return CreateObject(App)
            End Try
        End Function
        Public Function CreateObject(ByVal app As String) As Object
            Dim AppType As Object = Type.GetTypeFromProgID(app)
            Dim ApplInst As Object = Activator.CreateInstance(AppType)
            Return ApplInst
        End Function
        Private Sub CreateObjectXcel()
            MyExcel = CreateObject("excel.application")
            MyExcel.Visible = True
            MyExcel.DisplayAlerts = False
            MyExcel.EnableEvents = False
            'MyExcel.ScreenUpdating = False
        End Sub
    Dernière modification par Invité ; 04/07/2018 à 15h27.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai du mal a voir comment intégrer le garbage collector dans mon programme, faut-il que je crée une classe à parte? ou que je l'intègre directement dans les formulaire?

  8. #8
    Invité
    Invité(e)
    Par défaut
    La première source permet implémenter dans le formulaire.
    La deuxième dans une classe.

    Personnellement je préfère la deuxième car elle permet d'implémenter également les fonctions générique d'Excel utilisées dans ton programme.
    Je l'utilise dans mes codes. Ouvrir Excel, ouvrir classeur, ajouter onglets, entête/pied de page , filtre élaboré, etc...

    Je la complète au fils de mes besoins.

    Ensuite dans ton formulaire tu utilises les methode de ta classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MaClasse.OpenWorbook("c:\MyRep\MyFichier.xlsx")
    MaClasse.FilteElabore(param,...)
    MaClasse.EntetePiedPages(param...)
    MaClasse.NewTdc(param...)
    MaClasse.NewGraph(param...)
    MaClasse.SaveAs("c:\MyRep\Toto.xlsx")
    MaClasse.Save
    MaClasse.close 
    MaClasse.Quitte
    MaClasse.Dispose 'Garbage Collectior
    Dernière modification par Invité ; 04/07/2018 à 17h44.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/11/2016, 09h25
  2. ouvrir et fermer un fichier excel en sauvegardant les modifications.
    Par decoalaa dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 17/10/2008, 15h37
  3. Ouvrir et fermer automatiquement un tableau Excel
    Par GeomR dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/04/2008, 13h40
  4. [C#, .NET 1.1]Ouvrir un classeur excel en late binding
    Par tontonplaisir dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/06/2007, 10h54
  5. ouvrir une feuille EXCEL dans Delphi.NET
    Par micha382 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 04/11/2005, 22h35

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