Macro sur cellule active

Résolu
enstimac - 26 avril 2013 à 16:01
 enstimac - 28 avril 2013 à 18:14
Bonjour,

Je suis débutant en VBA et je souhaite faire une macro qui detecte sur la cellule active si la valeur entrée (alphanumérique) existe déja dans les cellules de dessus, et sortir par la suite un MsgBox si tel est le cas.

d'avance MERCI !!



C'est bien la prog

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 avril 2013 à 18:00
Bonjour, acive,
on en trouve également, accompagnés de morues, dans certains hôtels (où dodo les met en saumure) dans le nord de la France, entre autres.
D'autres sont en cavale

A enstimac :
si ton problème est maintenant réglé ===>> un clic sur le tag réponse "acceptée" pour libérer ce sujet.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
26 avril 2013 à 16:52
Bonjour,

Bienvenue sur le site.
Prends le temps de regarder les règlements...

Qu'est-ce que tu as essayé jusqu'ici ?
As-tu un bout de code ?


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 avril 2013 à 17:38
Bonjour,
1) Pas de contrôle de saisie dans une cellule pendant la saisie elle-même.
L'évènement Change ne sera déclenché que lorsque tu quittera la cellule. Cet évènement utilise le paramètre Target, qui représente précisément la cellule que tu viens de saisir.
2) l'utilisation de WorkSheetFunction.COUNTIF (à lire dans ton aide VBA) appliquée à la plage des cellules "au-dessus" te permettra de savoir (si > 0) si cette valeur a déjà été saisie plus haut.
Tu as maintenant les éléments de base pour travailler.
Reviens avec ton code d'essai si encore en difficulté.





________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonjour,

Voici ce que j'ai pu construire, mais... problème dès la première ligne :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Adress = ActiveCell Then

If WorksheetFunction.CountIf(Range(ActiveCell, ActiveCell.Offset(-1, 0)).Select, ActiveCell.Value) Then

MsgBox "Cette valeur est déjà saisie"

Else

End If

End If

End Sub


MERCI de votre aide !!


C'est bien la prog
0

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

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
27 avril 2013 à 15:07
If Target.Adress = ActiveCell Then

Target.Address est Activecell.Address
Activecell, seul, est un objet Range, pas une adresse

Tu pourrais utiliser une variable Ligne, disons qui te renvoit la ligne de ta cellule active
Ligne = Target.Row

