Pb Excel : validation de cellule & ActiveCell

Résolu
Elodie -  
 Elodie -
Bonjour,

Pour lancer l'ouverture d'un Userform lorsque j'indique le mot "ok" dans une cellule, j'ai le code suivant :

Dim li As Long
If Not Intersect(Target, Range("RFI")) Is Nothing Then
li = Target.Row - Range("RFI").Cells(1, 1).Row + 1
If Range("RFI").Cells(li, 1).Value = "ok" Then
Call FormulaireRFI
End If
End If

Ensuite le FormulaireRFI (userform) contient des TextBox et lorsque j'appuie sur le CommandButton du Userform "Valider", une macro se lance pour copier les informations contenues dans les Textbox dans un certain nombre de cellules de ma feuille. Cette copie se fait à l'aide du code suivant :

ActiveCell.Offset(-1, 0).Activate
ActiveCell.Value = "Renseigné"
ActiveCell.Offset(0, 9).Activate
ActiveCell.Value = Userform1.TextBox4.Text

Dans cet exemple "Renseigné" doit venir remplacer le "ok" que j'ai précédemment entré, et le Textbox4 renseigne la cellule située à 9 colonnes de ma cellule.

Le problème est que suivant si j'appuie sur "Entrée" ou si j'utilise les fleches après ma saisie, ma ligne ActiveCell.Offset(-1, 0).Activate ne se repositionne pas toujours sur la bonne cellule.

Quelqu'un pourrait-il m'aider à retrouver/reselectionner systématiquement la cellule où je viens d'écrire "ok" ???

D'avance merci !
Elodie


A voir également:

10 réponses

Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Inspire-toi de ce code :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("RFI")) Is Nothing Or Target.Count > 1 Then Exit Sub
If Target.Value = "ok" Then Call formulaireRFI(Target)
End Sub

Sub formulaireRFI(Cible As Range)
Cible.Value = "Renseigné"
Cible.Offset(0, 9).Value = "Texte" ' Userform1.TextBox4.Text
End Sub

0
Paf
 
bonjour

si tu écris "Ok" en cells(li,1), dans ton formulaire tu peux écrire :
cells(li,1).Value ="Renseigné" 
cells(li,10).Value = Userform1.TextBox4.Text

il faudra déclaré li comme variable publique dans un module pour être connue dans tout ton projet

Bonne suite
0
Elodie
 
Bonjour Paf,

N'étant pas une spécialiste, j'ai regardé sur le forum et on indique qu'il faut déclarer une variable publique dans un module avec une fonction ou une procédure.
Donc, dans un nouveau module, j'ai écrit :

Function Variables()
Public li As Long
End Function

Le problème c'est que maintenant le userform1 "FormulaireRFI" ne s'ouvre plus lorsque j'inscris "ok" dans ma cellule...

Une idée pour m'aider ???
Merci
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Pour déclarer une variable publique, il suffit d'écrire seulement

Public li As Long 
au début d'un module standard dans la zone déclaration (avant les Sub et Function)
0
Paf
 
re

dans un module tu écris simplement:

Public li As Integer
'(pas besoin de Long et peut-être pas d'integer mais bon...)

cette variable ne doit pas être redéfinie dans d'autres procédures ou fonctions.


autre chose qui n'a rien à voir :
à quoi sert : Call FormulaireRFI
j'ai un doute sur l'appellation du formulaire RFI ou Userform1

A+
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Depuis Excel 2007 il est préférable d'utiliser long pour les numéro de ligne (ils peuvent être supérieur à 65536)
0

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

Posez votre question
Elodie
 
re,

alors, avec le Cells(li, 1)... ne me recopie pas "Renseigné" dans la cellule où je viens d'inscrire "ok" et Cells(li, 10)... me recopie le contenu de Userform1.TextBox4.Text mais dans une cellule qui n'a rien à voir (plus haut dans mon tableau et dans la 10ème colonne (J)).

Call FormulaireRFI sert à ouvrir le userform1

j'ai aussi essayé la proposition de Patrice33740 mais ça n'ouvre plus mon userform...

A+
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Au lieu de li, déclare au début du module:

Option Private Module
Public Cible as Range

et utilises ce code dans la feuille :

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("RFI")) Is Nothing Or Target.Count > 1 Then Exit Sub
If Target.Value <> "ok" Then Exit Sub
Set Cible = Target
Call formulaireRFI()
Set Cible = Nothing
End Sub


et dans le formulaire :
Cible.Value = "Renseigné"
Cible.Offset(0, 9).Value = Userform1.TextBox4.Text
0
Elodie
 
re,

Je viens d'essayer et ça me donne :
Erreur d'exécution 91
Variable objet ou variable de bloc With non définie

Et en cliquant sur débogage ça surligne en jaune le "Cible.Value = "Renseigné"

J'suis vraiment désolée pour cette galère...
Merci de ton aide
Elodie
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
C'est élémentaire mais il me manque des informations
Met un exemple de ton fichier sur http://cijoint.fr/
0
Elodie
 
Bonjour,

Mon fichier : http://www.cijoint.fr/cjlink.php?file=cj201108/cijgUG4eCQ.xls

Le problème se pose dans la feuille LongList, lorsqu'on renseigne la case "RFI Received" par un "ok", le Userform1 avec un certain nombre de textbox qui permet d'implémenter certaines colonnes du tableau par les informations reçues dans la RFI...
Une fois que les différents TextBox sont remplies, on valide grace au CommandButton "Valider les informations" et cette action doit faire passer la case "RFI Received" avec le "ok" à "Renseigné". Et c'est cette action que je cherche à réaliser car actuellement le report des données n'est pas fiable selon si j'appuie sur "Entrée" après avoir écrit "ok" ou si j'utilise les flèches pour changer de cellule.

