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

Je sais mais j'apprends vraiment en bidouillant et en ne comprenant pas ce que je fais à la base ! Tu n'imagines pas comment j'ai progressé en VBA depuis 1 semaine, et ça grâce à toi et aux cours VBA et youtube que je regarde.

Désolée si je te pose des questions bêtes et qui n'ont surement aucun sens pour toi (qui ne paraissent pas réfléchi) mais c'est parce que je me forme, j'apprends... Et également désolée de t'avoir autant embêté mais en tout cas, tu peux être fier de toi: tu m'as vraiment fait progressé car par rapport à tes remarques, je suis allée dans les cours VBA et j'ai fait tous les liens que je ne faisais pas !

Merci

Je sais mais j'apprends vraiment en bidouillant et en ne comprenant pas ce que je fais à la base ! Tu n'imagines pas comment j'ai progressé en VBA depuis 1 semaine, et ça grâce à toi et aux cours VBA et youtube que je regarde.

Désolée si je te pose des questions bêtes et qui n'ont surement aucun sens pour toi (qui ne paraissent pas réfléchi) mais c'est parce que je me forme, j'apprends... Et également désolée de t'avoir autant embêté mais en tout cas, tu peux être fier de toi: tu m'as vraiment fait progressé car par rapport à tes remarques, je suis allée dans les cours VBA et j'ai fait tous les liens que je ne faisais pas !

Merci

C'est bien ce que je suis en train de te dire, mets de côté ta (ou tes) problématique(s) pour l'instant et concentre toi sur l'apprentissage en bonne et due forme plutôt que sur la bidouille. Ca t'évitera aussi de recommencer plusieurs fois un même travail au fur et à mesure que tu apprends. Je te garantie que tu perdras moins de temps...

Je maintiens aussi que l'apprentissage de VBA ne peut être dissocié de l'apprentissage des fonctionnalités d'Excel. Pour ces deux aspects, les cours du site sont bien conçus et peuvent être complétés par les innombrables cours disponibles sur Internet...

Oui bien sur c'est ce que je fais !

Enfait, je prends deux ou trois heures sur les cours VBA et cours EXCEL disponibles sur le forum. Je les fais tous. Je les teste tous et quand je ne les comprends pas j'approfondis.

Mais puisque je dois aussi avancer dans mon travail, j'alterne et je code un peu pendant deux ou trois heures.

Oui bien sur c'est ce que je fais !

Enfait, je prends deux ou trois heures sur les cours VBA et cours EXCEL disponibles sur le forum. Je les fais tous. Je les teste tous et quand je ne les comprends pas j'approfondis.

Mais puisque je dois aussi avancer dans mon travail, j'alterne et je code un peu pendant deux ou trois heures.

Tu es sur la bonne voie, continue tes efforts et ménage toi des pauses quand ta concentration décline !

Regarde, j'ai réussi à faire un code (presque) toute seule haha !

Sub ImporterBDD()
'on déclare nos variables
Dim cheminfichier As String, WSsource As Worksheet, WSdest As Worksheet, DerLig As Long, LigImport As Long

        'On affecte la feuille active à un nom, pour pouvoir y revenir facilement
        Set WSdest = Workbooks("Test.xlsm").Sheets("Feuil2")
        With WSdest
            DerLig = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'Première ligne vide de la feuille
        End With

        'Sélection de la feuille source
        Set WSsource = Workbooks("Test.xlsm").Sheets("Feuil1")

        'Report des valeurs
        WSdest.Range("A" & DerLig) = WSsource.Range("A1" & DerLig)

End Sub

Et il fonctionne !!!

...mets de côté ta (ou tes) problématique(s) pour l'instant...

Ton code ne génère pas d'erreur, de là à dire qu'il fonctionne...

Range("A" & DerLig) est une cellule vide, donc reporter son contenu n'est pas très très intéressant. Maintenant, tu répètes encore une erreur que tu as déjà faite plusieurs fois :

Range("A1" & DerLig)

Car je doute que ton souhait soit de reporter la donnée avec un décalage de ligne d'un facteur 10.

Oui je l'ai vu juste après te l'avoir envoyé mdr

je l'ai directement enlevé !

Salut !

Comment tu vas ?

Alors voilà, j'ai refait un code simple par moi-même :

