Recherche "live" selon la lettre ecrite

Bonjour a tous,

Il semble qu'il soit possible par VBA de chercher le contenu que l'on est en train d'ecrire dans une colonne d'un tableau. Par exemple si la premiere lettre que j'ecris dans une cellule est B, cette lettre permettrais d'afficher la premiere occurence d'une colonne dont la cellule commence par B.

Je vous envoi un fichier avec les details.

Au plaisir de vous lire,

Capucin.

**************voir ma conclusion a la fin*****************

34recherche.zip (299.63 Ko)

Bonsoir Capucin,

J'ai téléchargé ton fichier, mais j'ai 2 références manquantes et Feuil2 qui n'existe pas dans ton fichier !

Je n'ai pas travaillé dans ton fichier, mais ta demande ne me semble pas réalisable car quand tu es dans une cellule à saisir du texte aucun événement ne peut se déclancher, il vaut mieux passer par un TextBox placé sur ta feuille et utiliser l'événement Change qui s'exécute à chaque saisie de caractère.

Voici un exemple dont tu peux t'inspirer :

https://forum.excel-pratique.com/excel/saisie-intuitive-dans-liste-deroulante-excel-vba-t37840.html#p213457

Après, tu peux remplacer la ListBox par la mise en évidence de la ligne de la feuille mnemonique2, mais l'affichage dans la ListBox me semble aussi pertinent. A toi de voir.

Bonsoir Benoit! j'ai ete voir ce que tu as deja fait et j'aime bien l'idee du textbox avec l'emploi de TextBox1_Change(). Je vais essayer cette semaine d'adapter ca sur mon application. Je compte utiliser la mise en évidence de la ligne de la feuille mnemonique2 au lieu de la list box car elle est deja pleine grandeur d'ecran.

Pour les 2 refernces manquantes, j'ignore ce que tu veux dire, ainsi que la feuille 2?

A+

Capucin

Private Sub TextBox1_Change() ' Changement du contenu du TextBox
    Call ChargeListbox(TextBox1.Text)
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
If Target.Count = 1 Then ' Si une seule cellule de sélectionnée
        ' déplacement du TextBox
        TextBox1.Left = Target.Left + Target.Width
        TextBox1.Top = Target.Top
        ' Déplacement du ListBox
        ListBox1.Left = TextBox1.Left
        ListBox1.Top = TextBox1.Top + TextBox1.Height
        ' Chargement de la ListBox
        Call ChargeListbox("")
    End If
End Sub

Private Sub ChargeListbox(sFiltre) ' Rechargement du ListBox avec filtrage
    ListBox1.Clear
    For l = 1 To ActiveSheet.UsedRange.Rows.Count
        If Cells(l, 1).Text Like "*" & sFiltre & "*" Then
            ListBox1.AddItem Cells(l, 1).Text
        End If
    Next l
End Sub

Benoit, je me demandais si c'etait possible que lorsqu'on clic sur une cellule vide, un textbox se place automatiquement par dessus. Ensuite est-ce possible que losqu'on fait <enter> sur un textbox, l'on puisse passer a la cellule plus basse?

Bonsoir Capucin,

Pour avoir le TextBox au dessus de la cellule :

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
If Target.Count = 1 Then ' Si une seule cellule de sélectionnée
        ' déplacement du TextBox
        TextBox1.Value = Empty
        TextBox1.Left = Target.Left
        TextBox1.Top = Target.Top
        TextBox1.Select
        TextBox1.Activate
    End If
End Sub

Je te laisse adapter le code pour tester le contenu de la cellule et pour limiter à une plage ou une colonne.

Pour descendre d'une cellule quand appuie sur Entrée :

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode = 13 Then ' Touche Entrée
   ActiveCell.Offset(1, 0).Select
    End If
End Sub

Salut Benoit, j'ai adapte ton code pour mon application, ca fonctionne bien sauf quelques petits problemes pour l'oeil. Pourrais-tu y jeter un coup d'oeil?

Je t'envoi un nouveau fichier avec lequel tu sera en mesure de travailler.

Merci!

21recherche-2.zip (17.99 Ko)

En simplifiant le code ça a l'air mieux :

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
   TextBox1 = ActiveCell
   TextBox1.Left = Target.Left
   TextBox1.Top = Target.Top
   TextBox1.Activate
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then ' Touche Entrée
      ActiveCell = TextBox1 'on met le contenu du textbox dans la cellule avant de se deplacer
      ActiveCell.Offset(1, 0).Select 'on selectionne la cellule suivante
   End If
End Sub

Qu'en penses-tu ?

