Transfert de données d'un classeur vers un autre classeur Excel VBA

Tu trouves que je complexifie trop ?

Oui, on a pas résolu les problème d'une écriture que tu rajoutes déjà des éléments (avec des erreurs...).

Aussi, tu n'as toujours pas répondu à ma question :

Il y a quoi dans ta feuille avant d’exécuter ce code ? En clair, elle est où la dernière ligne ?

Concernant DerLig, tu parles de chercher la première cellule vide, mais au mieux, cette instruction te permet telle qu'elle est écrite ici, de trouver la dernière ligne AVEC données...

D'accord alors reprenons du début :

Ce code je l'ai compris :

Sub VariableTexte()

Dim MyTxt As String 'Je déclare le type "chaine de caractères" pour cette variable

Range("A1") = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
Range("A1") = MyTxt 'A1 contiendra alors le même texte que ma variable

End Sub 'La variable est effacée ici, et n'est pas utilisable en dehors de la macro telle qu'elle est écrite ici

Je l'ai bidouillé et j'ai compris ce code :

Sub VariableTexte()

Dim MyTxt As String 'Je déclare le type "chaine de caractères" pour cette variable

Range("A1:A100") = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
Range("A1:A100") = MyTxt 'A1 contiendra alors le même texte que ma variable

End Sub 'La variable est effacée ici, et n'est pas utilisable en dehors de la macro telle qu'elle est écrite ici

J'ai ensuité généré ce code et c'est dans ce code qu'il y a des erreurs

Sub VariableTexte()

Dim MyTxt As String 'Je déclare le type "chaine de caractères" pour cette variable
DerLig = UsedRange.Rows.Count 'Compte le nombre de lignes utilisées, donc attention si présence de ligne vide avant ou dans les données
Range("A1" & DerLig) = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
Range("A1" & DerLig) = MyTxt 'A1 contiendra alors le même texte que ma variable

End Sub 'La variable est effacée ici, et n'est pas utilisable en dehors de la macro telle qu'elle est écrite ici

Je le corrige :

Sub VariableTexte()

Dim MyTxt As String 'Je déclare le type "chaine de caractères" pour cette variable
DerLig = Sheets("Feuil1").UsedRange.Rows.Count 'Je déclare ma feuille et Compte le nombre de lignes utilisées, donc attention si présence de ligne vide avant ou dans les données
Range("A" & DerLig) = MyTxt 'je place mytxt qui n'existe pas encore dans la colonne A jusqu'à la dernière ligne avec des données
MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
Range("A1" & DerLig) = MyTxt 'A jusqu'à la dernière ligne avec des données contiendra alors le même texte que ma variable

End Sub 'La variable est effacée ici, et n'est pas utilisable en dehors de la macro telle qu'elle est écrite ici

Sauf qu'initialement, nous n'avons pas de ligne avec des données donc le code doit rester :

Dim MyTxt As String 'Je déclare le type "chaine de caractères" pour cette variable
DerLig = Sheets("Feuil1").UsedRange.Rows.Count 'Compte le nombre de lignes utilisées, donc attention si présence de ligne vide avant ou dans les données
Range("A1:A100") = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
Range("A1:A100") = MyTxt 'A1 jusqu'à A100 contiendra alors le même texte que ma variable

End Sub 'La variable est effacée ici, et n'est pas utilisable en dehors de la macro telle qu'elle est écrite ici

Puisque j'ai mis

.Range("A1:A100")

, on remplit les 100 premières cellules de la colonne A avec le texte. A partir de cette base ,maintenant, je cherche à obtenir une ligne de code qui me dit va chercher la première cellule vide (A101) de la colonne A pour la remplir avec le texte que je te donne.

DerLig ne peut pas être utilisé si je n'ai pas, initialement, de cellules/ligne avec des données.

Résumé bénéfique !

Nous avons donc à présent 100 lignes avec des données. Notre instruction DerLig prend donc la valeur 100, or, tu le dis toi même, la 1ère cellule vide est en ligne 101. Il faut tout simplement ajouter 1. Voilà un nouveau code plus proche de ce que tu souhaites :

Sub Test2()

Dim MyTxt As String, DerLig As Long, Lignes_A_Traiter As Long

MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"
With Sheets("Feuil1")
   DerLig = .UsedRange.Rows.Count + 1
   Lignes_A_Traiter = 50
   .Range("A" & DerLig) = MyTxt 'Ici on ajoute le texte de MyTxt dans la cellule A101 (instruction rendue inutile par la suivante, c'est juste un exemple)
   .Range("A" & DerLig & ":A" & DerLig + Lignes_A_Traiter) = MyTxt 'Ici on travaille sur la plage A101:A151 (cette plage est dynamique, et s'adaptera à la position de la dernière donnée)
End With

End Sub

DerLig ne peut pas être utilisé si je n'ai pas, initialement, de cellules/ligne avec des données.

Dans ce cas, sa valeur sera 0, hors la cellule A0 n'existe pas et donc ton code générera une erreur.

Parfait c'est exactement ce que je veux !

Mais du coup maintenant je voudrais pour voir importer mes données de l'autre classeur plutôt que mettre le texte "Un long texte que je ne vais pas réécrire plusieurs fois !" c'est là que ça se complique parce que je mélange l'ordre des classeurs.

Parfait c'est exactement ce que je veux !

Mais du coup maintenant je voudrais pour voir importer mes données de l'autre classeur plutôt que mettre le texte "Un long texte que je ne vais pas réécrire plusieurs fois !" c'est là que ça se complique parce que je mélange l'ordre des classeurs.

C'est sûr, ce petit code est limpide pour toi ? Si oui, on va effectivement revenir à ta problématique initiale.

