[VBA]INTERVERTIR 2 CELLULES

Résolu
cs_domimeca Messages postés 13 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 2 novembre 2011 - 23 oct. 2011 à 23:52
cs_domimeca Messages postés 13 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 2 novembre 2011 - 24 oct. 2011 à 21:39
Bonjours
J'ai trouver sur le net un code qui me permet d'intervertir 2 cellules. Il marche trés bien mais il ne change que les valeurs.Je lui ai ajouté une msgox , un renvois sur une autre macro,deverouiller et reverouiller ma feuille mais mon petit niveau ne me permet pas de faire en sorte que la couleur des cellule change egalement.
Le code:
Sub echange()
ActiveSheet.Unprotect
Dim cval(), cadd()
a = 1
ReDim cval(2), cadd(2)
For Each usrcell In Selection
cval(a) = usrcell.Value
cadd(a) = usrcell.Address
a = a + 1
Next usrcell
Range(cadd(1)).Select
ActiveCell = cval(2)
If (cadd(2)) = False Then
MsgBox "Veuillez séléctionner un autre véhicule"
Else
Range(cadd(2)).Select
ActiveCell = cval(1)

Run ("tri")
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
End Sub

quelqu'un peut-il m'aider?
D'avance merci.
DOMIMECA

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 oct. 2011 à 01:13
Salut

"Il marche trés bien mais il ne change que les valeurs"
Mystère n°1
Ça marche, mais ça marche pas

"un renvois sur une autre macro,deverouiller et reverouiller"
Mystère n°2
Quel rapport avec la première phrase ?

"de faire en sorte que la couleur des cellule change egalement"
Mystère n°3
Maintenant, c'est la couleur.

Va falloir être plus précis.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 08:02
Bonjour,

Avant tout : tu développes donc sous VBA et non VB6 ! Nous te serions reconnaissant de veiller dorénavant à apporter le plus grand soin au choix de la section dans laquelle tu ouvres une discussion.

Nous te serions reconnaissant de bien vouloir également présenter ton code comme il se doit (indenté et mis entre balises code)
___________

Je suppose que tu veux dire (mais l'a dit très mal, comme le souligne jack) que ton code intervertit bien les valeurs, mais en perdant les mises en forme.
Tout-à-fait normal puisqu'il ne traite que le contenu des cellules (au demeurant fort mal ... je me demande où tu as trouvé un tel "code/gymcana"... celui qui l'a écrit n'a pas l'air d'avoir compris comment on passe d'une plage à un tableau dynamique et vice-versa !)
Si tu veux intervertir tout (donc valeur + mise en forme), il te faut alors utiliser la méthode Copy (ouvre ton aide VBA sur ce mot). Tu devras probablement, à ce propos, utiliser une cellule tremplin.
Voilà ! commence à travailler avec cette piste. Reviens si toujours difficulté, mais en nous montrant (code) ce que tu as tenté d'écrire dans ce sens-là.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 08:21
Et de surcroît ('à propos du code que tu as "trouvé") :
Comment peut-on écrire :
cadd(a) = usrcell.Address

puis
If (cadd(2)) = False Then 



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
24 oct. 2011 à 10:46
Salut,

un exempm=le ici

Range("B4").Cut Destination:=Range("E4")
Range("C4").Cut Destination:=Range("B4")
Range("E4").Cut Destination:=Range("C4")


A+
3

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

Posez votre question
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
24 oct. 2011 à 12:42
re,

bon ouai... cela mérite une petite explication:

seul les méthodes copy/paste ou cut/paste permettent de déplacer un objet de type Range.

l'exemple que je t'ai donné utilise un cellule intermédiaire (E4 dans l'exemple) pour réussir cette interversion.

voici une autre méthode par l'ajout d'une cellule "intermédiaire":

    Range("B4").Insert Shift:=xlToRight
    Range("D4").Cut Destination:=Range("B4")
    Range("D4").Delete Shift:=xlToLeft


A+
3
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
24 oct. 2011 à 16:12
bigfish_le vrai, Joli !!!
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 17:52
Oui ?
Et nous t'avons donc répondu !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 oct. 2011 à 18:44
C'est quand même enfantin !

Exemple
Private tremplin As Range
Private Sub CommandButton1_Click()
  ' c'est là que tu décides d'où tu veux ton tremplin.
  ' Tu peux même le choisir sur une autre feuille
  Set tremplin = Range("F8") 
  intervertir ' et c'est là que tu dis d'intervertir (appel de la sub)
End Sub

Private Sub intervertir()
  If selection Is Nothing Or selection.Count = 1 Or selection.Count > 2 Then
    MsgBox "vous devrez sélectionner 2 cellules et uniquemenjt 2"
  Else
    Dim cel1 As Range, cel2 As Range
    Set cel1 = selection.Areas(1)
    Set cel2 = selection.Areas(2)
    cel1.Copy Destination:=tremplin
    cel2.Copy Destination:=cel1
    tremplin.Copy Destination:=cel2
  End If
  
End Sub

Voilà ! y compris les garde-fous (vérification de ce que deux cellules et deux seules ont été sélectionnées).

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
cs_domimeca Messages postés 13 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 2 novembre 2011
24 oct. 2011 à 17:08
Ok Ok merci a tous je me suis mal exprimé.
Le but:
J'ai 5 colonnes de couleurs differentes A(rouge) B(bleu) C(vert) D(jaune),je selectionne A3 avec ma souris puis C5 en maintenant Ctrl.Donc les deux cellules sont relativement actives. Lorsque j'execute ma macro la valeur de A3 se trouve en C5 et celle de C5 en A3. Par contre C5 avec sa nouvelle valeur est toujours vert or je voudrais qu'elle soit rouge (couleur d'origine associée a cette dite valeur)même probleme pour A3.Je veux pouvoir faire cela avec n'importe quelle paire de cellules que je selectionne.

Le code original sans mes bricolages
Sub echange() 
Dim cval(), cadd() 
a = 1 
ReDim cval(2), cadd(2) 
For Each usrcell In Selection 
cval(a) = usrcell.Value 
cadd(a) = usrcell.Address 
a = a + 1 
Next usrcell 
Range(cadd(1)).Select 
ActiveCell = cval(2) 
Range(cadd(2)).Select 
ActiveCell = cval(1) 
End Sub


J'espere être plus clair


DOMIMECA
0
cs_domimeca Messages postés 13 Date d'inscription lundi 15 juin 2009 Statut Membre Dernière intervention 2 novembre 2011
24 oct. 2011 à 21:39
Nickel. Merci Ucfoutu pour ta patience.Il y a quelques années je bricolais VBA mais c'est pas comme le vélo, ça s'oublie. Ceci dit je ne suis vraiment pas sûr d'y être arrivé seul. Donc encore merci et il va falloir que je m'y remette pour ne pas trop abuser de votre patience.


DOMIMECA
0
Rejoignez-nous