Se connecter avec
S'enregistrer | Connectez-vous

Copier et coller avec link:=true

Dernière réponse : dans Programmation


salut le forum,
avec ce code, je veux copier et coller des données de la feuille 1 à la feuille 2 si les cellules de la colone 1 contient 1050.
et je veux mettre un lien entre ces deux feuilles de façon à ce que si il ya une modif dans une des feuilles, l'autre en tienne compte
a votre avis, qu'est ce qui cloche sur ce code? Merci

  1. Sub testlinktrue()
  2. 'Pour le site 1050, copier et coller dans feuille Finistère sud
  3.  
  4. Dim i As Integer
  5. Dim j As Integer
  6.  
  7. Dim x As Worksheet
  8. Dim y As Worksheet
  9.  
  10. Sheets("Feuil1").Range("A1:L1").Copy
  11. ActiveSheet.Paste Destination:=Worksheets("Feuil2").Range("A1:L1")
  12.  
  13. Set x = Worksheets("Feuil1")
  14. Set y = Worksheets("Feuil2")
  15.  
  16. j = 2
  17.  
  18. For i = 3 To 10000
  19. If x.Cells(i, 1).Text = "1050" Then
  20. x.Range(x.Cells(i, 1), x.Cells(i, 11)).Copy
  21. y.Range(y.Cells(j, 1), y.Cells(j, 11)).Activate
  22. ActiveSheet.Paste link:=True
  23. j = j + 1
  24. End If
  25. Next
  26. Application.CutCopyMode = False
  27. End Sub

Autres pages sur : copier coller link true

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Pour répondre à ta question sur le presse-papier, (re)lis l'aide sur Copy Destination:= et sur Paste. Tu auras ta réponse ;) 

Bon, tu me remplaces ce 10000 par quelque chose de plus intelligent ? Je t'ai donné une bonne piste.

Quant au fait que ça ne marche pas, je pense que c'est ton histoire de liens ? Si c'est ça, voilà :
Il faut parcourir chaque cellule de chaque ligne, et y mettre "=Feuil1!A1" dans la formule.
  1. Dim x As Worksheet
  2. Dim y As Worksheet
  3. Dim zone_x As Range
  4. Dim row_x As Range
  5. Dim row_y As Range
  6. Dim cell_x As Range
  7. Dim i As Integer
  8. Dim j As Integer
  9.  
  10. Set x = Worksheets(1)
  11. Set y = Worksheets(2)
  12.  
  13. Set zone_x = Intersect(x.Range("A:L"), x.Range(x.Rows(2), x.Rows(10000)))
  14.  
  15. Set row_y = y.Rows(2)
  16. For Each row_x In zone_x.Rows
  17. If row_x.Cells(1).Text = "1050" Then
  18. For Each cell_x In row_x.Cells
  19. row_y.Cells(cell_x.Column).Formula = "=" & cell_x.Worksheet.Name & "!" & cell_x.Address
  20. Next
  21. Set row_y = row_y.Offset(1)
  22. End If
  23. Next
Expert Programmation

Salut fopy.

Rholalalalala :pfff:  Mais quel code horrible. Tu mélanges Sheet, Worksheet, tu utilises le presse-papier (c'est mal), tu tapes au pif sur 10000 lignes, tu jongles entre les feuilles actives ou pas...
La déclaration de x et y, c'est bien. Pourquoi ne pas le faire avant les lignes 7 et 8 et s'en servir ?
Ligne 18, qu'est-ce que tu cherches à activer ? La feuille y ? La plage 1:11 x j ?

Bon, sinon, il n'est pas possible d'avoir une relation dans les deux sens entre tes deux feuilles.
Certes, l'une peut afficher les données de l'autre, mais par des liens (Link) que tu briserais si tu modifiais cette feuille.

Revois un peu ton code. Réflechis à la problématique de la modif dans les deux feuilles. Fais des propositions.
(J'ai d'autrs idées pour toi ;)  )

