Macro sur cellule active [Résolu]

enstimac - 26 avril 2013 à 16:01 - Dernière réponse :  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
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 28 avril 2013 à 18:00
3
Merci
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.

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de ucfoutu
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 26 avril 2013 à 16:52
0
Merci
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
Commenter la réponse de cs_MPi
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 26 avril 2013 à 17:38
0
Merci
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.
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de enstimac
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 27 avril 2013 à 15:07
0
Merci
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
Commenter la réponse de cs_MPi
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 27 avril 2013 à 18:58
0
Merci
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.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 27 avril 2013 à 18:59
0
Merci
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.
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de enstimac
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 28 avril 2013 à 03:09
0
Merci
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
Commenter la réponse de cs_MPi
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 28 avril 2013 à 07:47
0
Merci
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.
Commenter la réponse de ucfoutu
0
Merci
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
Commenter la réponse de enstimac
Utilisateur anonyme - 28 avril 2013 à 17:01
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 28 avril 2013 à 18:09
0
Merci
Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
0
Merci
MERCI ucfoutu et Mpi pour vos retours.
Merci acive pour le lien et la leçon


==
C'est bien la prog
Commenter la réponse de enstimac

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.