Trouver la dernière cellule modifiée !

P

Poulpe

Guest
Bonjour à tous, j'aurais aimé savoir quel est le code VB pour déterminer avec exactitude la dernière cellule que l'utilisateur à modifier sachant que rechercher la cellule active ne fonctionne pas puisque l'utilisateur peut modifier une cellule puis cliquer n'importe où ailleurs !! Donc si qq1 à la solution, je le remercie par avance !
 
S

sylsyl

Guest
Salut Poulpe,

Je ne pense pas qu'il existe de methode toute faite pour retrouver la derniere cellule modifiee. Voici donc une solution alternative toute chaude qui fonctionne tres bien.

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
On Error Resume Next
If Target.Count = 1 Then
If Range(Range("A1")) <> Range("B1") Then Range("A2") = Range("A1")
Range("B1") = Target.Value
Range("A1") = Target.Address
End If
End Sub

'en gros, lorsque tu change de cellule la macro regarde si l'ancienne cellule a change de valeur.
'Si c'est le cas son adresse apparait en A2

'Target.count = 1 evite la selection de plusieurs cellules (ca fout la merde au sinon)

'Le On Error est necessaire pour la toute premiere selection

Tiens moi au courant,

A++, Sylsyl.
 
P

Poulpe

Guest
Bonjour à tous et merci pour votre aide

sylsyl : ta méthode fonctionnerait mais cela signifirait que je dois avoir un double de l'ancienne valeur de TOUTES mes cellules et qu'en même temps je dois vérifier TOUTES les cellules jusqu'à trouver la bonne ! C un peu utiliser un marteau pour écraser la mouche.

andré : Ta méthode fonctionnne et Excel me montre les dernières modification sous forme de commentaire. Mais ce con d'Excel me bloque mon code VB ! Impossible de modifier mon code ! Car moi j'ai besoin d'obtenir la dernière cellule modifié pour obtenir une valeur qui servira de point de départ pour toute une série de calcul effectuée par VBA !

Merci quand même à vous deux !
 
S

sylsyl

Guest
En fait non, ca marche pas comme ca !

je ne sais pas vraiment ce que tu veux faire mais ce que je t'ai donne te donne l'adresse (en A2) de la derniere cellule modifiee (et seulement la derniere). Tu peux faire autant de selection que tu veux, l'adresse en A2 ne changera pas tant que la valeur d'aucune autre cellule n'a ete modifiee.

Pour faire court: l'adresse en A2 est actualisee a chaque modification de cellule (je pensais que c'etait ce que tu voulais)

Effectivement tu n'as plus l'ancienne valeur de la cellule modifiee, mais c'est pas tres complique de la mettre en B2 par exemple:
au 2eme if:
Range("A2") = Range("A1")
Range("B2") = Range("B1")
end if

Tu peux faire un essai dans un nouveau classeur, c'est beaucoup plus parlant.

Andre: j'aime beaucoup les methodes marteau, c'est beaucoup plus amusant que d'utiliser les fonctions toutes faites...
La vrai explication est que je travaillais un peu sous VB6 avant VBA, j'ai donc un reflexe oriente "code".

A++, sylsyl.
 
A

andré

Guest
salut Pouylpe,

Il ne te reste que la macro évenementielle qui copie dans une cellule bien précise la valeur de n'importe quelle cellule à chaque fois qu'elle est validée par Enter.

Evidement si tu sélectionnes une cellule et que tu valides son contenu sans modification, ce sera cette valeur qui sera enregistrée, à moins que quelqu'un trouve l'astuce pour faire la comparaison.

C'est du boulot pour les gros bras du VBA !
Ah, pauvre de moi !

Ândré.
 
P

Poulpe

Guest
Méa Culpa sylsyl ! Tu avais raison ! Ta méthode fonctionne Très très bien !!!
En réalité j'avais seulement lu et pas essayé !!! Donc Un très grand merci pour ton aide !!!!!!

A+ et bonne journée !
 
S

sylsyl

Guest
QQ’un pourrait-il m’expliquer qu’est ce qui cloche dans mon exemple (ou pourquoi vous ne voulais pas l’utiliser, sniff).

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
On Error Resume Next
If Target.Count = 1 Then
If Range(Range("A1")) <> Range("B1") Then Range("A2") = Range("A1")
Range("B1") = Target.Value
Range("A1") = Target.Address
End If
End Sub

/!\ il faut bien faire la difference entre "adresse" et "valeur" (ou "contenu")

A la premiere execution de la macro, l’adresse de la cellule selectionne apparait en A1 et son contenu en B1 (le On Error gere le Range(“ ”) qui apparaitra alors)

Lorsqu’on deselectionne (c-a-d on selectionne une autre cellule), la macro lit la valeur de la cellule dont l’adresse est en A1 (Range(Range("A1"))),
compare son contenu avec la cellule B1 (<> Range("B1")) et si c’est different alors l’adresse apparait en A2.

Enfin, la macro actualise les cellules A1 et B1 pour la prochaine “deselection” (Range("B1") = Target.Value, Range("A1") = Target.Address), et ainsi de suite…

Moi, je ne vois aucun pb (d’ailleurs ca marche).

A++, Sylsyl.
 
P

Poulpe

Guest
Quand les réponses sont subtiles, on ne s'aperçoit pas forcément du 1er coup que cela fonctionne !!!

Encore merci à toi sylsyl ! Je suis entrain de modifier mon application et grace à toi elle sera maintenant parfaite ! :O)

Bonne continuation et A+++
 
S

sylsyl

Guest
Houuu le mauvais perdant !! lol
Il a fallu que tu cherches une meilleure methode parce que j’ai ete plus vite que toi ?
Ce post est a prendre au Degree(Andre_humeur) & "ieme degree".

Private function Degree(humeur As String) As String
Select case humeur
Case "joyeux"
Degree = “3”
Case "mecontent"
Degree = “100 000 000”
Case "pas content du tout"
Degree = "oublie ce post, c’etait une blague"
End Case
End Function

(Y en a qui s’ennuient…lol)
A++, Sylsyl.

P.S.:c'est vrai que c'est plus facile.
 

Discussions similaires

Statistiques des forums

Discussions
312 326
Messages
2 087 312
Membres
103 513
dernier inscrit
adel.01.01.80.19