Que penses tu de ça ?

  1. Sub testlinktrue()
  2.  
  3. Dim x As Worksheet
  4. Dim y As Worksheet
  5. Set x = Worksheets("Feuil1")
  6. Set y = Worksheets("Feuil2")
  7.  
  8. Dim i As Integer
  9. Dim j As Integer
  10.  
  11. x.Range("A1:L1").Copy
  12. ActiveSheet.Paste Destination:=y.Range("A1:L1")
  13.  
  14. j = 2
  15.  
  16. For i = 2 To 10000
  17. If x.Cells(i).Text = "1050" Then
  18. x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
  19. 'ActiveSheet.Paste link:=True
  20. j = j + 1
  21. End If
  22. Next
  23. Application.CutCopyMode = False
  24.  
  25. End Sub


j'ai choisi, 10000 car mon tableau n'excédera jamais 10000,
mais j'ai esayé de mettre
  1. for i to worksheets.count, mais ce n'est pas terrible

pour le lien, si c'est impossible dans les 2 sens, c'est pas grave,
car de toute façon l'utilisateur ne fait les modifications que sur la feuille 1
Expert Programmation

Mouhais... Bof... :o  ...
Je vais donc t'aider ;) 

  1. Dim x As Worksheet
  2. Dim y As Worksheet
  3. Set x = Worksheets("Feuil1" )
  4. Set y = Worksheets("Feuil2" )
Bien ! :) 
  1. Dim i As Integer
  2. Dim j As Integer
  1. x.Range("A1:L1" ).Copy
  2. ActiveSheet.Paste Destination:=y.Range("A1:L1" )
Rhaaaa x_X
Mais non, voyons. D'abord, on ne veut pas considérer kla feuille active, mais x ou y.
Et tu utilises le presse-papier qui est réservé à l'utilisteur (Imagine si tous les programmes se servaient du presse-papier :pfff:  )
C'est tellement simple en fait :
  1. x.Range("A1:L1" ).Copy Destination:=y.Range("A1:L1" )

  1. j = 2
  2.  
  3. For i = 2 To 10000
  4. If x.Cells(i).Text = "1050" Then
  5. x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
Ah ben tu le fais bien ici !!!!!!!!!!
(Sauf qu'il manque les colonnes)
  1. j = j + 1
  2. End If
  3. Next
  1. Application.CutCopyMode = False
Ce truc ne sert plus à rien du coup.

Pour déterminer la dernière ligne, inspire-toi de ce topic : http://www.presence-pc.com/forum/ppc/Programmation/tuto...

La solution est proche. :) 

-------------------------------

  1. x.Range(x.Cells(i, 1), x.Cells(i, 11))
C'est pas mal. Regarde comment je l'écris, avec un peu d'habitude, ça devient limpide, impossible de se tromper :
  1. x.Range("A:K").Rows(i)

En passant, sur le même principe, si tu as fait exprès de ne pas mettre les colonnes tout à l'heure, alors ton code devient :
  1. x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
  2. ' // -->
  3. x.Rows(i).Copy y.Rows(j)


Fais des commentaires...

salut zeb, voici ce que j'ai refais :
  1. Sub testlinktrue()
  2.  
  3. Dim x As Worksheet
  4. Dim y As Worksheet
  5. Set x = Worksheets("Feuil1")
  6. Set y = Worksheets("Feuil2")
  7.  
  8. Dim i As Integer
  9. Dim j As Integer
  10.  
  11. x.Range("A1:L1").Copy Destination:=y.Range("A1:L1")
  12. ' en fait, c'est le fait d'écrire activesheet.paste qui fait qu'on utilise le presse papier ? je me trompe?
  13.  
  14. j = 2
  15.  
  16. For i = 2 To 10000
  17. If x.Cells(i, 1).Text = "1050" Then
  18. x.Rows(i).Copy y.Rows(j)
  19. j = j + 1
  20.  
  21. End If
  22. Next
  23. x.Cells(i, 1).value = y.Cells(i, 1).value
  24. End Sub


