2013-04-24 32 views
12

Próbuję rozgryźć dziwną sytuację.Listbox ActiveX Excel nie jest włączony przy otwartym pliku

Mam skoroszyt z wieloma arkuszami. Na jednym arkuszu mam jedną listbox ActiveX (CTOverview.Listbox1). Na drugim arkuszu mam w sumie trzy listy list (CTSelected.Listbox1 przez Listbox3). Używam zapytania do wypełnienia Listbox1 na obu arkuszach tymi samymi danymi. Kod do tego jest poniżej:

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 

Ten kod działa pięknie (nie mój kod - mam go z intertubes). Zarówno LIstbox1 na obu arkuszach ładuje się z listą odrębnych regionów. Jednak nie mogę uzyskać CTOverview.Listbox1, aby odpowiedzieć na jakiekolwiek wejście, dopóki nie wybiorę czegoś z CTSelected.Listbox1. Kiedy to zrobię, obie listy1 działają normalnie i nie są w żaden inny sposób połączone, przynajmniej na tyle, na ile mogę to stwierdzić.

Próbowałem zamknąć zestaw rekordów po tym, jak zalałem dwie listy Listbox1 (bez efektu). Próbowałem wybrać domyślny element w CTOverview.Listbox1 (bez efektu).

Tylko w przypadku, jest to ważne, tutaj jest mój kod, aby otworzyć/zamknąć rekordów:

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 

O ile mogę powiedzieć, muszę wziąć skupić off arkusza CTOverview. Jeśli kliknę na dowolny inny arkusz, a następnie kliknę z powrotem do CTOverview, Listbox1 wydaje się działać. To jest problem, ponieważ CTOverview ma być moim arkuszem startowym.

Każdy pomysł, dlaczego tak się dzieje? Wyciągam włosy, próbując to rozgryźć. Wszelkie spostrzeżenia byłyby mile widziane.

+0

Czy zapełniasz listbox w zdarzeniu worbook_open? –

+0

tak, jestem. powyższy kod jest otwarty. – user2296377

+14

Hmmm, tak myślałem. Odpowiedziałem na podobne pytanie (nie jestem pewien, czy było to w SO, czy na jakimś innym forum). Nie pamiętam nawet, co sugerowałem, ale zadziałało .... Cholera! W każdym razie. Możesz spróbować tego dla mnie. Po wypełnieniu listbox, na samym końcu (tuż przed końcem sub) aktywuj arkusz 2, aw następnym wierszu aktywuj arkusz uruchamiania. Użyj 'Application.Screenupdating = false', aby upewnić się, że nie miga ekran. Teraz przetestuj to. –

Odpowiedz