Copier une ligne vers un autre fichier préalablement ouvert

Bonjour à tous,

Je reviens vers vous pour un deuxième problème de VBA lors de mon apprentissage,

Je réalise un fichier de suivi des quantités utilisées de certains produits.

Pour ce faire dans un fichier réunissant plusieurs informations j'ai créé une macro qui va chercher et compiler les informations tout le code fonctionne.

Cependant par la suite afin de garder un historique je souhaite aller copier mes valeurs dans un autre fichier d'archivage. J'ai regarder sur des dizaines de forum mais aucune solution ne fonctionne.

Une fois mes boucles finis je souhaite copier les informations sur la ligne équivalente à "valeursemaine"

Je viens donc vers vous avec ma dernière version qui ne fonctionne pas (elle renvoie erreur d’exécution 9).

Avez-vous une idée de l'origine du problème?

D'avance merci beaucoup pour votre aide,

Bien cordialement,

Sub recap()

Dim i As Integer

i = 6

Dim j As Integer, DetergentMelangeur As Integer, OXY As Integer, DetergentFondoir As Integer, DesinfectantFondoir As Integer, DesinfectantMelangeur As Integer

Dim recap As String

recap = ""

Dim valeursemaine As Integer

valeursemaine = InputBox("Veuillez rentrer le numéro de semaine que vous souhaitez actualiser", "Quelle semaine ?", 0) + 4

