Obliger l'utilisateur à remplir une cellule si

Bonjour à tous!

J'ai tenté diverses recherche, sans succès...

Il existe fort probablement une solution très simple à mon problème, mais mon niveau de connaissance fait en sorte que je ne trouve pas!

Je veux, par exemple, OBLIGER l'utilisateur à compléter la cellule "B2" si il saisie une donnée dans la cellule "A2"...

Simple, non?

En complément, j'aimerais aussi que la cellule "B2" ne puisse être remplie que si "A2" contient une donnée pré-déterminée, soit la lettre "P" dans mon cas.

Je vous remercie à l'avance de vous pencher sur mon cas et, éventuellement, pour une réponse satisfaisante!

Alexandre

Bonjour alex

un début de réponse

si cela peut t'aider

947classeur2.zip (6.28 Ko)

Merci Bob!

Bon, c'est ma toute première expérience avec VB...

Pour faire fonctionner le code que tu as créé, pas de problème.

Par contre, il y a un petit problème. Si j'inscrit "P" en A2 (je complète ensuite B2, évidemment), que je change la donnée en A2 pour n'importe quoi d'autre que "P" (supposons que j'ai initialement inscrit "P" par erreur), je ne peux supprimer l'information en B2 sans que la boîte de dialogue avec la mention "Compléter la raison" n'apparaisse.

Il y a aussi des données à inscrire en C2 à la suite de B2, mais je ne sais aucunement comment créer le code VB...

J'aurais essayé avec quelque chose qui ressemble à ceci, mais ne sachant pas quel est le code pour indiquer qu'une cellule n'est pas vide....

(Probablement que l'insertion que j'ai faite (en italique) est erronée en elle-même, je le répète, je n'y connais absolument rien en VB...)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("A2") = "P" And Range("B2") = "" Then

Range("B2").Select

Exit Sub

End If

If Range("A2") = "P" And Range("B2") = "(Cellule non-vide)" Then

End If

If ActiveCell.Address <> Range("A2") And Range("B2") = "" Then

MsgBox ("Compléter la raison")

Range("A2").Select

End If

End Sub

Merci de m'aider!

Avant ce matin, je n'avais jamais ouvert VB!

une question: est-ce que tout cela fonctionnera avec un fichier partagé?

11consigne.pdf (51.46 Ko)

BONJOUR ALEX

VOICI LA CORRECTION

J'espère que cela te conviendra

mais je pense qu'il va manquer d'autres instructions

bon courage

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("A2") = "P" And Range("B2") = "" Then

Range("B2").Select

Exit Sub

End If

'different de vide est <>""

If Range("A2") = "P" And Range("B2") <> "" Then

Range("C2").Select

Exit Sub

End If

If ActiveCell.Address <> Range("A2") And Range("B2") = "" Then

un ' devant la ligne met en commentaire

'MsgBox ("Compléter la raison")

Range("A2").Select

End If

End Sub

Dédidément BOB71AU, vous m'êtes d'une aide inespérée! Merci!

J'ai réglé mon problème qui était occasionné par le retrait de "P" dans la cellule A2 en insérant une commande qui mène à Exit Sub. En fait, je suis allé consulter l'une de vos réponse à une autre question, j'ai regardé le script et y ai trouvé une insertion qui répond à mon besoin. Ce n'est peut-être pas la meilleure méthode, mais ça fonctionne!

J'en suis rendu au script suivant (pour mon application, A2 est remplacée par C2; B2 par AC2 et j'ai ajouté AD2 à compléter à la suite de AC2):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Range("C2") <> "P" Then Exit Sub

If Range("C2") = "P" And Range("AC2") <> "" And Range("AD2") <> "" Then Exit Sub

If Range("C2") = "P" And Range("AC2") = "" Then

Range("AC2").Select

Exit Sub

End If

If Range("C2") = "P" And Range("AC2") <> "" Then

Range("AD2").Select

Exit Sub

End If

If ActiveCell.Address <> Range("C2") And Range("AC2") = "" Then

MsgBox ("Compléter Pour qui")

Range("AC2").Select

End If

Exit Sub

If ActiveCell.Address <> Range("AC2") And Range("AD2") = "" Then

MsgBox ("Compléter Pour Quoi")

Range("AD2").Select

End If

Exit Sub

End Sub

J'en arrive à deux questions:

La première, est de savoir comment empêcher l'utilisateur de compléter AC2 et AD2 si C2 ne contient pas "P".

Si vous connaissez une site où je pourrais faire des recherche dans le language VBA, j'arriverais probablement à créer la formule par moi-même...enfin, j'espère!

Quelque chose du genre: If Range("C2") <> "P" then 'rendre impossible la saisie de donnée dans AC2...

Ma deuxième question est: quels modifications devrais-je apporter au script pour avoir les mêmes conditions à toutes les lignes de la feuille?

Encore une fois merci pour votre aide!

