none
Projet WPF , Copier Coller des données Excel d'un classeur vers un autre RRS feed

  • Question

  • Bonjour dans un projet WPF j'utilise un code (via un click Button) qui me permet de copier une plage de cellules dans un Classeur Excel pour les copier dans un autre.

    Mon soucis est que le code s'exécute 2 fois!

    lorsque je click, le code s'exécute : le 1er classeur Excel s'ouvre puis la plage de cellule désirée est copiée.Le 2eme classeur s'ouvre et la selection est collé à l'endroit voulu.

    Le MessageBox s'affiche alors confirmant la réussite du processus.Je click sur OK et la le code s'exécute de nouveau en ouvrant les classeur Excel et CopieColle une 2eme fois les données.

    Le MessageBox s'affiche de nouveau et le click sur OK ferme la Sub.

    Voici mon code :

      Private Sub TransPal_Click(sender As Object, e As RoutedEventArgs) Handles TransPal.Click
            PbStatus.Value += (PbStatus.Maximum / 20)
            Thread.Sleep(200)
            Dim PdfTransName = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy"))
            Dim PdfTransName1 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_1")
            Dim PdfTransName2 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_2")
            Dim PdfTransNamePdf = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & ".pdf")
            Dim PdfTransNamePdf1 = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt\" & Date.Now.ToString("dd.MM.yyyy") & "_1" & ".pdf")
            Dim xlAppSource As New Excel.Application
            Dim xlWorkBookSource As Excel.Workbook
            Dim xlWorkSheetSource As Excel.Worksheet
            Dim xlDestRange As Excel.Range
            Dim xlBookDest As Excel.Workbook
            Dim xlSheetDest As Excel.Worksheet
            Try
                'C:\Dropbox\Abattoirs des Crêts\Congélation\TraceIt V2.0.0.0\TracabilitePalettes.xlsx
                ' C:\Dropbox\Abattoirs des Crêts\Congélation\TraceIt V2.0.0.0\Transferts.xlsx
                xlWorkBookSource = xlAppSource.Workbooks.Open("C:\Dropbox\Abattoirs des Crêts\Congélation\TraceIt V2.0.0.0\TracabilitePalettes.xlsx")
                xlAppSource.Visible = True
                xlWorkSheetSource = xlWorkBookSource.Sheets("Transferts")
                xlWorkSheetSource.Activate()
                PbStatus.Value += (PbStatus.Maximum / 20)
                Thread.Sleep(200)
                xlWorkSheetSource.Range("B2", "O100").Select()
                xlWorkSheetSource.Range("B2", "O100").Copy()
                PbStatus.Value += (PbStatus.Maximum / 20)
                Thread.Sleep(200)
                xlBookDest = xlAppSource.Workbooks.Open("C:\Dropbox\Abattoirs des Crêts\Congélation\TraceIt V2.0.0.0\Transferts.xlsx")
                xlAppSource.Visible = True
                xlSheetDest = xlBookDest.Sheets("Feuil1")
                xlSheetDest.Activate()
                PbStatus.Value += (PbStatus.Maximum / 20) '40%
                Thread.Sleep(200)
                Dim DerniereLigne As Long
                DerniereLigne = xlSheetDest.Range("B" & xlSheetDest.Rows.Count).End(Excel.XlDirection.xlUp).Row
                xlDestRange = xlSheetDest.Range("B" & (DerniereLigne + 1).ToString)
                xlDestRange.PasteSpecial()
                PbStatus.Value += (PbStatus.Maximum / 20) ' 50%
                Thread.Sleep(200)
                xlBookDest.Save()
                xlBookDest.Close()
                xlWorkBookSource.Save()
                xlWorkBookSource.Close()
                xlAppSource.Quit()
                Runtime.InteropServices.Marshal.ReleaseComObject(xlAppSource)
                MessageBox.Show("Transfert effectué avec succès", "Transfert Palettes", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.Cancel)
            Catch ex As IOException
                MessageBox.Show(ex.Message, "Echec", MessageBoxButton.OK, MessageBoxImage.Exclamation, MessageBoxResult.Cancel)
            End Try
    
        End Sub


    JF Collombet ® CreateSpecificCulture

    dimanche 10 avril 2016 16:06

Toutes les réponses

  • Bonjour,

    Pouvez vous simplement ajouter la commande

    Return

    a la place de

    MessageBox

    pour quitter de la subroutine lorsque le processus a été réussi. En plus, ajouter a vos donnes un booléen qui confirmerait que le processus a réussi.

    Au lieu de passer en revu tout le code.

    J’espère que ca aide


    Many

    lundi 11 avril 2016 11:53
  • Bonjour, cela ne change rien,j'ai toujours le code qui s'exécute 2 fois

    JF Collombet ® CreateSpecificCulture

    lundi 11 avril 2016 15:05
  • Salut, 

    D'accord, après le la ligne

    Runtime.InteropServices.Marshal.ReleaseComObject(xlAppSource)

    Fixe le fichier Excel source comme étant null

    xlAppSource = Nothing; 

    La fin de ton operation devrait resembler a ceci

    Cette reference pourrai t’être utile.

    http://www.siddharthrout.com/2012/08/06/vb-net-two-dot-rule-when-working-with-office-applications-2/

    http://www.codeproject.com/Tips/235230/Proper-Way-of-Releasing-COM-Objects-in-NET


    Many


    lundi 11 avril 2016 17:00