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

10 réponses

  1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
  2. 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
    1. 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
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
  4. 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
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      Depuis Excel 2007 il est préférable d'utiliser long pour les numéro de ligne (ils peuvent être supérieur à 65536)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
  7. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    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
    1. 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
  8. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
     
    C'est élémentaire mais il me manque des informations
    Met un exemple de ton fichier sur http://cijoint.fr/
    0
  9. 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
  10. 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
    1. 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
    2. 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
    3. 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
    4. Paf
       
      Quel code ?
      0
    5. 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
  11. 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
    1. 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
    2. 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
    3. 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
    4. 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