Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Copier des plages de cellules entre deux classeurs fermés [VBA]

5 réponses
Avatar
Tonic
Bonjour a tous,

Dans un classeur(classeur de traitement), j'ai r=E9alis=E9 des fonctions
vba me permettant de generer un autre classeur (classeur cible).Je
dispose =E9galement de plusieurs classeurs "source" o=F9 se trouvent des
donn=E9es que je souhaiterai injecter dans le classeur cible.

Sachant que les plages de cellules des classeurs source ont une taille
variable,j'ai =E9crit une fonction me permettant d'identifier les
cellules a importer (cette fonction me renvoit le nombre de lignes et
de colonnes de la plage de cellule a copier).

Je voudrais,lorsqu'on travaille a partir du classeur de
traitement(ouvert), pouvoir copier des plages de cellules du classeur
source vers le classeur cible alors que ceux ci sont ferm=E9s, et ce
grace a une fonction VBA.

Quelqu'un aurait-il-une id=E9e???

PS:J'ai deja essay=E9 en cr=E9ant deux objets excel application : dans le
premier j'ouvre le classeur source,dans le deuxi=E8me le classeur cible
et je n'arrive pas a copier les cellules sources vers les cellules
cibles en utilisant la ligne de code suivante:

xls.Workbooks("Class_source").Worksheet(1).Range(Worksheets(1).Cells(1,
1), Worksheets(1).Cell_(NbLigneSource,NbColSource)).Copy
xls2.Workbook("cible").Worksheet(1).Range(Worksheets(1).Cells(1, 1),
Worksheets(1).Cells(NbLigneCible, NbColonneCible)).PasteSpecial

Mais cela ne donne rien.....

Merci d'avance pour vos r=E9ponses eclair=E9es,

Tonic

5 réponses

Avatar
Ange Ounis
Ta méthode est sans doute utilisable, mais ta syntaxe comporte des imprécisions
(plage non systématiquement qualifiées, typos dans certains appels à la
collection Worksheets). Et les instances d'Excel créées par Ole sont avares de
messages d'erreurs!
En détaillant bien les opérations, tu pourrais tenter cette écriture (non
testée, elle suppose que toutes les variables de ton exemple soit bien
initialisées) :

''''''''''''''''''''''''''''''''''
Sub essai()
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet

Set FeuilleSource = xls.Workbooks("Class_source").Worksheets(1)
Set FeuilleCible = xls2.Workbook("cible").Worksheets(1)

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''''

Tu gagnerais peut-être aussi en "facilité de manipulation" en nommant les plages
de cellules sources et cibles.

----------
Ange Ounis
----------

Bonjour a tous,

Dans un classeur(classeur de traitement), j'ai réalisé des fonctions
vba me permettant de generer un autre classeur (classeur cible).Je
dispose également de plusieurs classeurs "source" où se trouvent des
données que je souhaiterai injecter dans le classeur cible.

Sachant que les plages de cellules des classeurs source ont une taille
variable,j'ai écrit une fonction me permettant d'identifier les
cellules a importer (cette fonction me renvoit le nombre de lignes et
de colonnes de la plage de cellule a copier).

Je voudrais,lorsqu'on travaille a partir du classeur de
traitement(ouvert), pouvoir copier des plages de cellules du classeur
source vers le classeur cible alors que ceux ci sont fermés, et ce
grace a une fonction VBA.

Quelqu'un aurait-il-une idée???

PS:J'ai deja essayé en créant deux objets excel application : dans le
premier j'ouvre le classeur source,dans le deuxième le classeur cible
et je n'arrive pas a copier les cellules sources vers les cellules
cibles en utilisant la ligne de code suivante:

xls.Workbooks("Class_source").Worksheet(1).Range(Worksheets(1).Cells(1,
1), Worksheets(1).Cell_(NbLigneSource,NbColSource)).Copy
xls2.Workbook("cible").Worksheet(1).Range(Worksheets(1).Cells(1, 1),
Worksheets(1).Cells(NbLigneCible, NbColonneCible)).PasteSpecial

Mais cela ne donne rien.....

Merci d'avance pour vos réponses eclairées,

Tonic



Avatar
Tonic
Merci pour ta réponse Ange, j'ai utilisé ton code mais cela ne donne
rien....Je deviens fou a passer autant de temps pour un simple
copier-coller!!!!Voici ce que j'ai utilisé :

Dim xls As Excel.Application
Dim xls2 As Excel.Application

Dim NbLigneSource As Long
Const NbColSource As Integer = 6


Dim FeuilleSource As Excel.Worksheet
Dim FeuilleCible As Excel.Worksheet