WOW! C'est presque magique que ca fonctionne quand meme. J'ai l'impression que le sub de l'evenement DOWN declenche l'autre evenement Change selection, est-ce que je me trompe?

Je te renvoi un fichier avec tes 2 sub simplifies, car il y a un petit effet agancant pour l'oeil lorsqu'on passe d'une cellule a l'autre, entre autre on voit apparaitre brievement du hachurage dans le textbox et pendant une fraction de seconde la valeur du textbox de la cellule precedente. C'est ce que je voulais dire par "petit probleme pour l'oeil"

39recherche-3.zip (17.18 Ko)

Bonsoir Capucin,

WOW! C'est presque magique que ca fonctionne quand meme. J'ai l'impression que le sub de l'evenement DOWN declenche l'autre evenement Change selection, est-ce que je me trompe?

Oui, c'est parce que la touche Entrée déplace la cellule active d'une ligne vers le bas pour la mise à jour suivante, donc l'événement SélectionChange se déclanche.

J'ai passé pas mal de temps à solutionner ton problème, mais on arrive à la limite, soit du tableur, soit de mes connaissances en celui-ci. Je ne pourrais pas faire plus "visuellement".

La cause de cet effet visuel désagréable est qu'on passe de la cellule active au TextBox en permanence, et quand on sélectionne la cellule active, celle-ci a une épaisse bordure qui donne cet effet stroboscopique agaçant, je ne pense pas que l'on puisse s'en passer.

J'ai contourné le problème en n'utilisant, pour des raisons pratiques l'affichage du TextBox qu'en colonne B, et pour ne plus voir la cellule active (ou très peu), j'ai masqué la colonne A, il faudra que tu en fasses autant.

J'ai ajouté des instructions pour sélectionner le texte quand on change de cellule, je pense que c'est un plus ; mais si ne le souhaite pas, tu pourras désélectionner cette option.

Voici le code à copier dans sa globalité dans le module de la feuille :

Option Explicit

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   If KeyCode = 38 Or KeyCode = 40 Then ' Si Flèche Haut ou Flèche Bas on sélectionne le texte
     TextBox1.SelStart = 0
      TextBox1.SelLength = Len(TextBox1.Text)
   End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
  Dim rCellule As Range
   ' Si la colonne est > B ou si plusieurs cellules sont sélectionnée, on sort
  If Target.Column > 2 Or Target.Count > 1 Then
      TextBox1.Visible = False
      Exit Sub
  End If
   ' si la colonne est B alors on active la colonne A pour ne plus voir la cellule active (il faut masquer la colonne A
  If Target.Column = 2 Then Target.Offset(0, -1).Activate: Exit Sub
   ' On détermine la cellule de la colonne B que l'on considère comme active
  Set rCellule = Target.Offset(0, 1)
   ' On charge le TextBox
  TextBox1.Text = rCellule.Text
   ' On déplace le TextBox
  TextBox1.Left = rCellule.Left
   TextBox1.Top = rCellule.Top
   ' On redimensionne le TextBox
  TextBox1.Height = rCellule.Height
   TextBox1.Width = rCellule.Width
   ' On active le TextBox
  TextBox1.Activate
  TextBox1.Visible = True
   'On sélectionne le texte du TextBox (Ne fonctionne bizarrement qu'avec la touche Entrée
  TextBox1.SelStart = 0
   TextBox1.SelLength = Len(TextBox1.Text)
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Or KeyCode = 40 Then ' Touche Entrée ou Flèche Bas
    ActiveCell.Offset(0, 1) = TextBox1 'on met le contenu du textbox dans la cellule avant de se deplacer
    ActiveCell.Offset(1, 0).Select 'on selectionne la cellule suivante
 ElseIf KeyCode = 38 Then ' Touche Flèche Haut
    ' On contrôle que la ligne est supérieure à la première ligne, sinon cela bug car la ligne 0 n'existe pas
    If ActiveCell.Row > 1 Then
        ActiveCell.Offset(-1, 0).Select
     End If
  End If
 End Sub

Tout, ou presque, est expliqué dans le code qui génère une navigation beaucoup plus fluide.

Pour que la navigation soit encore plus pratique, tu peux maintenant monter ou descendre (sans mise à jour) d'une ligne à l'autre grâce aux touches Flèche Bas et Flèche Haut.

J'ai remarqué que, quand on copie du code d'Excel-Pratique vers VBA, ce code n'est pas cadré tout à gauche, donc pour le cadré vers la gauche, il faut sélectionner l'ensemble du texte et faire Majuscule+Tab jusqu'à ce que les Procédures soient le plus à gauche possible. L'indentation, c'est le fait d'écrire le code de manière hiérarchique pour que la lecture soit plus facile et qu'on s'y retrouve plus facilement dans les imbrications de If, Do, With et autres instructions.