Alex

Bonjour Alex

si ta demande de saisie doit s'appliquer a toutes les lignes, je ne suis pas sur que la solution proposée

soit la bonne

peux tu poster un semblant de fichier que l'on puisse analyser le problème exact

bien amicalement

Bien sur, voici

Désolé de vous avoir fait plancher sur la mauvaise solution!

BONJOUR ALEX

je suis désolé mais je n'ai pas office 2007

Effectivement, j'aurais dû y penser par rapport au premier fichier que tu m'as soumis!

Alors voici, enregistré sous la version 97-2003.

BONSOIR ALEX

Petite question

ce tableau est rempli par tes soins ou doit être rempli par des utilisateurs?

amicalement

screen

Par plusieurs utilisateur et ce, simultanément (fichier partagé).

BONSOIR ALEX

Je n'arrive pas à gérer tous les cas que tu demande

je ne suis pas spécialiste des cellules

moi j'aurai géré se problème par une interface utilisateur qui oblige a saisir si etat=P

si un expert à la réponse je suis preneur

sinon envoi moi un message perso si tu veux une interface car je n'arrive pas à joindre le fichier que je t'ai préparé

mille regrets et à bientôt de te lire

Je vous ai fait parvenir mon courriel par message privé.

Bob71au n'a pas trouvé qu'une solution, mais bien 3.

Les voici donc!

Celle-ci est parfaite, tout simplement. Personellement, je dois l'éviter, car elle ralentie trop mon fichier!

'Sub Worksheet_SelectionChange(ByVal Target As Range)

'With Sheets("Base de donnée").Range("C:C")

' Set c = .Find("P", LookIn:=xlValues)

' If Not c Is Nothing Then

' firstAddress = c.Address

' Do

'

' If c.Offset(0, 32) <> "" And c.Offset(0, 33) <> "" Then

' Set c = .FindNext(c)

' End If

' If c.Offset(0, 32) = "" Then

' c.Offset(0, 32).Select

' ESS = MsgBox("Qui a obtenu la job (Sélectionner dans la liste)", , "Saisie obligatoire")

' If ESS = vbOK Then End

' Exit Sub

' End If

' If c.Offset(0, 33) = "" Then

' c.Offset(0, 33).Select

' ESS = MsgBox("Pour quelle(s) raison(s) avons-nous perdu la job?", , "Saisie obligatoire")

' If ESS = vbOK Then End

' Exit Sub

' End If

' Set c = .FindNext(c)

' Loop While Not c Is Nothing And c.Address <> firstAddress

' End If

'End With

'

'End Sub

Celle-la fonctionne mais seulement lorsqu'on sélectionne la rangée dans laquelle on insère le fameux "P". C'est celle pour laquelle j'ai optée en fin de compte.

Sub Worksheet_SelectionChange(ByVal Target As Range)

If Cells(Target.Row, 3) <> "P" Then Exit Sub

If Cells(Target.Row, 3) = "P" And Cells(Target.Row, 32) <> "" And Cells(Target.Row, 33) <> "" Then Exit Sub

If Cells(Target.Row, 3) = "P" And Cells(Target.Row, 32) = "" Then

Cells(Target.Row, 32).Select

MsgBox ("Sélectionner le compétiteur qui a obtenu le contrat")

Exit Sub

End If

If Cells(Target.Row, 3) = "P" And Cells(Target.Row, 32) <> "" Then

Cells(Target.Row, 33).Select

MsgBox ("Inscrire la (les) raison(s) de la perte du contrat")

Exit Sub

End If

If ActiveCell.Address <> Cells(Target.Row, 3) And Cells(Target.Row, 32) = "" Then

Cells(Target.Row, 33).Select

MsgBox ("Sélectionner le compétiteur qui a obtenu le contrat")

End If

End Sub

Finalement, celle-ci est ce que j'ai initialement demandé, la première qui a été créée par Bob71au.

'If Range("C2") <> "P" Then Exit Sub

'If Range("C2") = "P" And Range("AC2") <> "" And Range("AD2") <> "" Then Exit Sub

'If Range("C2") = "P" And Range("AC2") = "" Then

'Range("AC2").Select

'Exit Sub

'End If

' = <> "" = différent de vide

'If Range("C2") = "P" And Range("AC2") <> "" Then

'Range("AD2").Select

'Exit Sub

'End If

'If ActiveCell.Address <> Range("C2") And Range("AC2") = "" Then

'MsgBox ("Compléter Pour qui")

'Range("AC2").Select

'Exit Sub

'End If

'If ActiveCell.Address <> Range("AC2") And Range("AD2") = "" Then

'MsgBox ("Compléter Pour Quoi")

'Range("AD2").Select

'End If

'Exit Sub

'End Sub

Encore mes remerciements les plus sincères à BOB71AU

capture
Rechercher des sujets similaires à "obliger utilisateur remplir"