Microsoft 365 Copier coller des éléments appelés via des variables

ShrekL

XLDnaute Junior
Bonjour,

Je tente simplement de copier et coller des valeurs d'un fichier à un autre où le worksheet porte le même nom en passant par des variable. Je crois que j'ai une erreur de syntaxe dans ma formulation et j'ai fouillé sans trouver la réponse de ce que je fais de mal.

Voici le code (simplifié) de ce que je veux faire :
VB:
Sub TESTcopy()

'   VARIABLES
    Dim Exist As Workbook
    Dim Nouv As Workbook
    Dim Bord As Worksheet
                
'   ATTRIBUTION DE VALEEUR À MES VARIABLES
    Set Exist = Workbooks("Classeur3")
    Set Nouv = Workbooks("Classeur6")
    Set Bord = Sheets("Feuil1")

'    Copier-coller l'info
    Exist.Bord.Range("B:E").Copy
    Nouv.Bord.Range("B").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Sub

Cela me donne l'erreur "Propriété ou méthode non géré par cet objet" et le débugueur met la ligne "Exist.Bord.Range("B:E").Copy" en jaune.

Pouvez-vous m'aider et me dire où est mon erreur?

Salutations,
 

Staple1600

XLDnaute Barbatruc
Re

Il me fallait juste le temps de l'écrire ;)
VB:
Sub Copy2()
'   VARIABLES
Dim Nouv As Workbook, fA As Worksheet, Valeurs
Set Nouv = Workbooks("Classeur6.xlsx")
Set fA = Workbooks("Classeur3.xlsx").Sheets("Feuil1")
Valeurs = fA.Range(fA.[B1], fA.Cells(Rows.Count, "B").End(xlUp)).Value
'=> "copier" l'info
Nouv.Sheets("Feuil1").Cells(1).Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
Donc voici comment copier sans faire de copier/coller
;)
 

Staple1600

XLDnaute Barbatruc
Re

Voici, j'ai pris le temps de tester
Test OK (dans les deux cas)
VB:
Sub Copy_A() 'avec classeurs non enregistrés
'   VARIABLES
Dim Nouv As Workbook, fA As Worksheet, Valeurs
Set Nouv = Workbooks("Classeur6")
Set fA = Workbooks("Classeur3").Sheets("Feuil1")
Valeurs = fA.Range(fA.[B1], fA.Cells(Rows.Count, "E").End(xlUp)).Value
'=> "copier" l'info
Nouv.Sheets("Feuil1").Cells(1).Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
Sub Copy_B() 'avec classeurs enregistrés
'   VARIABLES
Dim Nouv As Workbook, fA As Worksheet, Valeurs
Set Nouv = Workbooks("Classeur6.xlsx")
Set fA = Workbooks("Classeur3.xlsx").Sheets("Feuil1")
Valeurs = fA.Range(fA.[B1], fA.Cells(Rows.Count, "E").End(xlUp)).Value
'=> "copier" l'info
Nouv.Sheets("Feuil1").Cells(1).Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
 

ShrekL

XLDnaute Junior
Re

Il me fallait juste le temps de l'écrire ;)
VB:
Sub Copy2()
'   VARIABLES
Dim Nouv As Workbook, fA As Worksheet, Valeurs
Set Nouv = Workbooks("Classeur6.xlsx")
Set fA = Workbooks("Classeur3.xlsx").Sheets("Feuil1")
Valeurs = fA.Range(fA.[B1], fA.Cells(Rows.Count, "B").End(xlUp)).Value
'=> "copier" l'info
Nouv.Sheets("Feuil1").Cells(1).Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
Donc voici comment copier sans faire de copier/coller
;)
Ok je comprend que plutôt de coller, vous donnez la même valeur à la cellule. J'aime bien. Mais je ne vois pas que c'est beaucoup moins long il me semble. Haha!

Par contre, je tiens à avoir une variable séparée pour la worksheet et les workbooks puisque je dois appeler la worksheet (qui porte le même nom) dans les deux fichier. Selon ma compréhension, votre variable fA appel la worksheet seulement dans le classeur3.