Mais mon problème n'esst toujours pas résolu :( 
Expert Programmation

:sarcastic: 

Mon truc à moi, c'est le kornshell sous UNIX. Quelqu'un peut m'expliquer ce que je fous à répondre aux pauv'es malheureux qui galèrent avec leurs macros en VB ?

Sinon, Ludo, tu viens de redécouvrir le bon jeu de mots de Microsoft sur cell (cellule) et excellent que je ne traduirais pas.
Donner aux logiciels des noms pleins d'astuces, de références est une tradition qui se perd.
Expert Programmation

fopy12 a dit :
je remplace 10 000 par
  1. x.cells(.rows.count, 1).end (xlUp)
:??: 

Euh, plus ou moins. Il manque le nom de la feuille devant le .Rows.Count. 10000 est un entier, x.cells(.rows.count, 1).end(xlUp) est une cellule.
Dans mon code, j'ai écris Rows(10000) qui est une ligne. Il faut donc renvoyer une ligne.

  1. ' // Pas très malin
  2. Rows(x.cells(.rows.count, 1).end(xlUp).Row)
  3. ' // Bien vu
  4. x.cells(.rows.count, 1).end(xlUp).EntireRow


fopy12 a dit :
sinon je n'arrive pas à comprende ceci :
  1. row_y.Cells(cell_x.Column).Formula = "=" & cell_x.Worksheet.Name & "!" & cell_x.Address
:whistle: 

Il y a plein de chose là-dedans. Qu'est-ce que tu ne comprends pas ?

non c'est pas cela.
c'est que j'ai honte de poser ma question
:whistle: 

mais bon apres tout, de toute facon j'ai dû en poser pire

le point d'exclamation sert à quoi? à faire le lien entre l'adresse de la cellule et la feuille ?
Expert Programmation

Voui. c'est cela :lol: 
Ce n'est pas du VB, c'est de l'Excel.

---------------------

Jouons avec notre tableur .
Dans la première feuille, dans la cellule A1, mets une valeur.
Sélectionne la cellule et copie-la dans le presse-papier.
Pointe sur le seconde feuille, pointe sur la cellule B2.
Ouvre le menu Edition / Collage Spéciale. Une boîte de message s'ouvre.
Choisis de valider cette boîte avec le bouton "Coller avec liaison".

Observe la valeur de la cellule B2. Observes-en aussi la formule.
Réponds à ta question.
Expert Programmation

...

Tu veux exécuter automatiquement des commandes sur Excel avant de bien connaître Excel. Ne serait-ce pas mettre la charrue avant les bœufs ?
:o 

(Perso, je ne me souviens pas avoir jamais fait autrement [:patch])

:hello: 
J'ai essayé d'adapter ton conseil : ne pas mettre 10000 et mettre un truc plus "professionnel"
(et dire que y a un mois et demi de cela je ne savais meme pas ecrire une demi ligne de code :sol:  )
Mais ça ne marche pas. Voici mon code . MERCI zeb

  1. Option Explicit
  2.  
  3. Sub test()
  4. 'On supprime les lignes dont on n'a pas besoin
  5. Dim i As Integer
  6. Dim x As Worksheet
  7. Set x = Worksheets("Général")
  8.  
  9. For i = 2 To Rows(x.Cells.Count, 1).End(xlUp).Row
  10. If x.Cells(i, 1).Text = "1750" Then
  11. If x.Cells(i, 2).Text <> "4241" Then
  12. x.Cells(i, 1).EntireRow.Delete
  13. End If
  14. End If
  15. i = i + 1
  16. Next i
  17.  
  18. End Sub

Expert Programmation

Ohlala malheureuse, tu fais pleins d'erreurs plus grosses les unes que les autres.

  1. For i = 2 To Rows(x.Cells.Count, 1).End(xlUp).Row
  2. If x.Cells(i, 1).Text = "1750" Then
  3. If x.Cells(i, 2).Text <> "4241" Then
  4. x.Cells(i, 1).EntireRow.Delete
  5. End If
  6. End If
  7. i = i + 1
  8. Next i


