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

ça y'est j'ai enfin compris ce que tu souhaitais m'expliquer par rapport à ce code :

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

J'associe DerLig à une instruction et ensuite je peux insérer le DerLig dans une autre ligne de code comme tu l'as fait avec LigMax ?

Ouiiiii !

DerLig (ou LigMax) est une variable créée dans le code, qui permet de stocker une information (ici un nombre correspondant à un n° de ligne). On peut ensuite l'utiliser dans le code, éventuellement la modifier (car après ajout de données, la dernière ligne change). Elle est ensuite effacée automatiquement à la fin de l'exécution.

On progresse !!!

Du coup si je te suis bien, j'associe DerLig à une instruction avant de le mettre dans un ligne de code car comme tu l'as dit : il faut faire attention à l'ordre des lignes de code (cf ton exemple avec le boulanger). Je suis réveillée ce matin haha !

Un exemple pour illustrer l'utilisation d'une variable :

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

On progresse !!!

Du coup si je te suis bien, j'associe DerLig à une instruction avant de le mettre dans un ligne de code car comme tu l'as dit : il faut faire attention à l'ordre des lignes de code (cf ton exemple avec le boulanger). Je suis réveillée ce matin haha !

Sommeil réparateur ? Quand tu satures, n'hésites pas à faire autre chose dans ta journée... Et y revenir à tête reposée !

Je le teste tout de suite pour comprendre !

Tu fais quoi comme métier ? Développeur ?

D'accord alors j'ai essayé et bidouillé ton code pour faire :

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

Maintenant je vais essayer d'associer DerLig à une instruction et voir ce qu'il se passe

Je le teste tout de suite pour comprendre !

Tu fais quoi comme métier ? Développeur ?

Je sors d'un apprentissage... Et je dois avoir déposé un post pour me présenter sur la section dédiée, si tu souhaite y faire un tour.

Du coup non, je ne suis pas développeur, malgré les apparences, j'ai des compétences limitées sur Excel, surtout au regard de quelques spécimens que l'on a sur ce forum !

Il est ou ton post ? ça fait parti de la finalité de ton apprentissage de déposer ce post ?

Alors, j'ai tenté de modifier le code à la façon que tu m'as montré avec LigMax mais en associant à DerLig une instruction à DerLig.

Ton code avec LigMax:

'En cas d'utilisation répétée d'un même objet :
With Workbooks("MonClasseur.xlsm").Sheets("Feuil1") 'Toute instruction commençant par "." s'y rattache
   LigMax = .Range("A60000").End(xlUp).Row + 1 'Trouve la première ligne vide en colonne A
   .Range("A" & LigMax).Value = "Bonjour" 'Mettre "Bonjour" dans la première cellule vide
   .Range("A" & LigMax).Font.Color = RGB(255, 0, 0) 'Mets le texte en rouge
End With

Mon code avec DerLig:

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

Mon code ne fonctionne pas alors j'ai fait étape par étape : VBA me surligne la ligne de code

DerLig = UsedRange.Rows.Count '

Est-ce parce que j'ai oublié d'indiquer une plage de cellules ?

Précise la feuille de travail avant UsedRange...

D'autre part, DerLig est juste un numéro de ligne, pas une adresse de cellule.

Attention donc en écrivant Range("A1" & DerLig). Par exemple, si DerLig = 100, tu fera référence à "A1100" avec cette écriture.