Comme je dois le faire pour plusieurs worksheet, c'est la raison pour laquelle je cherchais à appeler cette variable dans chaque fichier et il semble que ce soit là mon bug (à moins que je me trompe).

Merci
 

Staple1600

XLDnaute Barbatruc
Re

Moins long en temps d'exécution.
(Notamment avec un gros volume de données)

Le principe à retenir quand on veut copier uniquement en valeurs seules, c'est de passer par un Array
(ce que j'ai fait)

Fais le test avec 10 000 lignes sur ta feuille source et tu constateras la différence.

Une variante d'écriture (pour le fun)
VB:
Sub Copier()
Dim wBA As Workbook, wBB As Workbook, fA As Worksheet, fB As Worksheet, rng As Range
Set wBA = Workbooks("Classeur3.xlsx"): Set fA = wBA.Sheets(1)
Set wBB = Workbooks("Classeur6.xlsx"): Set fB = wBB.Sheets(1)
Set rng = fA.Range(fA.[B1], fA.Cells(Rows.Count, "E").End(xlUp))
Copy_C rng, fB.Cells(1)
End Sub
Private Sub Copy_C(Sour_ce As Range, Destina_tion As Range) 'avec classeurs enregistrés
'   VARIABLES
Dim Valeurs
Valeurs = Sour_ce.Value
Destina_tion.Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
 

ShrekL

XLDnaute Junior
Re

Moins long en temps d'exécution.
(Notamment avec un gros volume de données)

Le principe à retenir quand on veut copier uniquement en valeurs seules, c'est de passer par un Array
(ce que j'ai fait)

Fais le test avec 10 000 lignes sur ta feuille source et tu constateras la différence.

Une variante d'écriture (pour le fun)
VB:
Sub Copier()
Dim wBA As Workbook, wBB As Workbook, fA As Worksheet, fB As Worksheet, rng As Range
Set wBA = Workbooks("Classeur3.xlsx"): Set fA = wBA.Sheets(1)
Set wBB = Workbooks("Classeur6.xlsx"): Set fB = wBB.Sheets(1)
Set rng = fA.Range(fA.[B1], fA.Cells(Rows.Count, "E").End(xlUp))
Copy_C rng, fB.Cells(1)
End Sub
Private Sub Copy_C(Sour_ce As Range, Destina_tion As Range) 'avec classeurs enregistrés
'   VARIABLES
Dim Valeurs
Valeurs = Sour_ce.Value
Destina_tion.Resize(UBound(Valeurs, 1), UBound(Valeurs, 2)) = Valeurs
End Sub
Ahhhhhh... en temps d'exécution je ne doute aucunement et c'est très logique. Ça m'inquiétait un peu d'ailleurs.

Maintenant je vais essayer de bien comprendre l'ensemble de votre code pour tenter de l'appliquer dans le miens. Haha!!

Merci encore.
 

Staple1600

XLDnaute Barbatruc
Re

Il n'y pas grand chose à comprendre ;)
Je l'ai annoncé d'emblée
On peut copier sans passer par le copier/coller

Ci-dessous un petit test comparatif
VB:
Sub Créer_Exemple()
[A1:C1] = Array(1600, 111, 27)
[A1:C1048576].DataSeries
[A1].CurrentRegion.Borders.Weight = 2
End Sub
Sub CopierColler()
Application.ScreenUpdating = False
[A1].CurrentRegion.Copy
Sheets.Add
ActiveSheet.Cells(1).PasteSpecial _
                    Paste:=xlPasteValues, _
                    Operation:=xlNone, _
                    SkipBlanks:=False, _
                    Transpose:=False
End Sub
Sub CopierSansCopier()
Application.ScreenUpdating = False
Dim t: t = [A1].CurrentRegion.Value
Sheets.Add
ActiveSheet.Cells(1).Resize(UBound(t, 1), UBound(t, 2)).Value = t
End Sub
NB: A tester sur une feuille vierge
La macro Créer_Exemple est à lancer en premier et une seule fois.
 

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 626
Membres
103 609
dernier inscrit
AmineAB33