OVH Cloud OVH Cloud

correspondance cellules vis à vis

14 réponses
Avatar
Izmi
Bonjour tout le monde ;

C'est une question que j'avais d=E9j=E0 pos=E9e et pour laquelle je
n'avais pas eu de r=E9ponse suffisante. Je vais essayer de la reposer.
Peut =EAtre aurai-je la chance de tomber sur quelqu'un qui connaisse la
r=E9ponse.

J'ai deux colonnes A et B. La colonne B comprend certains =E9l=E9ments de
A, mais pas tous. Elle comprend aussi d'autres donn=E9es.

Je souhaiterais trier les deux colonnes et mettre en vis =E0 vis les
cellules qui comprennent les m=EAmes donn=E9es. Lorsqu'une cellule de B
de contenu identique dans A elle restera vide, et inversement.

Merci d'avance.

4 réponses

1 2
Avatar
LSteph
Bonsoir Patrick ,
Dans la seconde version que je viens de donner j'ai pensé à la limitation en
nb de lignes tout en allègeant un rien. Pour le reste j'ai effectivement
négligé
;o) tu as lu dans ma pensée ou l'inverse
Précisément, il ne faut pas de doublons en b ou en C sinon AîeAîe
donc peut-être faire le ménage après tri comme pour ce qui passe
*provisoirement en A.
*(un plus costaud ferait peut-être cela dans un array , en plus propre)

On peut arranger encore, c'est plus que sûr!

Et en fait je me demande si selon l'objectif in fine de cette disposition,
il n'y aurait pas traitement plus direct)

a+

lSteph

"Patrick BASTARD" a écrit dans le
message de news: %23QtDc9d$
Bonjour, *LSteph*

Question subsidiaire, juste pour t'empecher de dormir :
;-)
Quid si plusieurs occurences dans la même colonne ?
exemple :
André André
André Benoit
Charles

--
Bien amicordialement,
P. Bastard


Merci pour cet éclaircissement,
un truc dans le genre si a:a est disponible pour se passer de
tableaux:
Sub aligntri()
Dim myn As Long, c As Range
Application.ScreenUpdating = False
ActiveSheet.Range("b2:B20").Sort key1:=[b2]
ActiveSheet.Range("c2:c20").Sort key1:=[c2]
myn = 2
For Each c In Range("b2:c20")
Cells(myn, 1) = c
myn = myn + 1
Next c
ActiveSheet.Range("a2:a41").Sort key1:=[a2]
For i = 40 To 2 Step -1
If Cells(i, 1) = Cells(i - 1, 1) Then _
Cells(i, 1).Delete xlUp
Next
[b2].Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell.Text <> _
ActiveCell.Offset(0, -1).Text Then
ActiveCell.Insert xlDown
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
[c2].Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell.Text <> _
ActiveCell.Offset(0, -2).Text Then
ActiveCell.Insert xlDown
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
[a:a].Clear
Application.ScreenUpdating = True
End Sub

'lSteph


"Patrick BASTARD" a écrit dans le
message de news: %23HEh%233a$
Bonjour, *LSteph*

Ce que j'ai compris du problème de *Izmi* que j'ai pris comme cas
d'école, pour le plaisir

Données d'origine


a b
b c
d d
f e
g g
h
Données souhaitées
a
b
c
d d
e
f
g g
h

La macro que j'ai transmis commence bien, en testant les 2 valeur de
la première ligne concernée, et en décalant l'une ou l'autre des
colonnes vers le bas, mais :
1° - Problème de boucle pour continuer sur la igne suivante
2° - Problème de sélection pour supprimer les éventuelles cellules
adjacentes vides. (en commentaire dans le code).

Si tu as une idée, je suis preneur, et *Izmi* aussi, je suppose...

ps : merci pour les conseils [HS]. Actuellement : Helicidine et
Efferalgan...


--
Bien amicordialement,
P. Bastard



Bonjour Patrick,
Izmi n'a pas encore réagi...
je ne sais ce que tu as pu comprendre de son souhait.
Il me semble que le but serait non un tri comme la commande le
prévoit mais d'aligner les valeurs ensemble mais je ne comprends
rien à ceci:
cellules qui comprennent les mêmes données. Lorsqu'une cellule de
B de contenu identique dans A elle restera vide, et inversement.
si elles ne s'alignent que qd elles ont les mêmes données il ne peut


