2013-04-24 35 views
12

Garip bir durum anlamaya çalışıyorum.Excel ActiveX Listbox açık dosyada etkin değil

Çok sayfalı bir çalışma kitabım var. Bir sayfada, bir ActiveX liste kutum var (CTOverview.Listbox1). İkinci bir sayfada toplam üç liste kutusu var (CTSelected.Listbox1 thru Listbox3). Listbox1'i aynı verilerle her iki sayfada doldurmak için bir sorgu kullanıyorum. Bunun için kod aşağıda:

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 

Bu kod güzel çalışıyor (benim kod - Ben intertubes aldım). Her iki sayfada da LIstbox1'ler, farklı bölgelerin listesiyle yüklenir. Ancak, CTSelected.Listbox1'den bir şey seçinceye kadar CTOverview.Listbox1'in herhangi bir girdiye yanıt veremiyorum. Bunu yaptıktan sonra, her iki Listbox1'in çalışması normal olarak çalışıyor ve en azından benim anlatabildiğim kadarıyla bağlı değil.

İki Listbox1'i (etki yok) yerleştirdikten sonra kayıt kümesini kapatmayı denedim. CTOverview.Listbox1'de bir varsayılan öğe seçmeyi denedim (etki yok). Ben söyleyebilirim, ben CTOverview sacın kapalı odaklanmak almak zorunda Bildiğim kadarıyla

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 

: bu konularda olur ne olmaz

, burada recordset kapatmak/açmak için benim koddur. Başka bir sayfaya tıklarsam, daha sonra CTOverview'a geri dönün, Liste Kutusu1 çalışır gibi görünüyor. Bu bir problem çünkü CTOverview'in lansman sayfası olması gerekiyordu.

Bunun neden olabileceği hakkında bir fikriniz var mı? Bunu anlamaya çalışırken saçlarımı çekiyorum. Herhangi bir anlayış çok takdir edilecektir.

+0

Liste kutusunu worbook_open etkinliğinde mi dolduruyorsunuz? –

+0

evet, öyleyim. Yukarıdaki kod açık çalışır. – user2296377

+14

Hmmm, öyle düşündüm. Benzer bir soruya cevap verdim (SO ya da başka bir forumda olup olmadığından emin değilim). Ne önerdiğimi bile hatırlamıyorum ama işe yaradı .... Lanet olsun! Neyse. Bunu benim için deneyebilir misin? Liste kutusunu dolduktan sonra, hemen sağa (hemen bitiş altından) sayfa2'yi etkinleştirin ve sonraki satırda başlatma sayfasını etkinleştirin. Ekran titremesi olmadığından emin olmak için 'Application.Screenupdating = false' kullanın. Şimdi test et. –

cevap

0

Siddharth Rout provided the answer in a comment. Liste kutusunu dolduktan sonra, hemen sağa (hemen bitiş altından) sayfa2'yi etkinleştirin ve sonraki satırda başlatma sayfasını etkinleştirin. Ekran titremesi olmadığından emin olmak için Application.Screenupdating =false kullanın.