Sub Importerengie()

    Sheets("Feuil1").Columns("C").Value = Sheets("WBsource").Columns("C").Value
    Sheets("Feuil1") .Columns("G" & Ligne).Value = Sheets("WBsource").Columns("F").Value
    Sheets("Feuil1") .Columns("M" & Ligne).Value = Sheets("WBsource").Columns("N").Value
    Sheets("Feuil1").Columns("P" & Ligne).Value = Sheets("WBsource").Columns("AC").Value
    Sheets("Feuil1").Columns("Q" & Ligne).Value = Sheets("WBsource").Columns("AE").Value

End Sub

Que j'ai transformé en ceci et qui fonctionne de la même manière:

Sub Importerengie()

    With Sheets("Feuil1")
    .Columns("C").Value = Sheets("WBsource").Columns("C").Value
    .Columns("G").Value = Sheets("WBsource").Columns("F").Value
    .Columns("M").Value = Sheets("WBsource").Columns("N").Value
    .Columns("P").Value = Sheets("WBsource").Columns("AC").Value
    .Columns("Q").Value = Sheets("WBsource").Columns("AE").Value
    End With

End Sub

Ce code ne permet pas de compter les champs (titre des colonnes). Alors pour cela, je me suis dit qu'il fallait que j'utilise une procédure qui aille détecter la dernière cellule non-vide (ou la première cellule vide).

J'aurais pu utiliser DerLig en ajoutant +1 pour être directement sur la première ligne vide. Sauf que dans mes colonnes, des cellules peuvent être vide sans être les dernières cellules de ma BDD. Du coup je me suis dit que j'allais utiliser cette ligne de code

Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

qui permet d'aller chercher la dernière cellule non vide de toute ma BDD. Je l'ai intégré ainsi dans mon code :

Sub Importerengie()

Dim Ligne As Long
Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    With Sheets("Feuil1")
    .Range("C" & Ligne).Value = Sheets("WBsource").Columns("C").Value
    .Range("G" & Ligne).Value = Sheets("WBsource").Columns("F").Value
    .Range("M" & Ligne).Value = Sheets("WBsource").Columns("N").Value
    .Range("P" & Ligne).Value = Sheets("WBsource").Columns("AC").Value
    .Range("Q" & Ligne).Value = Sheets("WBsource").Columns("AE").Value
    End With

End Sub

Elle ne montre pas d'erreur mais ne fonctionne pas comme je voudrais. Avec ta vision extérieure, pourrais-tu me dire si tu vois une incohérence dans mon écriture stp ?

Voici mon hypothèse de changement : J'ai d'abord pensé que je devais remplacer

[codeLigne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row][/code]

par

Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Cells

Mon hypothèse n'est pas bonne car grâce à cette fonction je cherche la dernière ligne non vide / première ligne vide donc ce n'est pas ça le soucis...

Bon alors je l'ai mis dans la procédure WITH car je veux qu'elle concerne toutes les colonnes.

Sub Importerengie()

Dim Ligne As Long
Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    With Sheets("Feuil1").Rows(Ligne)
    .Columns("C").Value = Sheets("WBsource").Columns("C").Value
    .Columns("G").Value = Sheets("WBsource").Columns("F").Value
    .Columns("M").Value = Sheets("WBsource").Columns("N").Value
    .Columns("P").Value = Sheets("WBsource").Columns("AC").Value
    .Columns("Q").Value = Sheets("WBsource").Columns("AE").Value
    End With

End Sub

Encore une fois, le code ne présente pas d'erreur mais il ne réalise pas ce que je souhaite.

Mon hypothèse n'est pas bonne car grâce à cette fonction je cherche la dernière ligne non vide / première ligne vide donc ce n'est pas ça le soucis...

Salut !

.Row <-- la ligne

.Cells <-- les cellules

Si tu mets une dernière ligne sur la plage de destination, il faut aussi la mettre sur la plage source. Sinon tu essayes de faire rentrer le Titanic dans une boîte à chaussures !

Peut-être que parce qu'il y a déjà l'instruction

Row

dans

[codeLigne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row][/code]

et vu que je rajoute Row ici

With Sheets("Feuil1").Row(Ligne)

ça ne veut plus rien dire ?

Bon alors je l'ai mis dans la procédure WITH car je veux qu'elle concerne toutes les colonnes.

Sub Importerengie()

