none
Projet Excel 2016 copier une plage de cellule en fonction du nombre de lignes RRS feed

  • Question

  • Bonjour dans un classeur Excel je souhaite copier une plage de cellule (dont le nombre de lignes peut varier constamment)

    pour exporter en pdf.

    En gros je copie de "A1" jusqu'à "E" et dernière cellule remplie

    Voici le code que j'ai testé :

     Dim lig As Long = Range("E100").End(XlDirection.xlUp).Row + 1
    
    Private Sub SelectCell_Click(sender As Object, e As EventArgs)
            Range("A1", lig).Select()
        End Sub

    Qui ne marche pas


    JF Collombet ® CreateSpecificCulture

    dimanche 21 février 2016 05:30

Réponses

  • Voila un exemple pour trouver la dernière ligne, sélectionner en dessous et coller un Range:

    Et le code pour que vous regardiez l'exemple:

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.Cursor = Cursors.WaitCursor
    
            '~~> Définission de vos Objects Excel
            Dim xlApp As New Excel.Application 'Cela prend du temps de conjurer l'application Excel il est profitable de le déclarer au lancement de l'app
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet
            Dim xlSourceRange, xlDestRange As Excel.Range
    
            Try
                xlWorkBook = xlApp.Workbooks.Open(Application.StartupPath & "\TestExcel.xlsx")
    
                '~~> Afficher le worksbook sur lequel on travaille...PRATIQUE POUR DEBUG!!!!
                xlApp.Visible = True 'Cela prend du temps mais cela permet de visualiser le résultat...
                '~~> La WorkSheet Source
                xlWorkSheet = xlWorkBook.Sheets("Sheet1")
    
                'Trouve le dernier rang dans la colonne A
                Dim DerniereLigne As Long
                DerniereLigne = xlWorkSheet.Range("A" & xlWorkSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row
    
                'On sélectionne la ligne juste en dessous: ATTENTION IL FAUT ETRE SUR QUE LA VALEUR EST "RAISONNABLE"
                xlDestRange = xlWorkSheet.Range("A" & (DerniereLigne + 1).ToString)
                xlDestRange.Select()
    
                'ET LA ON PEUT FAIRE LE PASTE.... 
                'Pour cet exemple la source est la première ligne
                xlSourceRange = xlWorkSheet.Range("A1:C1")
                'Là on fait le Paste...en fait c'est la fonction Copy: Déroutant non???
                xlSourceRange.Copy(xlDestRange)
                'Et pour le debug on indique que cela a fonctionné:
                xlWorkSheet.Range("A" & (DerniereLigne + 1).ToString).Value = "DEBUG PASTE OK"
    
                'xlWorkBook.Save()
                'xlWorkBook.Close() 'Si le workbook est ouvert et xlApp.Visible cela le ferme... l'app reste ouverte
                'xlApp.Quit() 'Si l'App est .Visible  cela la ferme...'Sinon Excel reste ouvert
                'System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 'Si Excel reste ouvert si on a lancé xlApp.visible...
    
            Catch ex As Exception
                MessageBox.Show("Exception : " & ex.Message)
            Finally
                Me.Cursor = Cursors.Default
            End Try
        End Sub

    Vraiment pour le DEBUG de développement .Visible = True est indispensable pour voir les étapes.....

    Ne pas oublier de Save, Close, Quit et Release....

    Aussi, le Try Catch Finally est indispensable pour trouver les problèmes....


    dimanche 21 février 2016 10:55

Toutes les réponses

  • Enfin compris le problème que vous avez avec "Application"... vous avez forcé l'import d'un objet qui a highjacked la définition d'Application... Comme ceci:

    • Vous avez copié du code qui utilise une référence XlDirection qui n'est pas défini chez vous
    • Vous avez appliqué la correction IntelliSense d'importation résolvant l'inconnue
    • Cet Imports défini Excel.Application en faisant "Imports Excel = Microsoft.Office.Interop.Excel.Application
    • Il y a alors confusion entre les références System.Windows.Forms.Application et Microsoft.Office.Interop.Excel.Application

    C'est malencontreux d'avoir des conflits entre références comme ceci, mais cela arrive...

    Pour éviter cela; l'import suggéré par IntelliSence est

    Imports Microsoft.Office.Interop.Excel

    Il vaut mieux utiliser une qualification supplémentaire pour accéder aux éléments sans confusion avec:

    Imports Excel = Microsoft.Office.Interop.Excel

    Vous avez alors accès aux éléments, par exemple XlDirection est Excel.XlDirection... c'est même plus explicite .

    dimanche 21 février 2016 10:22
  • Voila un exemple pour trouver la dernière ligne, sélectionner en dessous et coller un Range:

    Et le code pour que vous regardiez l'exemple:

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.Cursor = Cursors.WaitCursor
    
            '~~> Définission de vos Objects Excel
            Dim xlApp As New Excel.Application 'Cela prend du temps de conjurer l'application Excel il est profitable de le déclarer au lancement de l'app
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet
            Dim xlSourceRange, xlDestRange As Excel.Range
    
            Try
                xlWorkBook = xlApp.Workbooks.Open(Application.StartupPath & "\TestExcel.xlsx")
    
                '~~> Afficher le worksbook sur lequel on travaille...PRATIQUE POUR DEBUG!!!!
                xlApp.Visible = True 'Cela prend du temps mais cela permet de visualiser le résultat...
                '~~> La WorkSheet Source
                xlWorkSheet = xlWorkBook.Sheets("Sheet1")
    
                'Trouve le dernier rang dans la colonne A
                Dim DerniereLigne As Long
                DerniereLigne = xlWorkSheet.Range("A" & xlWorkSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row
    
                'On sélectionne la ligne juste en dessous: ATTENTION IL FAUT ETRE SUR QUE LA VALEUR EST "RAISONNABLE"
                xlDestRange = xlWorkSheet.Range("A" & (DerniereLigne + 1).ToString)
                xlDestRange.Select()
    
                'ET LA ON PEUT FAIRE LE PASTE.... 
                'Pour cet exemple la source est la première ligne
                xlSourceRange = xlWorkSheet.Range("A1:C1")
                'Là on fait le Paste...en fait c'est la fonction Copy: Déroutant non???
                xlSourceRange.Copy(xlDestRange)
                'Et pour le debug on indique que cela a fonctionné:
                xlWorkSheet.Range("A" & (DerniereLigne + 1).ToString).Value = "DEBUG PASTE OK"
    
                'xlWorkBook.Save()
                'xlWorkBook.Close() 'Si le workbook est ouvert et xlApp.Visible cela le ferme... l'app reste ouverte
                'xlApp.Quit() 'Si l'App est .Visible  cela la ferme...'Sinon Excel reste ouvert
                'System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 'Si Excel reste ouvert si on a lancé xlApp.visible...
    
            Catch ex As Exception
                MessageBox.Show("Exception : " & ex.Message)
            Finally
                Me.Cursor = Cursors.Default
            End Try
        End Sub

    Vraiment pour le DEBUG de développement .Visible = True est indispensable pour voir les étapes.....

    Ne pas oublier de Save, Close, Quit et Release....

    Aussi, le Try Catch Finally est indispensable pour trouver les problèmes....


    dimanche 21 février 2016 10:55
  • Pour la création d'un fichier pdf vous pouvez faire ceci:

    • Sélectionner le Range
    • Coller le range dans une nouvelle sheet ou workbook
    • Sauvegarder la sheet en pdf: soit en "natif" dans Excel SaveAs
    • Ou alors créez un objet pdf et mettez le en forme avec vos données directement...un peu plus avancé, là j'utilise MigraDoc...

    Commencez à explorer cela et postez les problèmes que vous aurez avec votre code.


    dimanche 21 février 2016 11:01
  • Merci pour ce code qui répond à mon avant dernier thread avec précision.

    Par contre pour celui la je ne vois pas comment adapter ce code


    JF Collombet ® CreateSpecificCulture

    dimanche 21 février 2016 12:59
  • Pour la sauvegarde en PDF... avec Excel 2013 sur la machine aussi simplement que cela:

    Me.Cursor = Cursors.WaitCursor
    
            Dim xlApp As New Excel.Application 'Cela prend du temps de conjurer l'application Excel il est profitable de le déclarer au lancement de l'app
            Dim xlWorkBook As Excel.Workbook
            Dim xlWorkSheet As Excel.Worksheet
            Dim xlNouvelleSheet As Excel.Worksheet
            Dim xlSourceRange, xlDestRange As Excel.Range
    
            Try
                xlWorkBook = xlApp.Workbooks.Open(Application.StartupPath & "\TestPourExport.xlsx")
                xlWorkSheet = xlWorkBook.Sheets("Sheet1")
    
                '~~> Afficher le worksbook sur lequel on travaille...PRATIQUE POUR DEBUG!!!!
                xlApp.Visible = True 'Cela prend du temps mais cela permet de visualiser le résultat...
    
                'Trouve le dernier rang dans la colonne A
                Dim DerniereLigne As Long
                DerniereLigne = xlWorkSheet.Range("A" & xlWorkSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row
    
                'On sélectionne la ligne juste en dessous: ATTENTION IL FAUT ETRE SUR QUE LA VALEUR EST "RAISONNABLE"
                xlSourceRange = xlWorkSheet.Range("A1:C" & (DerniereLigne + 1).ToString)
    
                xlNouvelleSheet = xlWorkBook.Worksheets.Add(After:=xlWorkBook.Worksheets(xlWorkBook.Worksheets.Count))
                xlNouvelleSheet.Name = "PourPDF"
    
                xlWorkBook.Worksheets("PourPDF").Select()
    
                xlDestRange = xlNouvelleSheet.Range("B2") 'Juste pour montrer que l'on peut copier n'importe où...
                'ET LA ON PEUT FAIRE LE PASTE....
                '~~> Set the destination range
                'xlDestRange = xlWorkSheet.Range("A3")
    
                '~~> Copy and paste the range
                xlSourceRange.Copy(xlDestRange)
                xlNouvelleSheet.Range("A1").Value = "Avant export PDF"
                'Sauvegarde de la sheet en pdf
                Dim strFichierPDF As String = Application.StartupPath & "\TestExcelAPDF.pdf"
                Dim saveAsFormat As Excel.XlFixedFormatType = Excel.XlFixedFormatType.xlTypePDF
                'Cela sauvegarde toutes les Sheets du Classeur
                xlWorkBook.ExportAsFixedFormat(saveAsFormat, strFichierPDF, Excel.XlFixedFormatQuality.xlQualityStandard, True, True, 1, , False, )
                'Juste pour indiquer que l'on est passé et pour montrer que c'est bien la sélection qui est sauvegardée....
                xlNouvelleSheet.Range("A1").Value = "Après Export PDF"
                xlWorkBook.Worksheets("PourPDF").Select()
                strFichierPDF = Application.StartupPath & "\TestExcelAPDF-DerniereSheetSeulement.pdf"
                xlNouvelleSheet.ExportAsFixedFormat(saveAsFormat, strFichierPDF, Excel.XlFixedFormatQuality.xlQualityStandard, True, True, 1, , False, )
    
            Catch ex As Exception
                MessageBox.Show("Exception : " & ex.Message)
            Finally
                Me.Cursor = Cursors.Default
            End Try

    dimanche 21 février 2016 13:51