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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| Private Sub CopierDonneesDansExcel(prmNomTableExcel As String, prmRSource As DAO.Recordset, prmFeuille As Object)
'Copie les données de la source Access dans Excel
Dim result As New clsResultVerif
Dim Destination As Object 'Excel.Range
Set Destination = prmFeuille.Range(prmNomTableExcel)
Dim nbLigneDonnees As Long
Dim nbColDonnees As Long
Dim nbColDestination As Long
Dim celluleOrigine As Object 'Excel.Range
Set celluleOrigine = prmFeuille.Cells(Destination.row - 1, Destination.Column)
Const xlCalculationAutomatic As Long = -4105
Const xlCalculationManual As Long = -4135
prmFeuille.Application.calculation = xlCalculationManual 'Neutralise le recalcul de Excel
'=== Supprime les données existantes
prmFeuille.Application.DisplayAlerts = False
Call mdlExcel.AfficherCellule(celluleOrigine)
nbLigneDonnees = Destination.Rows.Count
nbColDestination = Destination.Columns.Count
Call prmFeuille.ListObjects(prmNomTableExcel).Resize(prmFeuille.Range(celluleOrigine, celluleOrigine.Offset(1, nbColDestination - 1))) 'réduit le tableau à 1 ligne. NE PAS LE SUPPRIMER, cela casse les formules qui l'utilisent.
' === Supprime les lignes de données inutiles
' Conserve la 1ère ligne pour les formules éventuelles
If nbLigneDonnees > 1 Then
Call prmFeuille.Range(celluleOrigine.Offset(2, 0), celluleOrigine.Offset(nbLigneDonnees, nbColDestination - 1)).Clear 'Supprime les données
End If
' --- Supprime les lignes de données inutiles
' === Supprime les données mais garde les formules
Dim cellule As Object 'Excel.Range
Dim ligne As Object 'Excel.range
Set ligne = prmFeuille.Range(celluleOrigine.Offset(1, 0), celluleOrigine.Offset(1, nbColDestination - 1))
For Each cellule In ligne.Cells
Call mdlExcel.AfficherCellule(cellule)
If Left(cellule.Formula, 1) <> "=" Then
cellule.Clear
End If
Next cellule
Set cellule = Nothing
' --- Supprime les données mais garde les formules
prmFeuille.Application.DisplayAlerts = True
'--- Supprime les données existantes
Dim champ As DAO.Field
Dim iChamp As Long
'=== Copie les noms des champs
prmFeuille.Application.DisplayAlerts = False
For iChamp = 0 To prmRSource.Fields.Count - 1
Set champ = prmRSource.Fields(iChamp)
'Debug.Print champ.Name, champ.Type, dbBoolean, dbLong, dbDouble, dbText: DoEvents
Set cellule = prmFeuille.Cells(Destination.row - 1, Destination.Column + iChamp)
Call mdlExcel.AfficherCellule(cellule)
cellule = champ.Name
Set champ = Nothing
Set cellule = Nothing
Next iChamp
prmFeuille.Application.DisplayAlerts = True
'--- Copie les noms des champs
'=== Copie les données
prmFeuille.Application.DisplayAlerts = False
' If mdlGlobal.EST_MODE_DEBUG Then
' Dim c As New clsChrono: Call c.Demarrer(prmRSource.Name, True)
' End If
Call prmFeuille.Cells(Destination.row, Destination.Column).CopyFromRecordset(prmRSource)
' If mdlGlobal.EST_MODE_DEBUG Then
' c.Arreter: Call c.Afficher: Set c = Nothing
' End If
prmFeuille.Application.DisplayAlerts = True
'--- Copie les données
'=== Défini un tableau sur les données
prmFeuille.Application.DisplayAlerts = False
nbLigneDonnees = prmRSource.RecordCount
If nbLigneDonnees = 0 Then
nbLigneDonnees = 1 'Au minimum une ligne de données dans un objet ListObject
End If
nbColDonnees = prmRSource.Fields.Count
If nbColDonnees > nbColDestination Then
Call prmFeuille.ListObjects(prmNomTableExcel).Resize(prmFeuille.Range(celluleOrigine, celluleOrigine.Offset(nbLigneDonnees, nbColDonnees - 1)))
Else
Call prmFeuille.ListObjects(prmNomTableExcel).Resize(prmFeuille.Range(celluleOrigine, celluleOrigine.Offset(nbLigneDonnees, nbColDestination - 1)))
End If
prmFeuille.Application.DisplayAlerts = True
'--- Défini un tableau sur les données
'=== Formater les colonnes de données
prmFeuille.Application.DisplayAlerts = False
Dim Zone As Object 'Excel.Range
For iChamp = 0 To prmRSource.Fields.Count - 1
Set champ = prmRSource.Fields(iChamp)
'Debug.Print champ.Name, champ.Type, dbBoolean, dbLong, dbDouble, dbText: DoEvents
Set Zone = prmFeuille.Range(prmFeuille.Cells(Destination.row, Destination.Column + iChamp), prmFeuille.Cells(Destination.row + Destination.Rows.Count - 1, Destination.Column + iChamp))
Call mdlExcel.AfficherCellule(Zone)
Select Case champ.Type
Case dbInteger, dbLong
'Ne rien faire, pas de décimale
Case dbSingle, dbDouble, dbCurrency
Zone.NumberFormat = "0.00"
Case dbdate
Zone.NumberFormat = "yyyy\-mm\-dd hh\:mm\:ss"
Case Else
'Ne rien faire, utilise le format par défaut de Excel
End Select
Set champ = Nothing
Set Zone = Nothing
Next iChamp
prmFeuille.Application.DisplayAlerts = True
'--- Formater les colonnes de données
prmFeuille.Application.calculation = xlCalculationAutomatic 'Rétabli le recalcul de Excel
End Sub |
Partager