Skip to content
The Chat Archive
gpt-4-0314· OpenAI WildChat-4.8M (AI2)

J’ai créé ce code VBA sur Microsoft excel 2021 version francaise pour me créer un outil…

  1. 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 If
    

    End 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.

  2. 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.

    1. 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 Explicit au début de chaque module pour être sûr que toutes les variables sont déclarées.

    1. Eviter l'utilisation de ActiveSheet et ActiveWorkbook:

    L'utilisation de ActiveSheet et ActiveWorkbook peut 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.

    1. 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
    
    1. Utiliser Application.Calculation et Application.ScreenUpdating:

    Pour éviter les ralentissements d'Excel, vous pouvez utiliser les propriétés Application.Calculation et Application.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 Sub
    

    Cependant, 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.

  3. User

    merci, maitenant j'aimerai généraliser cet outil pour tous les fichiers excel que j'ouvrirai. Comment je fais ?

  4. 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.XLSB et ajouter votre outil à ce fichier:

    1. Ouvrez Excel et appuyez sur Alt + F11 pour ouvrir l'éditeur VBA.

    2. Dans l'éditeur VBA, cliquez sur Insert > Module pour insérer un nouveau module.

    3. Copiez le code du module que vous avez fourni (c'est-à-dire la procédure AfficherBoiteDeRecherche) dans ce nouveau module.

    4. De retour dans l'éditeur VBA, cliquez sur Insert > UserForm pour insérer un nouveau formulaire.

    5. 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).

    6. Maintenant, pour enregistrer votre travail dans le fichier PERSONAL.XLSB, cliquez sur File > Save ou appuyez sur Ctrl + 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 sur Oui.

    7. 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éralement C:\Users\<VotreNomUtilisateur>\AppData\Roaming\Microsoft\Excel\XLSTART. Cliquez sur Save pour enregistrer le fichier.

    8. 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 + F8 pour afficher la boîte de dialogue "Macros" et en sélectionnant la macro AfficherBoiteDeRecherche.

    Si vous souhaitez ajouter un raccourci clavier pour exécuter cette macro, suivez ces étapes :

    1. Dans Excel, appuyez sur Alt + F8 pour ouvrir la boîte de dialogue "Macros".
    2. Sélectionnez la macro AfficherBoiteDeRecherche dans la liste.
    3. Cliquez sur le bouton Options....
    4. 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.
    5. Cliquez sur OK pour 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.