NbLigneSource =
(xls.Workbooks.Open("H:ExcelDataBilan_Journalier_01_01_2005.xls").Worksheets("AL_DEF").Range("A65536").End(xlUp).Row) - 10

Workbooks.Open "H:ExcelBilan_Annuel_2005.xls"

Workbooks.Open "H:ExcelDataBilan_Journalier_01_01_2005.xls"

Erreur sur cette ligne<<<<
Set FeuilleSource =


Workbooks("Bilan_Journalier_01_01_2005").Workheets("AL_DEF")
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Set FeuilleCible = Workbooks("Bilan_Annuel_2005").Worksheets("DONNEES
BRUTES")


With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With


With FeuilleCible 'LigneCible=4
.Range(.Cells(1, 1), .Cells(LigneCible, 6)).PasteSpecial
End With

Le compilateur renvoie une erreur "l'indice n'appartient pas a la
selection",je suppose qu'il parle du worksheets et meme en changeant le nom
"AL_DEF" par l'indice de l'index (en l'occurence 5) je n'arrive pas a
obtenir ce que je veux........... Je commence vraiment a deseperer...Pourrais
tu m'aider????

Merci pour tout,
Tonic


Ta méthode est sans doute utilisable, mais ta syntaxe comporte des imprécisions
(plage non systématiquement qualifiées, typos dans certains appels à la
collection Worksheets). Et les instances d'Excel créées par Ole sont avares de
messages d'erreurs!
En détaillant bien les opérations, tu pourrais tenter cette écriture (non
testée, elle suppose que toutes les variables de ton exemple soit bien
initialisées) :

''''''''''''''''''''''''''''''''''
Sub essai()
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet

Set FeuilleSource = xls.Workbooks("Class_source").Worksheets(1)
Set FeuilleCible = xls2.Workbook("cible").Worksheets(1)

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''''

Tu gagnerais peut-être aussi en "facilité de manipulation" en nommant les plages
de cellules sources et cibles.

----------
Ange Ounis
----------



Avatar
Ange Ounis
Je vois que tes instances d'Excel ne sont pas créées, tes classeurs fermés au
départ, et toujours des imprécisions dans la qualification des objets :

xls.Workbooks.Open(classeur)

ouvre classeur dans l'instance xls d'Excel,
alors que (une ligne plus loin)

Workbooks.Open classeur

ouvre classeur dans l'application Excel courante et classeur n'est alors pas
connu de l'instance xls ni de xls2...

Essaye avec ces modifs :

'''''''''''''''''''''''''''''''''
Sub essai2()
Dim xls As New Excel.Application, xls2 As New Excel.Application
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet
Dim NbLigneSource As Long
Const NbColSource As Integer = 6
Dim NomSource As String, NomCible As String

NomSource = "H:ExcelDataBilan_Journalier_01_01_2005.xls"
NomCible = "H:ExcelBilan_Annuel_2005.xls"

Set FeuilleSource = xls.Workbooks.Open(NomSource).Worksheets("AL_DEF")
Set FeuilleCible = xls2.Workbook(NomCible).Worksheets(1)

NbLigneSource = FeuilleSource.Range("A65536").End(xlUp).Row - 10

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''

----------
Ange Ounis
----------

Merci pour ta réponse Ange, j'ai utilisé ton code mais cela ne donne
rien....Je deviens fou a passer autant de temps pour un simple
copier-coller!!!!Voici ce que j'ai utilisé :

Dim xls As Excel.Application
Dim xls2 As Excel.Application

Dim NbLigneSource As Long
Const NbColSource As Integer = 6


Dim FeuilleSource As Excel.Worksheet
Dim FeuilleCible As Excel.Worksheet

NbLigneSource =
(xls.Workbooks.Open("H:ExcelDataBilan_Journalier_01_01_2005.xls").Worksheets("AL_DEF").Range("A65536").End(xlUp).Row) - 10

Workbooks.Open "H:ExcelBilan_Annuel_2005.xls"

Workbooks.Open "H:ExcelDataBilan_Journalier_01_01_2005.xls"


Erreur sur cette ligne<<<<



Set FeuilleSource =
Workbooks("Bilan_Journalier_01_01_2005").Workheets("AL_DEF")
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Set FeuilleCible = Workbooks("Bilan_Annuel_2005").Worksheets("DONNEES
BRUTES")


With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With


With FeuilleCible 'LigneCible=4
.Range(.Cells(1, 1), .Cells(LigneCible, 6)).PasteSpecial
End With

Le compilateur renvoie une erreur "l'indice n'appartient pas a la
selection",je suppose qu'il parle du worksheets et meme en changeant le nom
"AL_DEF" par l'indice de l'index (en l'occurence 5) je n'arrive pas a
obtenir ce que je veux........... Je commence vraiment a deseperer...Pourrais
tu m'aider????

Merci pour tout,
Tonic



Ta méthode est sans doute utilisable, mais ta syntaxe comporte des imprécisions
(plage non systématiquement qualifiées, typos dans certains appels à la
collection Worksheets). Et les instances d'Excel créées par Ole sont avares de
messages d'erreurs!
En détaillant bien les opérations, tu pourrais tenter cette écriture (non
testée, elle suppose que toutes les variables de ton exemple soit bien
initialisées) :

''''''''''''''''''''''''''''''''''
Sub essai()
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet

Set FeuilleSource = xls.Workbooks("Class_source").Worksheets(1)
Set FeuilleCible = xls2.Workbook("cible").Worksheets(1)

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''''

Tu gagnerais peut-être aussi en "facilité de manipulation" en nommant les plages
de cellules sources et cibles.

----------
Ange Ounis
----------







Avatar
Ange Ounis
Je m'aperçois que j'ai oublié de modifier l'affectation de la feuille cible. Il
faut remplacer :
Set FeuilleCible = xls2.Workbooks(NomCible).Worksheets(1)

par :
Set FeuilleCible = xls2.Workbooks.Open(NomCible).Worksheets("DONNEES BRUTES")

Désolé.

----------
Ange Ounis
----------

Je vois que tes instances d'Excel ne sont pas créées, tes classeurs
fermés au départ, et toujours des imprécisions dans la qualification des
objets :

xls.Workbooks.Open(classeur)

ouvre classeur dans l'instance xls d'Excel,
alors que (une ligne plus loin)

Workbooks.Open classeur

ouvre classeur dans l'application Excel courante et classeur n'est alors
pas connu de l'instance xls ni de xls2...

Essaye avec ces modifs :

'''''''''''''''''''''''''''''''''
Sub essai2()
Dim xls As New Excel.Application, xls2 As New Excel.Application
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet
Dim NbLigneSource As Long
Const NbColSource As Integer = 6
Dim NomSource As String, NomCible As String

NomSource = "H:ExcelDataBilan_Journalier_01_01_2005.xls"
NomCible = "H:ExcelBilan_Annuel_2005.xls"

Set FeuilleSource = xls.Workbooks.Open(NomSource).Worksheets("AL_DEF")
Set FeuilleCible = xls2.Workbook(NomCible).Worksheets(1)

NbLigneSource = FeuilleSource.Range("A65536").End(xlUp).Row - 10

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''

----------
Ange Ounis
----------


Merci pour ta réponse Ange, j'ai utilisé ton code mais cela ne donne
rien....Je deviens fou a passer autant de temps pour un simple
copier-coller!!!!Voici ce que j'ai utilisé :

Dim xls As Excel.Application
Dim xls2 As Excel.Application
Dim NbLigneSource As Long
Const NbColSource As Integer = 6
Dim FeuilleSource As Excel.Worksheet
Dim FeuilleCible As Excel.Worksheet
NbLigneSource =
(xls.Workbooks.Open("H:ExcelDataBilan_Journalier_01_01_2005.xls").Worksheets("AL_DEF").Range("A65536").End(xlUp).Row)
- 10
Workbooks.Open "H:ExcelBilan_Annuel_2005.xls"
Workbooks.Open "H:ExcelDataBilan_Journalier_01_01_2005.xls"


Erreur sur cette ligne<<<<




Set FeuilleSource =
Workbooks("Bilan_Journalier_01_01_2005").Workheets("AL_DEF")
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Set FeuilleCible =
Workbooks("Bilan_Annuel_2005").Worksheets("DONNEES BRUTES")
With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible 'LigneCible=4
.Range(.Cells(1, 1), .Cells(LigneCible, 6)).PasteSpecial
End With

Le compilateur renvoie une erreur "l'indice n'appartient pas a la
selection",je suppose qu'il parle du worksheets et meme en changeant
le nom "AL_DEF" par l'indice de l'index (en l'occurence 5) je n'arrive
pas a obtenir ce que je veux........... Je commence vraiment a
deseperer...Pourrais tu m'aider????

Merci pour tout,
Tonic



Ta méthode est sans doute utilisable, mais ta syntaxe comporte des
imprécisions (plage non systématiquement qualifiées, typos dans
certains appels à la collection Worksheets). Et les instances d'Excel
créées par Ole sont avares de messages d'erreurs!
En détaillant bien les opérations, tu pourrais tenter cette écriture
(non testée, elle suppose que toutes les variables de ton exemple
soit bien initialisées) :

''''''''''''''''''''''''''''''''''
Sub essai()
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet

Set FeuilleSource = xls.Workbooks("Class_source").Worksheets(1)
Set FeuilleCible = xls2.Workbook("cible").Worksheets(1)

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource,
NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''''

Tu gagnerais peut-être aussi en "facilité de manipulation" en nommant
les plages de cellules sources et cibles.

----------
Ange Ounis
----------










Avatar
Tonic
Encore merci beaucoup Ange tout fonctionne à la perfection!!!!!!!!!!!!!!


Je m'aperçois que j'ai oublié de modifier l'affectation de la feuille cible. Il
faut remplacer :
Set FeuilleCible = xls2.Workbooks(NomCible).Worksheets(1)

par :
Set FeuilleCible = xls2.Workbooks.Open(NomCible).Worksheets("DONNEES BRUTES")

Désolé.

----------
Ange Ounis
----------

Je vois que tes instances d'Excel ne sont pas créées, tes classeurs
fermés au départ, et toujours des imprécisions dans la qualification des
objets :

xls.Workbooks.Open(classeur)

ouvre classeur dans l'instance xls d'Excel,
alors que (une ligne plus loin)

Workbooks.Open classeur

ouvre classeur dans l'application Excel courante et classeur n'est alors
pas connu de l'instance xls ni de xls2...

Essaye avec ces modifs :

'''''''''''''''''''''''''''''''''
Sub essai2()
Dim xls As New Excel.Application, xls2 As New Excel.Application
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet
Dim NbLigneSource As Long
Const NbColSource As Integer = 6
Dim NomSource As String, NomCible As String

NomSource = "H:ExcelDataBilan_Journalier_01_01_2005.xls"
NomCible = "H:ExcelBilan_Annuel_2005.xls"

Set FeuilleSource = xls.Workbooks.Open(NomSource).Worksheets("AL_DEF")
Set FeuilleCible = xls2.Workbook(NomCible).Worksheets(1)

NbLigneSource = FeuilleSource.Range("A65536").End(xlUp).Row - 10

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''

----------
Ange Ounis
----------


Merci pour ta réponse Ange, j'ai utilisé ton code mais cela ne donne
rien....Je deviens fou a passer autant de temps pour un simple
copier-coller!!!!Voici ce que j'ai utilisé :

Dim xls As Excel.Application
Dim xls2 As Excel.Application
Dim NbLigneSource As Long
Const NbColSource As Integer = 6
Dim FeuilleSource As Excel.Worksheet
Dim FeuilleCible As Excel.Worksheet
NbLigneSource =
(xls.Workbooks.Open("H:ExcelDataBilan_Journalier_01_01_2005.xls").Worksheets("AL_DEF").Range("A65536").End(xlUp).Row)
- 10
Workbooks.Open "H:ExcelBilan_Annuel_2005.xls"
Workbooks.Open "H:ExcelDataBilan_Journalier_01_01_2005.xls"


Erreur sur cette ligne<<<<




Set FeuilleSource =
Workbooks("Bilan_Journalier_01_01_2005").Workheets("AL_DEF")
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Set FeuilleCible =
Workbooks("Bilan_Annuel_2005").Worksheets("DONNEES BRUTES")
With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible 'LigneCible=4
.Range(.Cells(1, 1), .Cells(LigneCible, 6)).PasteSpecial
End With

Le compilateur renvoie une erreur "l'indice n'appartient pas a la
selection",je suppose qu'il parle du worksheets et meme en changeant
le nom "AL_DEF" par l'indice de l'index (en l'occurence 5) je n'arrive
pas a obtenir ce que je veux........... Je commence vraiment a
deseperer...Pourrais tu m'aider????

Merci pour tout,
Tonic



Ta méthode est sans doute utilisable, mais ta syntaxe comporte des
imprécisions (plage non systématiquement qualifiées, typos dans
certains appels à la collection Worksheets). Et les instances d'Excel
créées par Ole sont avares de messages d'erreurs!
En détaillant bien les opérations, tu pourrais tenter cette écriture
(non testée, elle suppose que toutes les variables de ton exemple
soit bien initialisées) :

''''''''''''''''''''''''''''''''''
Sub essai()
Dim FeuilleSource As Excel.Worksheet, FeuilleCible As Excel.Worksheet

Set FeuilleSource = xls.Workbooks("Class_source").Worksheets(1)
Set FeuilleCible = xls2.Workbook("cible").Worksheets(1)

With FeuilleSource
.Range(.Cells(1, 1), .Cells(NbLigneSource, NbColSource)).Copy
End With

With FeuilleCible
.Range(.Cells(1, 1), .Cells(NbLigneSource,
NbColSource)).PasteSpecial
End With

End Sub
'''''''''''''''''''''''''''''''''''

Tu gagnerais peut-être aussi en "facilité de manipulation" en nommant
les plages de cellules sources et cibles.

----------
Ange Ounis
----------