Ligne 1 : erreur 1
Tu comptes les cellules, pas les lignes !!!!!

Il y a Count lignes (Rows) dans ta feuille x.
Ça s'écrit :
  1. x.Rows.Count


On va se placer dans une cellule (Cells) en particulier de la feuille x, à la dernière ligne, à telle colonne - par exemple la première, et on remonte (End(xlUp))
Ça s'écrit :
  1. Dim ligne As Long
  2. Dim colonne As Long
  3.  
  4. ligne = x.Rows.Count
  5. colonne = 1
  6.  
  7. .... x.Cells(ligne, colonne).End(xlUp)
Ou, en condensé :
  1. .... x.Cells(x.Rows.Count, 1).End(xlUp)


Ça donne :
  1. For i = 2 To x.Cells(x.Rows.Count, 1).End(xlUp).Row


Lignes 2 et 3 : erreur 2
Bon, spa vraiment une erreur mais bon. Tu as deux conditions, n'en fais qu'une !
  1. If x.Cells(i, 1).Text = "1750" And x.Cells(i, 2).Text <> "4241" Then


Ligne 4 : pas d'erreur.
Mais on peut pinailler.
  1. ' // Bien
  2. x.Cells(i, 1).EntireRow.Delete
  3. ' // Mieux
  4. x.Rows(i).Delete
:sol:  :lol: 

Lignes 5 & 6 : pas d'erreur.
Et même rien à redire :ange: 

Ligne 7 : Argggggghh
x_X
Alors là, c'est la mort du p'tit cheval. Qui t'a autorisé à toucher à la variable de la boucle For ? Elle n'est pas à toi cette variable, elle est à For. C'est le Next qui va faire le boulot d'incrémentation. Toi, tu gardes tes mains pleines de doigts dans tes poches et t'y touches pô !
:o 

Ligne 8 : Pas d'erreur
Mais si t'es vraiment un p'tit jeune qui débute, t'arrête tout de suite de programmer comme on le faisait en 1985.
Autrefois, on numérotait ses lignes, on faisait des goto, on écrivait tout aligné sur la marge de gauche parce qu'on avait que 80 caractères par ligne, en comptant la numérotation. Bref, c'était un gros merdier que de se relire. Pour s'aider un peu, on rappelait derrière le Next de chaque For la variable de boucle.
Aujourd'hui, on a l'indentation, qui est une sorte de 1er commandement du Dieu de l'Informatique.
(Et t'as pas intérêt à commettre le péché de ne pas le respecter parce qu'ici, je suis le bras armé de la Sainte Inquisition.)

-------------------

Et ça ne marche toujours pas... Pourquoi ? Eh, eh, eh :sol:  Le problème est pourtant classissique :o  Et donc la solution est connue.
Bonne lecture : http://www.presence-pc.com/forum/ppc/Programmation/tuto...

:??:  , Moi qui commençait à me la peter un peu au bureau :)  !!!
enfin bref, merci pour les explications c plus clair dans ma petite tete de débutante
pour ce qui est de :
  1. Rows(x.cells.count,1).End(xlUp).Row


sinon que penses tu de cela? j'ai une erreur sur la ligne 8 :??: 
  1. Option Explicit
  2. Sub test()
  3. 'On supprime les lignes dont on n'a pas besoin
  4. Dim i As Integer
  5. Dim x As Worksheet
  6. Set x = Worksheets("Général")
  7.  
  8. For i = Rows(x.Cells.Count, 1).End(xlUp).Row To 2 Step -1
  9. If x.Cells(i, 1).Text = "1750" And x.Cells(i, 2).Text <> "4241" Then
  10. x.Rows(i).Delete
  11. End If
  12. Next
  13.  
  14. End Sub

Lassé par la pub ? Créez un compte