Si tu ne veux pas de cette indentation, il faut faire Majuscule+Tab, jusqu'à ce quelle ait disparue. Au contraire, si tu trouves cela pratique, il faut sélectionner le texte que tu veux indenter et faire simplement Tab.

Bonjour à tous,

il me semble que si on met textbox1 invisible au début le désagrément est moindre, je ne vois plus le hachurage.

Et avec ScreenUpdating = False on ne voit plus la sélection de A.

Remplacer au début :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)    ' Sélection d'une cellule
    Dim rCellule As Range
    ' Si la colonne est > B ou si plusieurs cellules sont sélectionnée, on sort
    TextBox1.Visible = False
    If Target.Column > 2 Or Target.Count > 1 Then Exit Sub
    Application.ScreenUpdating = False
    ' si la colonne est B alors on active la colonne A pour ne plus voir la cellule active (il faut masquer la colonne A
    ' etc...

eric

Bonsoir Capucin et Eric,

Eriic,, j'avais fait plusieurs tests avec SreenUpdating, mais rien de satisfaisant. Je l'ai ajouté au cas ou cela améliore le rendu sur certains ordinateurs. Par contre je n'avais pas pensé à TextBox1.Visible, mais avec Excel 2010 je ne vois pas la différence. Par contre avec Excel 2013, c'est une catastrophe, je le trouve particulièrement lent et gourmand en ressource.

Capucin, j'ai modifié le SélectionChange, en prenant en compte les remarques d'Eric et en masquant le TextBox quand on est dans une colonne différente de B (il restait affiché auparavant) :

Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Sélection d'une cellule
   Dim rCellule As Range

   TextBox1.Visible = False
   ' Si la colonne est > B ou si plusieurs cellules sont sélectionnée, on sort
   If Target.Column > 2 Or Target.Count > 1 Then Exit Sub
   ' si la colonne est B alors on active la colonne A pour ne plus voir la cellule active (il faut masquer la colonne A
   If Target.Column = 2 Then Target.Offset(0, -1).Activate: Exit Sub
   Application.ScreenUpdating = False
   ' On détermine la cellule de la colonne B que l'on considère comme active
   Set rCellule = Target.Offset(0, 1)
   ' On charge le TextBox
   TextBox1.Text = rCellule.Text
   ' On déplace le TextBox
   TextBox1.Left = rCellule.Left
   TextBox1.Top = rCellule.Top
   ' On redimensionne le TextBox
   TextBox1.Height = rCellule.Height
   TextBox1.Width = rCellule.Width
   'On sélectionne le texte du TextBox (Ne fonctionne bizarrement qu'avec la touche Entrée
   TextBox1.SelStart = 0
   TextBox1.SelLength = Len(TextBox1.Text)
   ' On active le TextBox
   TextBox1.Visible = True
   TextBox1.Activate
   Application.ScreenUpdating = True
End Sub

Conclusion: apres avoir jouer pas mal avec tout ce code, j'ai finalement reussi a faire quelque chose de tres bien! Le truc est vraiment d'employe un textbox, qui lui, possede les evenements pour faire ce que je voulais. Une difficulte etait de comprendre l'interraction entre les evenements, car dans certains cas, un evenement en declenche un autre. Il y avait egalement quelques probleme secondaire d'affichage.

Le principe etait de superposer un textbox sans cadrage par dessus la cellule active de sorte qu'on ne s'apercoit pas que c'est un textbox. je peux me deplacer d'une cellule a une autre a volonter soit par clic ou par une touche comme enter, fleche...

Methode:

1-on transfert le contenu du textbox dans la cellule active

2-on se deplace, soit par un clic ou enter ou autre

3- on met le contenu de la cellule active dans le text box

4- on affiche le text box

Merci a Eric et Benoit!

Le jour ou l'un de nous deux ira à Montréal, il s'arrêtera chez toi et tu devras lui payer la pinte

Chez nous, les pintes c'est fait pour le lait, ou devrais-je dire c'etait fait! lol

A la prochaine!

Oh ! Ben non alors, on ira pas te voir...

De toute facon, je ne bois "des pintes" que pendant les series eliminatoires de hockey! lol. En ce moment les canadiens de Montreal vont bien, c'est l'euphorie a Montreal et au Quebec en general! On vise pas moins que la coupe Stanley!

Rechercher des sujets similaires à "recherche live lettre ecrite"