Pb Excel : validation de cellule & ActiveCell

Résolu
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. 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
    1. 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. 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
    2. 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
      1. 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. Depuis Excel 2007 il est préférable d'utiliser long pour les numéro de ligne (ils peuvent être supérieur à 65536)
          0
      2. 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
        1. 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. 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
        2. C'est élémentaire mais il me manque des informations
          Met un exemple de ton fichier sur http://cijoint.fr/
          0
          1. 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
            1. 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. 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. 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. 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. Quel code ?
                0
              5. 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
            2. 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. 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. 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. 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. 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