2013-04-24 17 views
12

私は奇妙な状況を把握しようとしています。ExcelでActiveXのリストボックスが有効になっていません

私は多くのシートを持つワークブックを持っています。 1枚のシートには、1つのActiveXリストボックス(CTOverview.Listbox1)があります。 2番目のシートには、合計3つのリストボックス(CTSelected.Listbox1〜Listbox3)があります。私は両方のシート上のListbox1に同じデータを入力するクエリを使用しています。このためのコードは以下の通りです:

strSQL = "Select Distinct [Region] From [UniqueCTList$] Order by [Region]" 
closeRS 
OpenDB 

' initialize listboxes 
CTSelect.ListBox1.Clear 
CTSelect.ListBox2.Clear 
CTSelect.ListBox3.Clear 
CTOverview.ListBox1.Clear 

' initialize with entire division value 
CTSelect.ListBox1.AddItem "Entire Division" 
CTOverview.ListBox1.AddItem "Entire Division" 

' initialize selected Tech 
CTData.Range("CT_Selected") = "" 

' populate listboxes using recordset 
rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 

If rs.RecordCount > 0 Then 
    Do While Not rs.EOF 
     CTOverview.ListBox1.AddItem rs.Fields(0) 
     CTSelect.ListBox1.AddItem rs.Fields(0) 
     rs.MoveNext 
    Loop 
Else 
    MsgBox "I was not able to find any unique Regions.", vbCritical + vbOKOnly 
    Exit Sub 
End If 

このコードは美しく動作します(ない私のコード - 私はintertubesからそれを得ました)。両方のシート上の両方のLIstbox1は、異なる領域のリストをロードする。しかし、CTSelected.Listbox1から何かを選択するまでは、CTOverview.Listbox1はどの入力にも応答することができません。私がそれをしたら、リストボックス1の仕事は正常であり、少なくとも私が知る限り、それ以外の場合は接続されていません。

私は2つのリストボックス1(効果なし)を設定した後、レコードセットを閉じようとしました。 CTOverview.Listbox1でデフォルトの項目を選択しようとしました(効果なし)。

ちょうどそれが重要な場合は、ここでは、レコードセットを閉じる/開くために私のコードは次のとおりです。私の知る限り

Public Sub OpenDB() 
    If cnn.State = adStateOpen Then cnn.Close 

    cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; _ 
     DBQ=" & ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name 

    cnn.Open 
End Sub 


Public Sub closeRS() 
    If rs.State = adStateOpen Then rs.Close 
    rs.CursorLocation = adUseClient 
End Sub 

、私はCTOverviewシートのオフに焦点を取らなければなりません。他のシートをクリックしてCTOverviewに戻ると、Listbox1が動作するようです。これは、CTOverviewが私の打ち上げシートであるはずなので、問題です。

これはなぜ起こっているのでしょうか?私はこれを理解しようとしている私の髪を引き出しています。どんな洞察も高く評価されるだろう。

+0

あなたはworbook_openイベントでリストボックスを設定していますか? –

+0

はい、私です。上のコードはopenで実行されます。 – user2296377

+14

うん、そう思った。私は似たような質問に答えました(私はそれが他のフォーラムにあったかどうか分かりません)。私は私が示唆したことを覚えていないが、それは働いた....くそー!いずれかの方法。あなたは私のためにこれを試すことができますか?リストボックスにデータを入力したら、最後(直前のサブ)シート2をアクティブにし、次の行でラウンチシートをアクティブにします。 'Application.Screenupdating = false'を使って画面のちらつきがないことを確認してください。今それをテストしてください。 –

答えて

0

Siddharth Rout provided the answer in a comment。リストボックスにデータを入力したら、最後(直前のサブ)シート2をアクティブにし、次の行でラウンチシートをアクティブにします。画面のちらつきがないように、Application.Screenupdating =falseを使用してください。

関連する問題