Excel : Copier des cellules liées

Résolu/Fermé
EmilieM - 1 avril 2010 à 15:39
 EmilieM - 6 avril 2010 à 13:46
Bonjour,

Je bloque actuellement sur Excel et j'aimerai un petit coup de pouce si c'est possible.

Je souhaiterai une macro qui tout d'abord supprime les valeurs 0 dans une colonne, puis qui décalle les cellules vers le haut du nombre de 0 supprimé. Mais que lors de ce décallage les données situé dans la colonne de droite soit copier aussi.

Voici un exemple pour mieux comprendre, je pense :
Données Résultats
2 MM 2 MM
0 4 MM
4 MM 8
0 MM 6
0
0
8
6

Emilie

A voir également:

13 réponses

Données Résultats
2 MM 2 MM
0 4 MM
4 MM 8
0 MM 6
0
0
8
6
0
Désolé pour l'exemple je n'arrive pas à le mettre en forme....
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 2/04/2010 à 07:55
Bonjour,

Malgré ton exemple je pense avoir compris :
Sub supp() 
    Dim lig As Long 
    For lig = [A65536].End(xlUp).Row To 2 Step -1 
        If Cells(lig, 1) = 0 Then Cells(lig, 1).Resize(1, 2).Delete Shift:=xlUp 
    Next lig 
End Sub

La prochaine fois tu peux déposer un fichier sur cijoint.fr et coller ici le lien fourni

eric

edit : et merci d'éviter les doublons : voir ici
0
Merci,
C'est exactement ce que je souhaitai faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Oups, j'ai parlé un peu trop vite comme toujours...
En fait cette macro fonctionne trés bien sur une dizaine de données mais je travaille actuellement avec plus de 20 000 valeurs dans la colonne A sachant que dans celle ci il doit y avoir au mloins 10 000 zéro.
Et lorsque je lance la macro sur mes 20 000 valeurs le processus est trop long et mon ordi plante.
Donc te serait il possible d'avoir la méme chose mais applicable à un nombre plus important de valeurs?

Emilie
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
2 avril 2010 à 16:46
Il ne plante pas, mais c'est long et il faut attendre...
Cette version sera plus rapide mais pareil, laisse la finir...
Sub supp()
Dim lig As Long
application.screenupdating = false
For lig = [A65536].End(xlUp).Row To 2 Step -1
If Cells(lig, 1) = 0 Then Cells(lig, 1).Resize(1, 2).Delete Shift:=xlUp
Next lig
application.screenupdating = true
End Sub

eric
0
Ok, je vais la tester sur mes valeurs.
Merci.
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
2 avril 2010 à 18:32
et mike t'a répondu sur ton autre post, ça serait bien que tu lui répondes...
Si tout est ok mets les 2 discussions en résolu stp
Merci
0
Oui, cette version fonctionne également mais elle est trop longue à tourner.
En effet, elle met bien 1h avant d'afficher les résultats.
Est ce que l'un d'entre vous n'aurez pas une idée pour accélérer d'avantage le processus?

Emilie
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 6/04/2010 à 09:59
Bonjour Emilie, Eric, Mike

en me basant sur ce que j'ai pigé
la colonne B est remplie avec les données de la colonne A sans les zéros (version Mike?)?

Si oui sur 20000 lignes en moins d'une seconde
Sub lister_sans_0() 
Dim derlig As Long 
Dim tablo 

derlig = Range("A65536").End(xlUp).Row 
ReDim tablo(0) 

For Cptr = 1 To derlig 
If Cells(Cptr, 1) <> 0 Then 
    tablo(cptr_T) = Cells(Cptr, 1) 
    cptr_T = cptr_T + 1 
    ReDim Preserve tablo(cptr_T) 
End If 
Next 

Columns(2).ClearContents 
Range("B1").Resize(cptr_T + 1, 1) = Application.Transpose(tablo) 
     
End Sub


tite démo
https://www.cjoint.com/?egj4m5sSHS

en esperant ne pas ^tre à coté de la plaque mais je doute...

eddit: on pourrait encore aller + vite avec un screenupdating oublié...


:-x
0
Non ce n'est pas exactement ce que tu subjére. En fait j'ai 2 colonnes A et B avec dans la colonne A des 0 et d'autres valeurs. Je souhaiterai que la macro supprime les 0 en décallant les cellules vers le haut du nombre de 0 supprimer tout en gardant le contenu de la cellule situé en colonne B qui li est associé.
Par exemple en A2 j'ai 2, en A3 - 0 et en A4 - 6 avec en B3 - MM et en B4 - MM. Je voudrai obtenir en A2 - 2 et B2 - ; A3 - 6 et B3 - MM.
J'espére que mes explications seront suffisantes.
Emilie
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 6/04/2010 à 11:30
..."J'espére que mes explications seront suffisantes"....

bin non! les 2 demandes sont différentes: j'ai suivi ,ou cru suivre, l'autre post

comme te l'a déjà demandé Eric met une maquette (quelques lignes) en pièce jointe avec d'un coté le tableau initial et d'un autre coté le tableau que tu désires en nous précisant les emplacements de départ et d'arrivée dans ton projet réel

Pour mettre une pièce jointe:
https://www.cjoint.com/
et tu colles le lien proposé dans ton message
0
https://www.cjoint.com/?eglKaTCuu5

Voici le lien contenant l'exemple, avec en colonne A et B les données sources et en colonne C et D ce que je souhaiterai obtenir.

En espérant que cela soit compréhensible!

Emilie.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
6 avril 2010 à 12:15
en espèrant que... temps <= 2 secondes

Sub lister_sans_0()
Dim derlig As Integer, cptr As Integer, cptr_t As Integer
Dim tablo

'initialisations
derlig = Range("A65536").End(xlUp).Row
ReDim tablo(1, 0)

'colecte des données
For cptr = 2 To derlig
If Cells(cptr, 1) <> 0 Then
    tablo(0, cptr_t) = Cells(cptr, 1)
    tablo(1, cptr_t) = Cells(cptr, 2)
    cptr_t = cptr_t + 1
    ReDim Preserve tablo(1, cptr_t)
End If
Next

'restitution
Application.ScreenUpdating = False
Range("C2:D30000").ClearContents
Range("C2").Resize(cptr_t + 1, 2) = Application.Transpose(tablo)
 Application.ScreenUpdating = True

End Sub


et la demo chronm^tre:
https://www.cjoint.com/?egmodTCzxR

Tu dis...
0
Génial sa marche.

Un grand grand merci à toi cela fonctionne trés bien et en méme pas 2 secondes d'ailleurs.....
Bonne continuation à tous ceux qui m'ont apportés leurs aides.

Emilie.
0