Résolu Copier et coller avec link:=true

fopy12

Habitué
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

Code:
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
 

zeb

Modérateur
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 ;) )
 

fopy12

Habitué
Que penses tu de ça ?

Code:
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
Code:
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
 

zeb

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

Code:
Dim x As Worksheet
Dim y As Worksheet
Set x = Worksheets("Feuil1" )
Set y = Worksheets("Feuil2" )
Bien ! :)
Code:
Dim i As Integer
Dim j As Integer
Code:
x.Range("A1:L1" ).Copy
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 :
Code:
x.Range("A1:L1" ).Copy Destination:=y.Range("A1:L1" )
Code:
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)
Ah ben tu le fais bien ici !!!!!!!!!!
(Sauf qu'il manque les colonnes)
Code:
        j = j + 1
    End If
Next
Code:
Application.CutCopyMode = False
Ce truc ne sert plus à rien du coup.

Pour déterminer la dernière ligne, inspire-toi de ce topic :

La solution est proche. :)

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

Code:
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 :
Code:
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 :
Code:
x.Range(x.Cells(i), x.Cells(i)).Copy y.Cells(j)
' // --> 
x.Rows(i).Copy y.Rows(j)

Fais des commentaires...
 

fopy12

Habitué
 

fopy12

Habitué
salut zeb, voici ce que j'ai refais :
Code:
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 :(
 

zeb

Modérateur
Meilleure réponse
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.
Code:
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
 

LudoTools

Expert
[mode aparté ON]
Notre ami Zeb Excel(le) en VBA... :)
[mode aparté OFF]
 

zeb

Modérateur
: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.
 

fopy12

Habitué
je remplace 10 000 par
Code:
x.cells(.rows.count, 1).end (xlUp)
:??:

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

zeb

Modérateur

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.

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


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

zeb

Modérateur
C'est donc que tu n'as plus de question. Que tout est limpide.
Tant mieux :)
 

fopy12

Habitué
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 ?
 

zeb

Modérateur
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.
 

fopy12

Habitué
Salut zeb,
J'ai ça dans la barre de formule : =Feuil1!$A$1
et J'ai compris. je viens d'apprendre un nouveau truc :D , je ne savais pas.
Merci.
 

zeb

Modérateur
...

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])
 

fopy12

Habitué
: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

Code:
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
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 086
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut