J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil…
- User
J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil de filtre dynamique. L’idée étant que je puisse filtre une base de données dynamiquement (filtre au fur et à mesure de la saisie). Voici donc le script que j’utilise pour le UserForm que j’ai créé : Code du module: Public Sub AfficherBoiteDeRecherche() ' Appeler le formulaire RechercheForm.Show End Sub
Code pour le UserForm : Private Sub UserForm_Initialize() ' Remplir ComboBoxTableau Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject For Each lo In ws.ListObjects Me.ComboBoxTableau.AddItem lo.Name ' Changer pour ajouter le nom des tableaux Next lo Me.ComboBoxTableau.ListIndex = 0 ' Sélectionner automatiquement le premier tableau End Sub
Private Sub ComboBoxTableau_Change() ' Remplir ComboBoxColonne If Me.ComboBoxTableau.ListIndex > -1 Then Dim tblName As String tblName = Me.ComboBoxTableau.Text Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject Set lo = ws.ListObjects(tblName) Me.ComboBoxColonne.Clear Dim col As ListColumn For Each col In lo.ListColumns Me.ComboBoxColonne.AddItem col.Name Next col End If End Sub
Private Function IsNumberColumn(rng As Range) As Boolean Dim cell As Range For Each cell In rng If Not IsEmpty(cell) Then If IsNumeric(cell.Value) Then IsNumberColumn = True Else IsNumberColumn = False End If Exit For End If Next cell End Function
Private Sub TextBoxRecherche_Change() ' Filtrer en fonction de la recherche If Me.ComboBoxTableau.ListIndex > -1 And Me.ComboBoxColonne.ListIndex > -1 Then Dim tblName As String tblName = Me.ComboBoxTableau.Text Dim colName As String colName = Me.ComboBoxColonne.Text Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet ' Prendre en compte la feuille active uniquement Dim lo As ListObject Set lo = ws.ListObjects(tblName) Dim colRange As Range Set colRange = lo.ListColumns(colName).DataBodyRange
If Me.TextBoxRecherche.Text <> "" Then If IsNumberColumn(colRange) Then lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=" & Me.TextBoxRecherche.Text Else lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:="=*" & Me.TextBoxRecherche.Text & "*" End If DoEvents ' Forcer la mise à jour d'Excel Application.ScreenUpdating = True Else lo.AutoFilter.ShowAllData End IfEnd If End Sub Private Sub TextBoxRecherche_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ' Sélectionner tout le texte dans TextBoxRecherche lorsque l'utilisateur clique dessus Me.TextBoxRecherche.SelStart = 0 Me.TextBoxRecherche.SelLength = Len(Me.TextBoxRecherche.Text) End Sub Est-ce que ce code est optimal ? j’aimerai que cet outil ne ralentisse pas Excel.
- Assistant
Ce code semble bien structuré et devrait être assez performant, cependant il y a quelques améliorations possibles pour, peut-être, augmenter la performance ou rendre le code plus lisible et maintenable.
- Utiliser des variables explicites et
Option Explicit:
Il est bon de déclarer explicitement toutes vos variables, comme vous l'avez fait pour la plupart d'entre elles. Je vous recommande d'ajouter
Option Explicitau début de chaque module pour être sûr que toutes les variables sont déclarées.- Eviter l'utilisation de
ActiveSheetetActiveWorkbook:
L'utilisation de
ActiveSheetetActiveWorkbookpeut parfois provoquer des problèmes si l'utilisateur change de feuille ou de classeur pendant l'exécution du code. Il est donc préférable d'utiliser une référence explicite à la feuille de calcul ou au classeur en utilisant leur nom ou une variable.- Regrouper les actions de filtrage:
Dans la procédure
TextBoxRecherche_Change, vous appliquez le filtre deux fois, une fois pour les colonnes numériques et une autre pour les colonnes non numériques. Vous pouvez mettre à jour cette partie du code pour ne l'exécuter qu'une fois:Dim filterCriteria As String If IsNumberColumn(colRange) Then filterCriteria = "=" & Me.TextBoxRecherche.Text Else filterCriteria = "=*" & Me.TextBoxRecherche.Text & "*" End If lo.Range.AutoFilter Field:=lo.ListColumns(colName).Index, Criteria1:=filterCriteria DoEvents ' Forcer la mise à jour d'Excel Application.ScreenUpdating = True- Utiliser
Application.CalculationetApplication.ScreenUpdating:
Pour éviter les ralentissements d'Excel, vous pouvez utiliser les propriétés
Application.CalculationetApplication.ScreenUpdating. Avant d'exécuter le code, vous pouvez désactiver le calcul automatique et désactiver la mise à jour de l'écran, puis les réactiver après l'exécution du code. Par exemple :Sub MyMacro() Application.ScreenUpdating = False ' Désactive la mise à jour de l'écran Application.Calculation = xlCalculationManual ' Désactive le calcul automatique ' ... Votre code ici ... Application.ScreenUpdating = True ' Active la mise à jour de l'écran Application.Calculation = xlCalculationAutomatic ' Active le calcul automatique End SubCependant, il faut être prudent lors de l'utilisation de ces propriétés, car si votre code génère une erreur, cela peut entraîner un comportement indésirable d'Excel. Assurez-vous d'utiliser une gestion d'erreur appropriée pour rétablir les paramètres d'Excel si nécessaire.
En appliquant ces améliorations, votre code doit être plus performant et plus robuste. Néanmoins, il est important de tester et de mesurer les performances pour s'assurer qu'il répond à vos exigences.
- Utiliser des variables explicites et
- User
merci, maitenant j'aimerai généraliser cet outil pour tous les fichiers excel que j'ouvrirai. Comment je fais ?
- Assistant
Pour utiliser cet outil sur tous les fichiers Excel que vous ouvrez, vous pouvez le placer dans le fichier
PERSONAL.XLSB. Ce fichier est un classeur Excel spécial qui est ouvert en arrière-plan chaque fois que vous démarrez Excel. Les macros stockées dans ce fichier sont accessibles dans tous les classeurs que vous ouvrez dans Excel.Voici comment créer un fichier
PERSONAL.XLSBet ajouter votre outil à ce fichier:-
Ouvrez Excel et appuyez sur
Alt+F11pour ouvrir l'éditeur VBA. -
Dans l'éditeur VBA, cliquez sur
Insert>Modulepour insérer un nouveau module. -
Copiez le code du module que vous avez fourni (c'est-à-dire la procédure
AfficherBoiteDeRecherche) dans ce nouveau module. -
De retour dans l'éditeur VBA, cliquez sur
Insert>UserFormpour insérer un nouveau formulaire. -
Configurez le formulaire nouvellement créé comme votre formulaire existant (c'est-à-dire ajoutez les contrôles appropriés et copiez le code de votre formulaire existant dans celui-ci).
-
Maintenant, pour enregistrer votre travail dans le fichier
PERSONAL.XLSB, cliquez surFile>Saveou appuyez surCtrl+S. Vous verrez une boîte de dialogue vous demandant de créer ce fichier si vous ne l'avez pas déjà fait. Cliquez surOui. -
Vous verrez ensuite la boîte de dialogue "Enregistrer sous". Assurez-vous de choisir "Classeur Excel (*.xlsb)" comme type de fichier, et le nom de fichier doit être
PERSONAL. Excel devrait automatiquement choisir le bon dossier pour enregistrer ce fichier. C'est généralementC:\Users\<VotreNomUtilisateur>\AppData\Roaming\Microsoft\Excel\XLSTART. Cliquez surSavepour enregistrer le fichier. -
Fermez l'éditeur VBA et quittez Excel.
Maintenant, chaque fois que vous ouvrez Excel, votre outil de filtre dynamique sera disponible dans tous les classeurs que vous ouvrez. Vous pouvez y accéder en appuyant sur
Alt+F8pour afficher la boîte de dialogue "Macros" et en sélectionnant la macroAfficherBoiteDeRecherche.Si vous souhaitez ajouter un raccourci clavier pour exécuter cette macro, suivez ces étapes :
- Dans Excel, appuyez sur
Alt+F8pour ouvrir la boîte de dialogue "Macros". - Sélectionnez la macro
AfficherBoiteDeRecherchedans la liste. - Cliquez sur le bouton
Options.... - Dans la boîte de dialogue "Options de macro", entrez la lettre souhaitée pour le raccourci dans le champ "Touche de raccourci". Par exemple, si vous entrez "r", le raccourci sera
Ctrl+r. - Cliquez sur
OKpour fermer la boîte et enregistrez le raccourci.
Maintenant, vous pouvez utiliser le raccourci clavier pour exécuter votre outil de filtre dynamique dans n'importe quel classeur Excel.
-