Copier une ligne vers un autre fichier préalablement ouvert

Y compris Power BI, Power Query et toute autre question en lien avec Excel
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 11:25

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
Modifié en dernier par Loerat le 25 avril 2019, 12:07, modifié 1 fois.
Avatar du membre
Baboutz
Membre fidèle
Membre fidèle
Messages : 412
Appréciations reçues : 32
Inscrit le : 19 avril 2019
Version d'Excel : 2016 FR

Message par Baboutz » 25 avril 2019, 11:39

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 :wink:
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 11:57

Bonjour Baboutz,

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

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
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 12:07

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 !
Avatar du membre
Baboutz
Membre fidèle
Membre fidèle
Messages : 412
Appréciations reçues : 32
Inscrit le : 19 avril 2019
Version d'Excel : 2016 FR

Message par Baboutz » 25 avril 2019, 12:17

(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 !
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 13:07

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
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 13:27

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
Avatar du membre
Baboutz
Membre fidèle
Membre fidèle
Messages : 412
Appréciations reçues : 32
Inscrit le : 19 avril 2019
Version d'Excel : 2016 FR

Message par Baboutz » 25 avril 2019, 15:18

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. :wink:

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")
L
Loerat
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 9 avril 2019
Version d'Excel : 2016

Message par Loerat » 25 avril 2019, 15:27

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 ?
Avatar du membre
Baboutz
Membre fidèle
Membre fidèle
Messages : 412
Appréciations reçues : 32
Inscrit le : 19 avril 2019
Version d'Excel : 2016 FR

Message par Baboutz » 25 avril 2019, 15:42

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 ? ;-b)
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message