2017-09-21 8 views
0

私は既存のデータ(Google検索など)からの提案を提供するドロップダウンリストを作成しました。私は期待通りの結果を得るためにlinkに記載されている手順に従っています。私はVBAコードにプロセスを変更しました。データを持つ列の範囲は時間の経過とともに増加する可能性があります(新しいエントリが追加されたときに式が動的に挿入されます)。今問題は、列が20 000行以上あるので、キーが押されたときに提案を表示するのに時間がかかります。動的ドロップダウンでのパフォーマンスの問題Excelでの検索リスト

フォームからユーザーからデータを取得し、Excelシートに保存する必要があります。フォームには、ほぼ100kの値を持つ検索リストを含むドロップダウン検索リストが含まれます。検索リストは別のExcelシートで管理され、リストのサイズは毎週増加します。これを達成するためにExcel VBAを使用してもよろしいですか?もしそうなら、パフォーマンスを向上させる方法は?

Windows Server 2008 OSでExcel 2010を使用しています。私はSQL Serverテーブルにデータを読み込むことができます。 Excelでこれができない場合は、これを達成するためにSQL Serverを使用できる方法がありますか?

答えて

0

パフォーマンスについてはわかりませんが、次のように試してみてください。あなたのデータは2列目以降のシート "db"であるはずです。私は、コンボボックスを利用して、ユーザフォームにテキストボックス(TextBox1)とリスト(ListBox1)を配置します。

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

回答ありがとうございます:)しかし、私はまだパフォーマンスの問題があります。キーが押されたときにリストボックスが更新されるには、少なくとも5〜10秒かかります。 – Vijay

+0

私は見る...新しい答えを見てください。 – CMArg

0

私はあなたのふりを解決できません。私はかなり速い入力に従ってリストを記入することができました。しかし、コードでは、文字列内のどこにでも入力が最初から見つかるわけではありません。データに応じて、次のコードを参考にするか、ニーズに合わせて再フォーマットすることができます。ここでも、データは2行目以降のシート「db」にあり、ユーザーフォームにはテキストボックス(TextBox1)とリスト(ListBox1)があります。

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

私はExcelのアプリでGoogle検索と同様のことをしました。私のコードは、最後のキーストロークの2秒後に待ちます。それは入力しながらDBを介して実行されていないこの方法では...

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

誰かが、私は実際にこの記事を見て提案していたが、それは私の特定のチャレンジに有用ではなかったです。

関連する問題