For i = 6 To 56 Step 5

     If Sheets("PLANNING").Range("B" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("B" & i + 2).Value + "(GOAVEC)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("B" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

     If Sheets("PLANNING").Range("E" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("E" & i + 2).Value + "(LOTION)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("E" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

  If Sheets("PLANNING").Range("H" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("H" & i + 2).Value + "(TRIMIX 1)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("H" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("K" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("K" & i + 2).Value + "(TRIMIX 3)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("K" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("N" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("N" & i + 2).Value + "(TRIMIX 5)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("N" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("Q" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("Q" & i + 2).Value + "(Fab x3)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("Q" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("T" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("T" & i + 2).Value + "(TRIMIX 4)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("T" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("W" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("W" & i + 2).Value + "(TRIMIX 6)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("W" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("Z" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("Z" & i + 2).Value + "(TRIMIX 7)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("Z" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

If Sheets("PLANNING").Range("AC" & i) <> 0 Then
      recap = recap + Sheets("PLANNING").Range("AC" & i + 2).Value + "(INTM)/"
         For j = 3 To 367
           If Sheets("MODEOP").Range("A" & j).Value = Sheets("PLANNING").Range("AC" & i) Then
         DetergentMelangeur = DetergentMelangeur + Sheets("MODEOP").Range("T" & j).Value
         OXY = OXY + Sheets("MODEOP").Range("U" & j).Value
         DetergentFondoir = DetergentFondoir + Sheets("MODEOP").Range("V" & j).Value
         DesinfectantFondoir = DesinfectantFondoir + Sheets("MODEOP").Range("W" & j).Value
         DesinfectantMelangeur = DesinfectantMelangeur + Sheets("MODEOP").Range("X" & j).Value
           End If
         Next
     End If

Next

Sheets("Feuil1").Range("H" & valeursemaine).Value = DesinfectantMelangeur + DesinfectantFondoir + DetergentFondoir + OXY + DetergentMelangeur
Sheets("Feuil1").Range("G" & valeursemaine).Value = DesinfectantMelangeur
Sheets("Feuil1").Range("F" & valeursemaine).Value = DesinfectantFondoir
Sheets("Feuil1").Range("E" & valeursemaine).Value = DetergentFondoir
Sheets("Feuil1").Range("D" & valeursemaine).Value = OXY
Sheets("Feuil1").Range("C" & valeursemaine).Value = DetergentMelangeur

 ' Les lignes suivantes ne fonctionnent pas, il s'agit des lignes ou je tente d'aller copier mes informations
Workbooks.Open ("D:\Users\Desktop\Pilotage consommations produits de nettoyage\Copie des fichiers utiles\FICHIER_MONITORING_CONSOMMATION_ARCHIVAGE.xlsx")  ' On ouvre le fichier archivage

Workbooks(FICHIER_MONITORING_CONSOMMATION_ARCHIVAGE).Sheets("Archive").Rows(valeursemaine).Value = Workbooks(FICHIER_MONITORING_CONSOMMATION).Sheets("Feuil1").Rows(valeursemaine).Value

End Sub

Salut Loerat,

c'est assez illisible un énorme code comme ça qui plus est n'est pas entre les balises code...

As-tu essayé cette technique ?

    Dim CopyRange As Range
       Dim PasteRange As Range

       Set CopyRange = ThisWorkbook.Sheets("Feuille1").Range("A1:G20")
        Set PasteRange = ThisWorkbook.Sheets("Feuille2").Range("A1:G20")

        PasteRange.Value2 = CopyRange.Value2

En mettant bien évidemment les liens de tes fichiers Excel à la place des feuilles

Bonjour Baboutz,

Tout d'abord merci d'avoir pris le temps de me répondre et désolé pour l'énorme code

Je vais essayer ta technique, lorsque tu parles des liens tu veux dire mais nom de feuille à moi ou le chemin vers le fichier ?

Merci de ton aide

Re bonjour,

J'ai essayé ta méthode, bonne nouvelle elle fonctionne sans erreur mais ne copie pas les informations dans le fichiers qu'elle vient ouvrir.

Mais cela vient certainement du fait que j'ai du mal à comprendre comment fonctionne les SET. Quel est leur rôle ?

J'ai essayé ceci :

Set CopyRange = ThisWorkbook.Sheets("Feuil1").Rows(valeursemaine)

        Set PasteRange = ThisWorkbook.Sheets("Feuil1").Rows(valeursemaine)

        PasteRange.Value2 = CopyRange.Value2

Workbooks.Open ("D:\Users\lollevie\Desktop\Pilotage consommations produits de nettoyage Fabrication SOINS\Copie des fichiers utiles\FICHIER_MONITORING_CONSOMMATION_ARCHIVAGE.xlsx")  ' On ouvre le fichier archivage

Merci de ton aide !

(Je n'ai pas lu tout ton code pour ne pas te mentir ahah)

Set c'est pour affecter un objet à une variable !

Dim c'est pour affecter une valeur à une variable

Sinon je crois qu'un truc du genre dois marcher au lieu de ThisWorkbook :

Workbooks (NomDuFichier).Sheets(nomdelafeuille)

Par contre attention !! "Rows" doit contenir une plage de cellules, donc les deux cellules qui vont définir ta sélection !

Re-regarde comment j'ai fait plus haut, puis adapte ton code en fonction de tes cellules !

Pas de soucis je comprends tout à fait

D'accord je vois, mais j'ai encore une question. En fait quel va être la fonction de CopyRange et PasteRange quel est le rôle de chacun ?

Je vais essayer à nouveau je te tiens au courant, j'essaie de l'adapter au fait que ma ligne est donner par une entrée en MsgBox.

Merci beaucoup de ton aide

J'ai essayé le code suivant qui me renvoie un message d'erreur (Erreur d'exécution 9)

Set MaPlage = Columns("A:H").Rows(valeursemaine)

Set CopyRange = Workbooks(FICHIER_MONITORING_CONSOMMATION).Sheets("Feuil1").Range(MaPlage)

Set PasteRange = Workbooks(FICHIER_MONITORING_CONSOMMATION_ARCHIVAGE).Sheets("Archive").Range(MaPlage)

        PasteRange.Value2 = CopyRange.Value2

End Sub

Aurais tu une idée de pourquoi ?

Merci d'avance

CopyRange et PasteRange c'est pour faire comme un copié/collé ! Mais faire un copié/collé en vba c'est très très déconseillé.

Donc avec CopyRange, tu vas définir une plage de cellule avec les valeurs que tu veux copié et avec PasteRange tu définis une plage de cellule avec les valeurs que tu vas collé !

CopyRange et PasteRange sont en gros des tableaux. Mais attention ! Ils doivent avoir la même taille ! Donc si CopyRange à 3 colonnes et 2 lignes, PasteRange doit également avoir 3 colonnes et 2 lignes.

C'est pour ça que je ne comprends pas cette ligne :

Set MaPlage = Columns("A:H").Rows(valeursemaine)

valeursemaine c'est quoi ?

Tu devrais avoir un truc comme ça (valeurs des cellules totalement au pif) :

Set CopyRange = Workbooks(FICHIER_MONITORING_CONSOMMATION).Sheets("Feuil1").Range("B56:F70")
Set PasteRange = Workbooks(FICHIER_MONITORING_CONSOMMATION_ARCHIVAGE).Sheets("Archive").Range("A1:15")

D'accord je vois mieux le principe maintenant!

En fait valeursemaine correspond au numéro de la semaine que je souhaite actualiser, et je l'utilise pour indiquer quelle ligne mettre à jour.

J'ai essayé comme tu m'as envoyé avec des cellules aléatoires et je tombe toujours sur un message d'erreur qui me dit que l'indice n'appartient pas à la sélection :/

Est ce que cela provient du fait que je souhaite écrire dans un autre classeur ?

D'accord, je vois !

Si j'ai bien compris valeursemaine est le numéro de la semaine, 17 pour celle en cours par exemple.

Avec ça tu veux récupérer ta ligne, donc avec ce code :

Dim maplage As String
valeursemaine .Select
maplage = Windows(ThisWorkbook.Name).ActiveCell.Row

Et ensuite tu peux définir ta plage de cellules à copiées :

Set CopyRange = Workbooks(FICHIER_MONITORING_CONSOMMATION).Sheets("Feuil1").Range("A" & maplage & ":H" & maplage)

Qu'en penses-tu ?

Oui c'est exactement cela!

J'ai essayé à nouveau avec ce que tu m'as donné mais je n'arrive pas avec cette partie là : Range("A" & maplage & ":H" & maplage) qui m'affiche toujours un message d'erreur :/

Cependant je me suis dis que la grosse macro n'aidé pas à prendre du recul. J'ai donc fait une nouvelle macro uniquement pour l'archivage (en utilisant l'enregistrement) et j'ai modifié le code pour qu'il puisse y avior un indice "i". Finalement cela fonctionne !!!

Merci beaucoup de ton aide !!

Salut,

Ah oui tu as bien fait de faire un nouvelle macro uniquement pour l'archivage !

Très content d'avoir pu t'aider, à bientôt !

Rechercher des sujets similaires à "copier ligne fichier prealablement ouvert"