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*****************
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 :
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!
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"
Bonsoir Capucin,
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.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?
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!