Donc du coup je peux simplement mettre :

 .Range("A" & DerLig") 

Merciiii

Mon code semble aller dans le bon sens !

Sub VariableTexte()

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("A" & 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("A" & 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

Mais quand je l'exécute plusieurs fois, il remplit uniquement la première cellule sans remplir les autres en dessous.

Est-ce parce que je ne lui ai pas indiqué de remplir les cellules du dessous quand j'ai mis le DerLig ?

Pour l'instant, ton code ne fait référence qu'à 1 cellule, pas à une plage.

Comme sous Excel : A1 ≠ A1:A100

ça fonctionne jusqu'à A1001 quand je fais ça :

Sub VariableTexte()

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" & 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:A100" & 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

Donc ça veut dire que DerLig me remplira mon tableau quand une cellule sera vide ?

Sub VariableTexte()

Dim MyTxt As Variant 'Je déclare le type "Tous" 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" & DerLig) = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1").Value
Range("A1:A100" & 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

Dans ce code, j'ai changé As String par As Variant car puisque je veux une ligne de code qui me rapporte à mon classeur test3.xlsm, j'ai pensé que ce n'était plus du texte donc plus possible d'utiliser As String. J'ai bien fait ?

Et aussi du coup, j'ai changé mon "Un long texte que je ne vais pas réécrire plusieurs fois !" par Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1").Value

C'est possible dans ce code ?

ça fonctionne jusqu'à A1001 quand je fais ça :

Sub VariableTexte()

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" & 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:A100" & 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

Donc ça veut dire que DerLig me remplira mon tableau quand une cellule sera vide ?

Que cherches tu à faire ? Et qu'est ce qu'il y a dans ta feuille avant l'exécution de ce code ?

Reprenons en toute lettres ce que fait ce morceau de code.

Je compte le nombre de lignes utilisées en feuille 1

Sur la même plage que précédemment, j'écris le contenu de ma variable

Sub VariableTexte()

Dim MyTxt As Variant 'Je déclare le type "Tous" 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" & DerLig) = MyTxt 'A1 sera vide, car on a rien stocké pour l'instant dans notre variable
MyTxt = Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1").Value
Range("A1:A100" & 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

Dans ce code, j'ai changé As String par As Variant car puisque je veux une ligne de code qui me rapporte à mon classeur test3.xlsm, j'ai pensé que ce n'était plus du texte donc plus possible d'utiliser As String. J'ai bien fait ?

Et aussi du coup, j'ai changé mon "Un long texte que je ne vais pas réécrire plusieurs fois !" par Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1").Value

C'est possible dans ce code ?

Encore une fois tu vas trop vite, cet extrait de code est bidon et tu ne le maîtrise pas encore...

Précise la feuille de travail avant UsedRange...

D'autre part, DerLig est juste un numéro de ligne, pas une adresse de cellule.

Attention donc en écrivant Range("A1" & DerLig). Par exemple, si DerLig = 100, tu fera référence à "A1100" avec cette écriture.

Je te renvoie à cette partie, pour que tu comprennes bien que ton écriture Range("A1:A100" & DerLig) est un non-sens...

Remarque importante : ton ordinateur est bête, il fait exactement ce que tu écris, ni plus ni moins. La moindre erreur (un espace en trop dans un nom, un point mal placé, un objet non précisé...), il ne cherchera pas à corriger mais fera très exactement ce que tu demandes.

C'est pourquoi il faut être très rigoureux dans l'écriture, bien commenter le code pour ne pas se perdre, indenter (c'est à dire utiliser les retraits pour bien comprendre quelle structure est imbriquée dans telle autre structure...). Moi j'ai parfaitement compris ce que tu souhaites faire avec une plage variable, mais pour l'instant c'est pas ce que tu écris dans ton code et ce n'est donc pas ce que fera ton andouille d'ordinateur.

C'est pourquoi il faut que tu prennes le temps de bien faire, avant de complexifier...

Réponse premier message:

Je cherche à remplir la colonne A avec le texte . Avec le DerLig je cherche à chercher la cellule vide et la remplir avec le texte. Il n'y a rien dans ma feuille d’exécution de code. Je l'ai vidé.

Dans la plage A1:A100 à laquelle je colle mon nombre de lignes (attention, coller ≠ additionner), je ne mets rien (donc cette instruction est parfaitement inutile...)

Quand tu dis ça, je m'en doutais car je n'ai associé Mytxt qu'après cette ligne. Du coup est-ce que je peux supprimer cette ligne de code ?

Réponse deuxième message :

Oui je ne le maitrise pas encore mais j'essaie haha ! et je comprends au fur et à mesure

Sub VariableTexte()

Dim MyTxt As Variant 'Je déclare le type "Tous" 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
MyTxt = Workbooks("MonClasseur.xlsm").Worksheets("Feuil1").Range("A1:A100" & DerLig).Value = Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1:AE48").Value
Range("A:AE" & 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 pense que mon problème se trouve toujours dans la ligne

MyTxt = Workbooks("MonClasseur.xlsm").Worksheets("Feuil1").Range("A1:A100" & DerLig).Value = Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1:AE48").Value

Surtout que j'ai mis 2 "=", je pense que ça ne veut rien dire du coup ...

Tu trouves que je complexifie trop ?

Rechercher des sujets similaires à "transfert donnees classeur vba"