par , 13/10/2020 à 12h09 (1683 Affichages)
Lorsque l’on doit traiter des données en utilisant des données provenant d’autres classeurs, il est préférable de les importer plutôt que d’utiliser des liaisons.
Voici donc une procédure qui effectue ce travail.
Les contraintes
- Les tables "Source" et "Cible" doivent avoir le même nom
- Le nombre de colonnes de gauche de la table "cible" doit être égal à celui de la table source
- L’ordre des colonnes doit être identique
- Les formules de la table "source", s’il y en a, seront supprimées dans la table "cible" après la copie
- Le classeur contenant la table "cible" doit être le classeur actif
Ce que l’on peut ajouter
Dans le respect des contraintes, il est tout à fait possible d’ajouter des colonnes avec formules
Important : La fonction publiée ne se charge pas de la vérification
Code de la procédure nommée CopyTable
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
| Function CopyTable(WorkbookName As String, TableName As String)
' Fonction qui copie (Importation) une table (LitObject) sur une autre du même nom et se trouvant dans le classeur actif
' Philippe Tulliez (www.magicoffice.be)
' Arguments
' WorkbookName Nom du classeur source
' TableName Nom commun des deux tables
' Déclaration / Affectation des variables
Dim TableSource As ListObject
Dim TableTarget As ListObject
Dim WorkbookSource As Workbook
Dim HasShowTotal As Boolean
Dim NumberOfRows As Long
Dim NumberOfColumns As Integer
Set TableTarget = Range(TableName).ListObject
' Start Of Process
With TableTarget
' Supprime, s'il y en a, les données (DataBodyRange) de la table cible
If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
.ListRows.Add ' Ajoute une ligne
HasShowTotal = .ShowTotals ' Mémorise la propriété d'affichage de la ligne des totaux
.ShowTotals = False ' Supprime l'affichage de la ligne des totaux
End With
' Ouvre la table de données
Set WorkbookSource = Workbooks.Open(FileName:=WorkbookName) ' , ReadOnly:=True
Set TableSource = Range(TableName).ListObject
' Copie des données
With Range(TableName).ListObject.DataBodyRange
.Copy Destination:=TableTarget.DataBodyRange.Cells(1, 1)
NumberOfRows = .Rows.Count
NumberOfColumns = .Columns.Count
End With
' Supprime les formules de la table cible provenant de la table source
With TableTarget.DataBodyRange.Resize(NumberOfRows, NumberOfColumns)
.Value = .Value
End With
' Fermeture du classeur source
WorkbookSource.Close
' Fin de process
TableTarget.ShowTotals = HasShowTotal ' Remet la propriété initiale d'affichage de la ligne des totaux
Set TableSource = Nothing: Set TableTarget = Nothing: Set WorkbookSource = Nothing
End Function |
Exemple d'une procédure qui l'invoque
Cette procédure copie la table nommée T_TimeSheet présente dans le classeur 2020-09 - TimeSheet.xlsb qui se trouve dans le sous-répertoire TimeSheet
1 2 3 4 5 6 7 8
| Sub TestCopyTable()
Const WorkbookName As String = "2020-09 - TimeSheet.xlsb"
Const SubFolder As String = "TimeSheet"
Dim WkbSrceName As String
WkbSrceName = ThisWorkbook.Path & "\" & SubFolder & "\" & WorkbookName
Application.ScreenUpdating = False
CopyTable WkbSrceName, "T_TimeSheet"
End Sub |