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
Sub testlinktrue()
'Pour le site 1050, copier et coller dans feuille Finistère sud
Dim i As Integer
Dim j As Integer
Dim x As Worksheet
Dim y As Worksheet
Sheets("Feuil1").Range("A1:L1").Copy
ActiveSheet.Paste Destination:=Worksheets("Feuil2").Range("A1:L1")
Set x = Worksheets("Feuil1")
Set y = Worksheets("Feuil2")
j = 2
For i = 3 To 10000
If x.Cells(i, 1).Text = "1050" Then
x.Range(x.Cells(i, 1), x.Cells(i, 11)).Copy
y.Range(y.Cells(j, 1), y.Cells(j, 11)).Activate
ActiveSheet.Paste link:=True
j = j + 1
End If
Next
Application.CutCopyMode = False
End Sub
Autres pages sur : copier coller link true
Lassé par la pub ? Créez un compte
Meilleure solution
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.
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.
Dim x As Worksheet
Dim y As Worksheet
Dim zone_x As Range
Dim row_x As Range
Dim row_y As Range
Dim cell_x As Range
Dim i As Integer
Dim j As Integer
Set x = Worksheets(1)
Set y = Worksheets(2)
Set zone_x = Intersect(x.Range("A:L"), x.Range(x.Rows(2), x.Rows(10000)))
Set row_y = y.Rows(2)
For Each row_x In zone_x.Rows
If row_x.Cells(1).Text = "1050" Then
For Each cell_x In row_x.Cells
row_y.Cells(cell_x.Column).Formula = "=" & cell_x.Worksheet.Name & "!" & cell_x.Address
Next
Set row_y = row_y.Offset(1)
End If
Next
Salut fopy.
Rholalalalala
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
)
Rholalalalala
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 ?
j'ai choisi, 10000 car mon tableau n'excédera jamais 10000,
mais j'ai esayé de mettre
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
Sub testlinktrue()
Dim x As Worksheet
Dim y As Worksheet
Set x = Worksheets("Feuil1")
Set y = Worksheets("Feuil2")
Dim i As Integer
Dim j As Integer
x.Range("A1:L1").Copy
ActiveSheet.Paste Destination:=y.Range("A1:L1")
j = 2
For i = 2 To 10000
If x.Cells(i).Text = "1050" Then
x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
'ActiveSheet.Paste link:=True
j = j + 1
End If
Next
Application.CutCopyMode = False
End Sub
j'ai choisi, 10000 car mon tableau n'excédera jamais 10000,
mais j'ai esayé de mettre
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
Mouhais... Bof...
...
Je vais donc t'aider
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
)
C'est tellement simple en fait :
(Sauf qu'il manque les colonnes)
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.
-------------------------------
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 :
Fais des commentaires...
...Je vais donc t'aider
Bien !
Dim x As Worksheet
Dim y As Worksheet
Set x = Worksheets("Feuil1" )
Set y = Worksheets("Feuil2" )
Dim i As Integer
Dim j As Integer
Rhaaaa x_X
x.Range("A1:L1" ).Copy
ActiveSheet.Paste Destination:=y.Range("A1:L1" )
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
)C'est tellement simple en fait :
x.Range("A1:L1" ).Copy Destination:=y.Range("A1:L1" )
Ah ben tu le fais bien ici !!!!!!!!!!
j = 2
For i = 2 To 10000
If x.Cells(i).Text = "1050" Then
x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
(Sauf qu'il manque les colonnes)
j = j + 1
End If
Next
Ce truc ne sert plus à rien du coup.
Application.CutCopyMode = False
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.
-------------------------------
C'est pas mal. Regarde comment je l'écris, avec un peu d'habitude, ça devient limpide, impossible de se tromper :
x.Range(x.Cells(i, 1), x.Cells(i, 11))
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 :
x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
' // -->
x.Rows(i).Copy y.Rows(j)
Fais des commentaires...
zeb a dit :
Mouhais... Bof...
...Je vais donc t'aider
48925,5,523268 a dit :
Mouhais... Bof...
...Pour déterminer la dernière ligne, inspire-toi de ce topic : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
donne un autre indice stp
je ne vois pas ce que ça peut etre
salut zeb, voici ce que j'ai refais :
Mais mon problème n'esst toujours pas résolu
Sub testlinktrue()
Dim x As Worksheet
Dim y As Worksheet
Set x = Worksheets("Feuil1")
Set y = Worksheets("Feuil2")
Dim i As Integer
Dim j As Integer
x.Range("A1:L1").Copy Destination:=y.Range("A1:L1")
' en fait, c'est le fait d'écrire activesheet.paste qui fait qu'on utilise le presse papier ? je me trompe?
j = 2
For i = 2 To 10000
If x.Cells(i, 1).Text = "1050" Then
x.Rows(i).Copy y.Rows(j)
j = j + 1
End If
Next
x.Cells(i, 1).value = y.Cells(i, 1).value
End Sub
Mais mon problème n'esst toujours pas résolu
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.
fopy12 a dit :
je remplace 10 000 par
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.
' // Pas très malin Rows(x.cells(.rows.count, 1).end(xlUp).Row) ' // Bien vu x.cells(.rows.count, 1).end(xlUp).EntireRow
fopy12 a dit :
sinon je n'arrive pas à comprende ceci :
row_y.Cells(cell_x.Column).Formula = "=" & cell_x.Worksheet.Name & "!" & cell_x.Address
Il y a plein de chose là-dedans. Qu'est-ce que tu ne comprends pas ?
Voui. c'est cela
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.
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.
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
)Mais ça ne marche pas. Voici mon code . MERCI zeb
Option Explicit
Sub test()
'On supprime les lignes dont on n'a pas besoin
Dim i As Integer
Dim x As Worksheet
Set x = Worksheets("Général")
For i = 2 To Rows(x.Cells.Count, 1).End(xlUp).Row
If x.Cells(i, 1).Text = "1750" Then
If x.Cells(i, 2).Text <> "4241" Then
x.Cells(i, 1).EntireRow.Delete
End If
End If
i = i + 1
Next i
End Sub
Ohlala malheureuse, tu fais pleins d'erreurs plus grosses les unes que les autres.
Ligne 1 : erreur 1
Tu comptes les cellules, pas les lignes !!!!!
Il y a Count lignes (Rows) dans ta feuille x.
Ça s'écrit :
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 :
Ça donne :
Lignes 2 et 3 : erreur 2
Bon, spa vraiment une erreur mais bon. Tu as deux conditions, n'en fais qu'une !
Ligne 4 : pas d'erreur.
Mais on peut pinailler.
Lignes 5 & 6 : pas d'erreur.
Et même rien à redire
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ô !
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
Le problème est pourtant classissique
Et donc la solution est connue.
Bonne lecture : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
For i = 2 To Rows(x.Cells.Count, 1).End(xlUp).Row If x.Cells(i, 1).Text = "1750" Then If x.Cells(i, 2).Text <> "4241" Then x.Cells(i, 1).EntireRow.Delete End If End If i = i + 1 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 :
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 :
Ou, en condensé :
Dim ligne As Long Dim colonne As Long ligne = x.Rows.Count colonne = 1 .... x.Cells(ligne, colonne).End(xlUp)
.... x.Cells(x.Rows.Count, 1).End(xlUp)
Ça donne :
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 !
If x.Cells(i, 1).Text = "1750" And x.Cells(i, 2).Text <> "4241" Then
Ligne 4 : pas d'erreur.
Mais on peut pinailler.
' // Bien x.Cells(i, 1).EntireRow.Delete ' // Mieux x.Rows(i).Delete
Lignes 5 & 6 : pas d'erreur.
Et même rien à redire
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ô !
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
Le problème est pourtant classissique
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 :
Rows(x.cells.count,1).End(xlUp).Row
sinon que penses tu de cela? j'ai une erreur sur la ligne 8
Option Explicit
Sub test()
'On supprime les lignes dont on n'a pas besoin
Dim i As Integer
Dim x As Worksheet
Set x = Worksheets("Général")
For i = Rows(x.Cells.Count, 1).End(xlUp).Row To 2 Step -1
If x.Cells(i, 1).Text = "1750" And x.Cells(i, 2).Text <> "4241" Then
x.Rows(i).Delete
End If
Next
End Sub
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumCopier coller sur word
- ForumCopier coller une plage
- articlesCopier coller photoshop
- articlesCopier coller strategie
- ForumCopier coller ligne
- ForumCopier coller archwikifr
- ForumCopier coller disque c
- ForumCopier coller avec thunderbird
- ForumCopier coller special
- ForumCopier coller pour graver
- Voir plus
, je ne savais pas.
)