y en avoir une seule de vide.
pire: (..et inversement

j'ai testé ta macro, elle trie B:B en ajoutant des lignes et met
""(rien) à côté de André
Stéphane à coté de Benoit
Sébastien à coté de Bernard...
??

..
du coup quoique un peu présent même si guère talentueux,
:(.... je comprends encore moins le but
pourtant ton code en lui même je le comprends...

'lSteph

....HS[Pour la toux tisane peu dosée en (pousses de ronce , pétales
de coquelicot, somités de thym) + Miel]

"Patrick BASTARD" a écrit dans
le message de news: eJzDmXZ$
Bonjour, *Izmi*

Un début de solution pour trier tes 2 colonnes, mais j'ai besoin
d'un coup de main des spécialistes (pb de boucle entre autres) pour
présenter une solution qui fonctionne.
Si les rares, mais néanmoins talentueux présents voulaient bien
jeter un coup d'oeil à :
http://cjoint.com/?mkpsSYtDxM
et corriger toutes mes fautes,

1° cela m'aiderait à progresser en VBA,
2° cela répondrait à la problématique de *Izmi*
3° l'analyse des critiques me permettrait d'employer utilement ce
samedi où je suis bloqué à la maison par une toux rebelle.
:-(

Bon WE à toutes et tous.

--
Bien amicordialement,
P. Bastard



Bonjour tout le monde ;

C'est une question que j'avais déjà posée et pour laquelle je
n'avais pas eu de réponse suffisante. Je vais essayer de la
reposer. Peut être aurai-je la chance de tomber sur quelqu'un qui
connaisse la réponse.

J'ai deux colonnes A et B. La colonne B comprend certains éléments
de A, mais pas tous. Elle comprend aussi d'autres données.

Je souhaiterais trier les deux colonnes et mettre en vis à vis les
cellules qui comprennent les mêmes données. Lorsqu'une cellule de
B de contenu identique dans A elle restera vide, et inversement.

Merci d'avance.














Avatar
LSteph
Re,
'donc en cas de doublons en b ou c

'***
Sub aligntri2()
Dim myn As Long, c As Range, myLast As Long
Application.ScreenUpdating = False
myLast = Application.WorksheetFunction.Max( _
[b65536].End(xlUp).Row, [c65536].End(xlUp).Row)
If myLast > 65536 / 2 Then
MsgBox "trop de lignes"
Exit Sub

End If
ActiveSheet.Range("b2:B" & myLast).Sort _
key1:=[b2]
ActiveSheet.Range("c2:c" & myLast).Sort _
key1:=[c2]
myn = 2
For Each c In Range("b2:c" & myLast)
Cells(myn, 1) = c
myn = myn + 1
Next c
ActiveSheet.Range("a2:a" & myLast * 2).Sort _
key1:=[a2]
For j = 1 To 3
For i = myLast * 2 To 2 Step -1
If Not IsEmpty(Cells(i, j)) And _
UCase(Cells(i, j)) = UCase(Cells(i - 1, j)) Then _
Cells(i, j).Delete xlUp
Next i
Next j
monalign ([b2])
monalign ([c2])
[a:a].Clear
Application.ScreenUpdating = True
End Sub
Private Sub monalign(myr As Range)
myr.Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell.Text <> _
Cells(ActiveCell.Row, 1).Text Then
ActiveCell.Insert xlDown
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub
'***

'lSteph

"Izmi" a écrit dans le message de news:

Bonjour tout le monde ;

C'est une question que j'avais déjà posée et pour laquelle je
n'avais pas eu de réponse suffisante. Je vais essayer de la reposer.
Peut être aurai-je la chance de tomber sur quelqu'un qui connaisse la
réponse.

J'ai deux colonnes A et B. La colonne B comprend certains éléments de
A, mais pas tous. Elle comprend aussi d'autres données.

Je souhaiterais trier les deux colonnes et mettre en vis à vis les
cellules qui comprennent les mêmes données. Lorsqu'une cellule de B
de contenu identique dans A elle restera vide, et inversement.

Merci d'avance.
Avatar
Patrick BASTARD
Bonjour, *LSteph*

[mode envieux on]
Pfff... Normal, il ne dort jamais...
[mode envieux off]

[mode sincère on]
Chapeau, Stéphane.

Comme il est simple d'insérer (manuellement) une cellule à l'endroit qui va
bien, mais difficile de formaliser le cheminement (ton code).
C'était la pensée du jour...


--
Bien amicordialement,
P. Bastard



Re,
'donc en cas de doublons en b ou c

'***
Sub aligntri2()
Dim myn As Long, c As Range, myLast As Long
Application.ScreenUpdating = False
myLast = Application.WorksheetFunction.Max( _
[b65536].End(xlUp).Row, [c65536].End(xlUp).Row)
If myLast > 65536 / 2 Then
MsgBox "trop de lignes"
Exit Sub

End If
ActiveSheet.Range("b2:B" & myLast).Sort _
key1:=[b2]
ActiveSheet.Range("c2:c" & myLast).Sort _
key1:=[c2]
myn = 2
For Each c In Range("b2:c" & myLast)
Cells(myn, 1) = c
myn = myn + 1
Next c
ActiveSheet.Range("a2:a" & myLast * 2).Sort _
key1:=[a2]
For j = 1 To 3
For i = myLast * 2 To 2 Step -1
If Not IsEmpty(Cells(i, j)) And _
UCase(Cells(i, j)) = UCase(Cells(i - 1, j)) Then _
Cells(i, j).Delete xlUp
Next i
Next j
monalign ([b2])
monalign ([c2])
[a:a].Clear
Application.ScreenUpdating = True
End Sub
Private Sub monalign(myr As Range)
myr.Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell.Text <> _
Cells(ActiveCell.Row, 1).Text Then
ActiveCell.Insert xlDown
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub
'***

'lSteph

"Izmi" a écrit dans le message de news:

Bonjour tout le monde ;

C'est une question que j'avais déjà posée et pour laquelle je
n'avais pas eu de réponse suffisante. Je vais essayer de la reposer.
Peut être aurai-je la chance de tomber sur quelqu'un qui connaisse la
réponse.

J'ai deux colonnes A et B. La colonne B comprend certains éléments de
A, mais pas tous. Elle comprend aussi d'autres données.

Je souhaiterais trier les deux colonnes et mettre en vis à vis les
cellules qui comprennent les mêmes données. Lorsqu'une cellule de B
de contenu identique dans A elle restera vide, et inversement.

Merci d'avance.


Avatar
LSteph
Bonjour Patrick,
A savoir si c'est ce qui convient à *Izmi*...
[mode amicordial:= On]
;-) merci de tes encouragements, je reste convaincu que l'on peut faire
mieux
et surtout plus simple, j'ai essayé de faire en paliant pas mal de lacunes
(càd comme j'aurais envie de faire mais n'en suis pas encore capable)
En une seule boucle ce seraient mes neurones qui commenceraient à friser .qd
à passer
par array avec tri (pas trop mon fort,) donc sauf d'avoir comme ici une
règle en A ou
bien sinon peut-être avec une collection , je ne vois pas comment alors
restituer ensuite
en jonglant sur B et C.

A bientôt

'lSteph

"Patrick BASTARD" a écrit dans le
message de news: eMQH5tj$
Bonjour, *LSteph*

[mode envieux on]
Pfff... Normal, il ne dort jamais...
[mode envieux off]

[mode sincère on]
Chapeau, Stéphane.

Comme il est simple d'insérer (manuellement) une cellule à l'endroit qui
va bien, mais difficile de formaliser le cheminement (ton code).
C'était la pensée du jour...


--
Bien amicordialement,
P. Bastard



Re,
'donc en cas de doublons en b ou c

'***
Sub aligntri2()
Dim myn As Long, c As Range, myLast As Long
Application.ScreenUpdating = False
myLast = Application.WorksheetFunction.Max( _
[b65536].End(xlUp).Row, [c65536].End(xlUp).Row)
If myLast > 65536 / 2 Then
MsgBox "trop de lignes"
Exit Sub

End If
ActiveSheet.Range("b2:B" & myLast).Sort _
key1:=[b2]
ActiveSheet.Range("c2:c" & myLast).Sort _
key1:=[c2]
myn = 2
For Each c In Range("b2:c" & myLast)
Cells(myn, 1) = c
myn = myn + 1
Next c
ActiveSheet.Range("a2:a" & myLast * 2).Sort _
key1:=[a2]
For j = 1 To 3
For i = myLast * 2 To 2 Step -1
If Not IsEmpty(Cells(i, j)) And _
UCase(Cells(i, j)) = UCase(Cells(i - 1, j)) Then _
Cells(i, j).Delete xlUp
Next i
Next j
monalign ([b2])
monalign ([c2])
[a:a].Clear
Application.ScreenUpdating = True
End Sub
Private Sub monalign(myr As Range)
myr.Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell.Text <> _
Cells(ActiveCell.Row, 1).Text Then
ActiveCell.Insert xlDown
ActiveCell.Offset(1, 0).Select
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub
'***

'lSteph

"Izmi" a écrit dans le message de news:

Bonjour tout le monde ;

C'est une question que j'avais déjà posée et pour laquelle je
n'avais pas eu de réponse suffisante. Je vais essayer de la reposer.
Peut être aurai-je la chance de tomber sur quelqu'un qui connaisse la
réponse.

J'ai deux colonnes A et B. La colonne B comprend certains éléments de
A, mais pas tous. Elle comprend aussi d'autres données.

Je souhaiterais trier les deux colonnes et mettre en vis à vis les
cellules qui comprennent les mêmes données. Lorsqu'une cellule de B
de contenu identique dans A elle restera vide, et inversement.

Merci d'avance.






1 2