À partir de là, tu peux utiliser ta Function de la ligne 1 (si c'est le cas) jusqu'à Ligne - 1
Range(Cells(1, Target.Column), Cells(Ligne, Target.Column))

En passant, évite les Select quand c'est possible...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 avril 2013 à 18:58
Ce n'est quand même pas compliqué !
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 And Target.Row > 1 Then
   If WorksheetFunction.CountIf(Range("A1:" & "A" & Target.Row - 1), Target.Value) > 0 Then
     MsgBox "valeur déja saisie"
     Target.Value = ""
   End If
 End If
End Sub

analyse donc chaque ligne de ce code ultra simple.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
27 avril 2013 à 18:59
Ah oui : dans mon exemple : sur la colonne A, hein ... (c'est évident, mais on ne sait jamais).
Adapte à TA colonne


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
MERCI beaucoup pour vos réponses!! J'ai mis en commentaires ma vision du code.
Toutefois, meme avec "> 0" ou "<> 0" sur le 2eme If, la valeur "0" bloque le syst, je cherche une solution pour empêcher l'utilisateur de la saisir.

Private Sub Worksheet_Change(ByVal Target As Range)

' 1ère boucle If pour definir les cellules d'une colonne donnée concernées par le changement (la saisie)
 If Target.Column = 4 And Target.Row > 1 Then
 
 '2ème boucle If imbriquée, son 1er agr defini la plage de cellules concernées par la comparaison, son 2eme arg defini le critère de comparaison
   If WorksheetFunction.CountIf(Range("D4:" & "D" & Target.Row - 1), Target.Value) <> 0 Then
   
     'actions du If: afficher popup + effacer le contenu de la cellule target
     MsgBox "valeur déja saisie"
     Target.Value = ""
     
   End If
 End If
End Sub


==
C'est bien la prog
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
28 avril 2013 à 03:09
Il faut que tu inclus la ligne courante...
Désolé, mais ça m'avait échappé ainsi qu'à ucfoutu, je pense...
Il ne faut donc pas mettre le "-1" si on veut vérifier ce que l'on entre comme valeur...

Private Sub Worksheet_Change(ByVal Target As Range)
' 1ère boucle If pour definir les cellules d'une colonne donnée concernées par le changement (la saisie)
 If Target.Column = 4 And Target.Row > 1 Then
 
 '2ème boucle If imbriquée, son 1er agr defini la plage de cellules concernées par la comparaison, son 2eme arg defini le critère de comparaison
   If WorksheetFunction.CountIf(Range("D4:" & "D" & Target.Row), Target.Value) > 0 Then
   
     'actions du If: afficher popup + effacer le contenu de la cellule target
     MsgBox "valeur déja saisie"
     Target.Value = ""
     
   End If
 End If
End Sub


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 avril 2013 à 07:47
Oh la !
Qu'est-ce que vous me "racontez-là", tous les deux ?
Je ne change pas un iota à mon code et ne vois pas pourquoi inclure la ligne courante !
Tu as mal compris le code que je t'ai montré, enstimac ! C'est tout !
Analyse donc :
1) tu as spécifié :
je souhaite faire une macro qui detecte sur la cellule active si la valeur entrée (alphanumérique) existe déja dans les cellules de dessus

2) toi, tu commences (ton code) à la cellule D4, donc à la 4ème ligne de la colonne D, hein !
et donc ce code ne doit être appliqué qu'à partir de la 5ème ligne
et donc ta ligne :
If Target.Column = 4 And Target.Row > 1 Then

n'a pas de sens !
Je corrige ton code et tes commentaires
: ===>>
Private Sub Worksheet_Change(ByVal Target As Range)
 ' première expression conditionnelle (pas "boucle" !)
 If Target.Column = 4 And Target.Row > 4 Then ' si l'on est en colonne D et au dessous de la ligne 4
 '2ème expression conditionnelle (pas "boucle") : si ce qu'on vient de saisir est au-dessus dans la même colonne
   If WorksheetFunction.CountIf(Range("D4:" & "D" & Target.Row - 1), Target.Value) > 0 Then
     'on envoie un message et on efface ce que l'on vuent de saisir
     MsgBox "valeur déja saisie"
     Target.Value =  ""
   End If
 End If
End Sub

Il n'y a là-dedans aucune "boucle" ! Une expression conditionnelle, imbriquée ou non, n'est pas une "boucle". Elle n'est pas itérative !
Ce code interviendra tout simplement à chaque fois que l'utilisateur saisira, dans la colonne D, une cellule de rang supérieur ou égal à 5.
Est-ce si dur à comprendre ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Hello!!

Est-ce si dur à comprendre ?


Oooh que OUI pour un débutant
En passant, que conseillez vous (Sites-web, ouvrages, ...) à quelqu'un comme moi pour acquérir les bases en VBA?



==
C'est bien la prog
0
Utilisateur anonyme
28 avril 2013 à 17:01
Bonjour,
Oui si tu fais une recherche google tu trouves des sites comme CELUI-CI (par exemple)

Leçon n°1:
Le macro est un nom vernaculaire utilisé pour désigner de nombreuses espèces de poissons de mer à la morphologie différente. Principalement en France, il désigne le maquereau commun, mais aussi génériquement l'ensemble des espèces du genre Scomber. Ce sont des poissons effilés aux rayures caractéristiques sur le corps avec de micro-écailles. On retrouve cette caractéristique chez quelques thazards du genre Scomberomorus...
Non je plaisante !!!



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
28 avril 2013 à 18:09
Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
MERCI ucfoutu et Mpi pour vos retours.
Merci acive pour le lien et la leçon


==
C'est bien la prog
0
Rejoignez-nous