Dim Ligne As Long
Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    With Sheets("Feuil1").Rows(Ligne)
    .Columns("C").Value = Sheets("WBsource").Columns("C").Value
    .Columns("G").Value = Sheets("WBsource").Columns("F").Value
    .Columns("M").Value = Sheets("WBsource").Columns("N").Value
    .Columns("P").Value = Sheets("WBsource").Columns("AC").Value
    .Columns("Q").Value = Sheets("WBsource").Columns("AE").Value
    End With

End Sub

Encore une fois, le code ne présente pas d'erreur mais il ne réalise pas ce que je souhaite.

Je doute que cette écriture ne te renvoie aucune erreur ! ca revient à écrire (pour la première instruction) :

Sheets("Feuil1").Rows(Ligne).Columns("C").Value = Sheets("WBsource").Columns("C").Value

Ce qui n'a évidemment pas de sens(la colonne C de la dernière ligne...) !

Peut-être que parce qu'il y a déjà l'instruction

Row

dans

[codeLigne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row][/code]

et vu que je rajoute Row ici

With Sheets("Feuil1").Row(Ligne)

ça ne veut plus rien dire ?

Truc.Row te donne un indice de ligne, que tu peux ensuite utiliser dans un objet Rows(indice) , qui désigne la plage correspondant à la ligne en question.

Alors comment est-ce que je peux utiliser

Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

?

De la même façon que nous avons utilisé DerLig dans les exemples précédents ?

Alors comment est-ce que je peux utiliser

Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

?

De la même façon que nous avons utilisé DerLig dans les exemples précédents ?

Lis toutes mes réponses...

Peut-être que parce qu'il y a déjà l'instruction

Row

dans

[codeLigne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row][/code]

et vu que je rajoute Row ici

With Sheets("Feuil1").Row(Ligne)

ça ne veut plus rien dire ?

Truc.Row te donne un indice de ligne, que tu peux ensuite utiliser dans un objet Rows(indice) , qui désigne la plage correspondant à la ligne en question.

ça m'intéresse car je pense ne pas être très loin de ce que tu veux dire mais j'avoue que mes tentatives ne fonctionnent pas encore

Saluuuut !

Bon alors j'ai tenté autre chose :

Faire une boucle For qui permet de balayer les lignes et qui contient une condition IF qui dit "si la cellule est vide" alors remplir les colonnes.

Si faux "continuer à balayer les lignes".

J'en suis là :

Sub Importerengie()
Dim Ligne As Long
Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    For i = 1 To i = Ligne
        If (IsEmpty(ActiveCells)) Then
            With Sheets("WBdest")
                .Columns("C").Value = Sheets("WBsource").Columns("C").Value
                .Columns("G").Value = Sheets("WBsource").Columns("F").Value
                .Columns("M").Value = Sheets("WBsource").Columns("N").Value
                .Columns("P").Value = Sheets("WBsource").Columns("AC").Value
                .Columns("Q").Value = Sheets("WBsource").Columns("AE").Value
                End With

            Else
        End If
    Next
End Sub

Qu'en penses-tu ?

un collègue m'a expliqué que si j'utilisais cette boucle, je me compliquais moins la vie

un collègue m'a expliqué que si j'utilisais cette boucle, je me compliquais moins la vie

Bonjour,

Te compliquer la vie pour faire quoi ? Quel est l'intérêt de contrôler une valeur ici ? Encore une fois je ne sais pas ce que tu veux faire, je ne suis ni dans ta tête, ni sur tes fichiers (que je ne connais donc pas)...

Ton code est encore truffé d'incohérences :

Sub Importerengie()
Dim Ligne As Long
Ligne = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    For i = 1 To i = Ligne
        If (IsEmpty(ActiveCells)) Then 'ActiveCells sort d'où ? A quelles cellules cela correspond ? Penses tu que cette plage change à chaque incrémentation de ta boucle ? 
            With Sheets("WBdest")
                .Columns("C").Value = Sheets("WBsource").Columns("C").Value 'A quelle plage correspondent chaque élément de cette égalité ? Quel intérêt de les mettre dans une boucle ?
                .Columns("G").Value = Sheets("WBsource").Columns("F").Value
                .Columns("M").Value = Sheets("WBsource").Columns("N").Value
                .Columns("P").Value = Sheets("WBsource").Columns("AC").Value
                .Columns("Q").Value = Sheets("WBsource").Columns("AE").Value
                End With

            Else
        End If
    Next
End Sub

Je suis très intéressé de savoir ce que produit ce code à l'exécution !

Rechercher des sujets similaires à "transfert donnees classeur vba"