Merci
Elodie
0
Paf
 
re

la proposition de variable li en public, répondait à l'extrait de code du premier message!

aux vues du classeur déposé sur cijoint, le code a changé ! pas facile de s'y retrouver, d'autant que les commentaires n'étouffent pas le code.

Après l'humeur, le boulot:
tu peux écrire:
If Intersect(Target, Range("RFI")) Is Nothing Or Target.Count   > 1 Or Target.Value <> "ok" Then Exit Sub

 CibleLigne = Target.row
 CibleColonne = Target.column
Call FormulaireRFI 

cibleligne et ciblecolonne à déclarer en public dans un module

dans ton userform1 tu sais alors les coordonnées de la cellule ou tu as écris "Ok"
puisque tu as = ligne : CibleLigne et colonne : CibleColonne

tu peux donc écrire :
Cells(CibleLigne,CibleColonne).Value = "Renseigné"

et donner les coordonnées absolues dans le reste du code, plutôt que les coordonnées relatives

Bonne suite
0
Elodie
 
Re bonjour Paf,

Alors, ta solution marche pour la colone RFI Received mais pas pour RFQ Received. Est-ce lié au fait que ces deux instructions sont dans le même Private Sub Worksheet_Change(ByVal Target As Range) ?

J'ai essayé en gardant CibleLigne et CibleColonne et en déclarant 2 autres variables publiques mais dans les deux cas ça ne marche pas...
As-tu une idée ?
Merci
0
Paf
 
ce qui est fait pour RFI , ne fonctionne pour RFQ que si la définition des coordonnées de la cellule "Ok" est la même.
voir si la variable ln a une utilité par la suite (dans le userform ?) ; mais tu peux très bien mettre le même code que pour RFI.
CibleLigne et CibleColonne peuvent être utilisées pour les 2; puisqu' on lance un userform ou l'autre et jamais les deux ensembles
il faut penser à adapter le userform RFQ pour que ça fonctionne

A+

NB ton classeur présente une anomalie ( ou alors c'est mon ordi ..!) je ne peux plus modifier le code des modules ( message d'erreurs sur accès DLL)
0
Elodie
 
Re,

Par contre, le code ci-dessous crée un bug à chaque fois que je supprime/modifie des données (plage de cellule car cellule par cellule pas de pb) sur la feuille LongList... c'est légèrement génant... et je vois pas comment modifier ça.
Une idée ?
0
Paf
 
Quel code ?
0
Elodie
 
Oui pardon, c'est le code lié à la plage RFI :
If Intersect(Target, Range("RFI")) Is Nothing Or Target.Count > 1 Or Target.Value <> "ok" Then Exit Sub

Ca entraine une erreur 13 - Incompatibilité de type
0
Paf
 
re
lDans la Sub Worksheet_Change

If Intersect(Target, Range("RFI")) Is Nothing Or Target.Count > 1 Or Target.Value <> "ok"Then Exit Sub
provoquait la sortie de la sub, même si l'on voulait traiter RFQ en mettant ok dans la zone RFQ !!

donc voila le code modifié pour que l'on traite bien en fonction de la cellule modifiée dans la feuille longlist

'ouvre le formulaire RFI lorsque l'on inscrit quelque chose dans la case de la colonne RFI Received
If Not Intersect(Target, Range("RFI")) Is Nothing And Target.Value = "ok" Then
    CibleLigne = Target.Row
    CibleColonne = Target.Column
    'lance la Macro FormulaireRFI
    Call FormulaireRFI
End If
'insère la date du jour dans la colonne A à chaque mise à jour d'une ligne
If Not Intersect(Target, Range("LastUpdate")) Is Nothing Then
    'Cells(Target.Row, 1).Value = Date
    Cells(Target.Row, 1).Value = Now()
End If
'ouvre le formulaire RFQ lorsque l'on inscrit quelque chose dans la case de la colonne RFQ Received
If Not Intersect(Target, Range("RFQ")) Is Nothing And Target.Value = "ok" Then
   CibleLigne = Target.Row
   CibleColonne = Target.Column
   'lance la Macro FormulaireRFQ
   Call FormulaireRFQ
End If


A+
0
Elodie
 
Super ça marche !!!!
Merci beaucoup !

Par contre, ça ne résoud pas le problème de l'erreur Incompatibilité de type mais comme la suppression multiple de cellules n'est pas censée être dans l'utilisation courante du doc, c'est pas un bug bloquant.

Encore merci !
0
Paf
 
dans quelle procedure et quelle ligne cette erreur ?

peut tu remettre ton fichier, je n'ai plus accès à la feuille longlist !

décidemment il y a un problème !!!
0
Elodie
 
bonjour Paf,

je reviens vers toi car je n'ai toujours pas réussi à résoudre mon problème d'incompatibilité de type sur ma feuille LongList. Ca bug lorsque j'ajoute une ligne ou lorsque je supprime une plage de cellules.
Dans le code, la ligne qui se surligne en jaune est :
If Not Intersect(Target, Range("RFI")) Is Nothing And Target.Value = "ok"

j'ai essayé de remettre mon fichier sur cijoint mais impossible d'accéder à leur page d'accueil ce matin.

aurais-tu une idée pour me débuger ?

merci !
0
Elodie
 
bonjour,
Finalement j'ai résolu mon problème en passant par la "fonction" Select Case.

Merci pour l'aide que tu m'as apporté sur l'ensemble de mon fichier.
Bonne suite.
0