Je ne peux pas faire ça par exemple :

Modifier ça

MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"

Par ça:

MyTxt = Workbooks("test3.xlsm).Worksheets("Feuil1").Range("A1:AE48")

Ce que je souhaite faire dans cette dernière ligne de code c'est associé mytxt au classeur que je veux importer dans mon classeur actif.

Par la suite, je veux intégrer mytxt à une ligne de code qui dit :

"Aller chercher mytxt et l'importer dans mon classeur actif SANS pour autant retirer les lignes de code qui dise "aller chercher la dernière cellule remplie" et à partir de celle-ci remplir les cellules vides suivantes par la prochaine importation".

Je ne peux pas faire ça par exemple :

Modifier ça

MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !"

Par ça:

MyTxt = Workbooks("test3.xlsm).Worksheets("Feuil1").Range("A1:AE48")

Ce que je souhaite faire dans cette dernière ligne de code c'est associé mytxt au classeur que je veux importer dans mon classeur actif.

Par la suite, je veux intégrer mytxt à une ligne de code qui dit :

"Aller chercher mytxt et l'importer dans mon classeur actif SANS pour autant retirer les lignes de code qui dise "aller chercher la dernière cellule remplie" et à partir de celle-ci remplir les cellules vides suivantes par la prochaine importation".

Tu n'associes pas le classeur ici, mais le contenu d'une plage de cellules sur ce classeur. Par ailleurs, je parlais de l'importance d'être clair, mais un classeur stocké dans un objet nommé "MyTxt", c'est tout sauf clair...

Tu vas donc d'abord déclaré un objet de type "classeur", avec un nom explicite. N'essaye pas de tout faire d'un coup, concentre toi juste sur cette première étape.

Voyons voir, pour moi ton petit code signifie ceci:

Sub Test2()

Dim MyTxt As String, DerLig As Long, Lignes_A_Traiter As Long 'My texte est une variable texte, DerLig est une variable numérique, Lignes-A-Traiter est une variable numérique. On déclare les variables en fonction de leur type ici.

MyTxt = "Un long texte que je ne vais pas réécrire plusieurs fois !" 'On associe mytxt au texte voulu

With Sheets("Feuil1")  'On ouvre une procédure with qui concerne la feuil1 du classeur actif (?)
   DerLig = .UsedRange.Rows.Count + 1 'On associe à DerLig le fait d'aller chercher la dernière cellule remplie et de faire +1 pour remplir la prochaine cellule vide. Pas besoin d'indiquer la feuille sur laquelle on travaille puisqu'on se trouve dans la procédure qui concerne la feuille sur laquelle on travaille
   Lignes_A_Traiter = 50 'On attribue la valeur 50 à la variable Ligne_A_Traiter
   .Range("A" & DerLig) = MyTxt 'Ici on ajoute le texte de MyTxt dans la cellule A101 (instruction rendue inutile par la suivante, c'est juste un exemple) 'On associe à l'ensemble de la colonne A jusqu'à la dernière ligne remplie le contenu de mytxt
   .Range("A" & DerLig & ":A" & DerLig + Lignes_A_Traiter) = MyTxt 'Ici on travaille sur la plage A101:A151 (cette plage est dynamique, et s'adaptera à la position de la dernière donnée) "on associe à la dernière ligne remplie + 50 lignes suivantes le contenu de mytxt" on rajoute à chaque fois 50 lignes
End With  'on ferme la procédure

End Sub

C'est bien ça ?

Pour la première étape de déclarer le classeur comme un objet je fais ça :

Classeur As Object

C'est bon ?

Pour la première étape de déclarer le classeur comme un objet je fais ça :

Classeur As Object

C'est bon ?

Non. Quand tu fais référence à un classeur, tu écris : Workbooks("MonClasseur.xlsm") (littéralement, l'élément nommé "MonClasseur.xlsm" au sein de la collection de tous les classeurs). Il s'agit donc tout simplement d'un objet de type Workbook (idem avec les feuilles, qui sont des objets de type Worksheet ou les plages de cellules qui sont des objets : ???).

Donc je mets simplement ceci: Workbooks("test3.xlsm") pour déclarer le classeur ?

Donc je mets simplement ceci: Workbooks("test3.xlsm") pour déclarer le classeur ?

Naaaaaan ! Sinon tu devras répéter 1000 fois son nom, chaque fois que tu y fais référence (pas pratique, source d'erreur, lourd et rend le code peu lisible). Ce que je veux, c'est qu'on le mémorise dans un objet, de type classeur. D'abord on crée cet objet, ensuite on lui affecte le bon classeur.

Peux-tu m'expliquer comment créer cette objet ?

Parce que sans faire ça (du coup, je sais que c'est faux),

Classeur As Object
Classeur = Workbooks("MonClasseur.xlsm")

je ne sais pas comment m'y prendre.

Il s'agit donc tout simplement d'un objet de type Workbook

Tu n'es pas loin, mais pourquoi type Object (dont je n'ai pas parlé) ?

Désolée apparemment je ne reçois pas tous tes messages, je vais actualiser plus souvent

Si je fais ça ?

Classeur As Workbook
Classeur = "MyClasseur.xlsm"

Si je fais ça ?

Classeur As Workbook
Classeur = "MyClasseur.xlsm"

C'est presque parfait, il faut juste rajouter pour ce type d'objet (qui ne stocke pas une simple valeur), un "Set" au moment de l'affecter.

Classeur As Workbook
Set Classeur = Workbooks("MyClasseur.xlsm")

PS : le prérequis de cette écriture est que le classeur doit être ouvert au préalable.

Rechercher des sujets similaires à "transfert donnees classeur vba"