2017-09-21 1 views
0

J'ai créé une liste déroulante qui donne des suggestions à partir de données existantes (comme google search). J'ai suivi les étapes mentionnées dans le link pour obtenir le résultat attendu. J'ai changé le processus au code de VBA puisque la gamme de colonne qui a des données peut augmenter dans le temps (la formule sera insérée dynamiquement pour une gamme quand une nouvelle entrée est ajoutée). Maintenant, le problème est que puisque la colonne a plus de 20 000 lignes, il faut plus de temps pour afficher les suggestions quand une touche est pressée.Problème de performance dans la liste de recherche dynamique dans Dropdown dans excel

Je dois obtenir les données des utilisateurs dans un formulaire et les stocker dans une feuille Excel. Formulaire contient principalement des listes de recherche déroulantes avec une liste de recherche ayant près de 100k valeurs. La liste de recherche est maintenue dans une feuille Excel différente et la taille de la liste augmente chaque semaine. Est-il correct d'utiliser Excel VBA pour y parvenir? Si oui, comment améliorer les performances d'Excel? J'utilise Excel 2010 dans Windows Server 2008 OS. Je peux charger les données à la table de SQL Server. Si ce n'est pas possible dans Excel est-il possible que je puisse utiliser SQL Server pour y parvenir?

Répondre

0

Je ne connais pas les performances, mais j'essaie de faire l'essai suivant. Vos données sont supposées être dans la feuille "db", à partir de la rangée 2. Insted d'un combobox, je place une zone de texte (TextBox1) et une liste (ListBox1) dans un UserForm.

Private Sub TextBox1_Change() 
    Dim v As String 
    Dim YourInput As String 
    Dim iIdx As Long 
    Dim CharNumber As Integer 

    YourInput = TextBox1.Text 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    Application.EnableEvents = False 

    ListBox1.Clear 

    lLastRow = Worksheets("db").Cells(3, 1).End(xlDown).Row 
    CharNumber = Len(YourInput) 

    For iIdx = 2 To lLastRow 
     v = Worksheets("db").Cells(iIdx, 1).Text 
     If LCase(Left(v, CharNumber)) = LCase(YourInput) Then 
      ListBox1.AddItem v 
     End If 
    Next 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.EnableEvents = True 
End Sub 

Private Sub ListBox1_Click() 
    MsgBox ("Your selection: " & ListBox1.Text) 
    'do your stuff 
End Sub 
+0

Merci pour votre réponse :) Mais je vois encore le problème de performance. Il faut au moins 5 à 10 secondes pour que la liste soit mise à jour quand une touche est pressée. – Vijay

+0

Je vois .... Jetez un oeil à la nouvelle réponse. – CMArg

0

Je ne peux pas résoudre ce que vous prétendez. J'ai été capable de remplir une liste en fonction des entrées plutôt rapidement. Cependant, le code trouve votre entrée n'importe où dans la chaîne, pas au début. Selon vos données, le code suivant peut vous aider, ou peut-être vous pouvez le reformuler pour répondre à vos besoins. Encore une fois, les données sont supposées être dans la feuille "db", à partir de la rangée 2, et il y a une zone de texte (TextBox1) et une liste (ListBox1) dans un objet UserForm.

Private Sub UserForm_initialize() 
    Dim lLastRow As Long 

    'Get last row of data 
    lLastRow = Worksheets("db").Cells(3, 1).End(xlDown).Row 
    ReDim DirArray(1 To 1) 
    j = 1 

    'Add all the data to an Array (DirArray) 
    For i = 3 To lLastRow 
     ReDim Preserve DirArray(1 To j) 
     DirArray(UBound(DirArray)) = Worksheets("db").Cells(i, 1).Value 
     j = j + 1 
    Next 
End Sub 

Private Sub TextBox1_Change() 
    Dim YourInput As String 

    YourInput = TextBox1.Text 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    Application.EnableEvents = False 

    ListBox1.Clear 
    LArray = Array() 

    LArray = Filter(DirArray, YourInput, True, vbTextCompare) 

    ListBox1.List = LArray 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.EnableEvents = True 
    End Sub 

Private Sub ListBox1_Click() 
    MsgBox ("Your selection: " & ListBox1.Text) 
    'do your stuff 
End Sub 
0

J'ai fait quelque chose de similaire à une recherche google dans mon application Excel. Mon code attend 2 secondes après la dernière frappe, puis parcourt une autre feuille pour obtenir des correspondances proches. De cette façon, il n'a pas été en cours d'exécution par la DB tout en tapant ..

Wait until user has stopped typing in ComboBox to run macro (VBA)

Quelqu'un avait suggéré que je regarde en fait à ce poste, mais il n'a pas été utile à mon défi particulier.