2011-06-17 24 views
7

Bir çalışma sayfasında her biri GotFocus() etkinliğine karşılık vermesi gereken on damla aşağı menüm var.excel vba ile birden çok nesneye olay nasıl atanır?

Aşağıdaki kodu yazdım ama çalışma zamanı hatası (459) almak - "Nesne veya sınıf kümesini desteklemiyor olaylar eğer" Bir sınıfta

ben şu var clsPDRinput seslendi:

Public WithEvents inputObj As OLEObject 

Public Property Set myInput(obj As OLEObject) 
    Set inputObj = obj 
End Property 

Public Sub tbPDRInput_GotFocus() 
    //Do some stuff... 
End Sub 
sonra hata üretiyor aşağıdaki kodu çalıştırıyorum

:

Dim tbCollection As Collection 

Public Sub InitializePDRInput() 
    Dim myObj As OLEObject 
    Dim obj As clsPDRInput 

    Set tbCollection = New Collection 
     For Each myObj In Worksheets("1. PDR Documentation").OLEObjects 
      If TypeName(myObj.Object) = "ComboBox" Then 
       Set obj = New clsPDRInput 
       Set obj.myInput = myObj <-- **THIS LINE THROWS ERROR** 
       tbCollection.Add obj 
      End If 
     Next myObj 
    Set obj = Nothing 
End Sub 

Ben Bu hatayı neden olduğundan emin değilsiniz. Bir tane olsa da bu OLEObject çok genel ve her OLEObject her GotFocus() olay desteklemiyor ve bu nedenle bu hata iletisini veriyor?

OLEObject'u MSForms.ComboBox ile değiştirmeyi denedim, ancak bu sorunu çözmüyor.

herhangi bir fikir - Ben sorunu olduğunu düşünüyorum ne Güncelleme ...

Ben daha buraya soruşturma ve did olduğunu -

DÜZENLEME ... şimdi iki saat googled ve boş geldi Mesele, anlatabildiğim kadarıyla. Eğer (...inputObj as OLEObject olduğu gibi) OLEObject gibi bir değişken bildirirseniz

  1. sonra maruz sadece olayları GotFocus() ve LostFocus() bulunmaktadır. Sonra çeşitli etkinlikler maruz kalan (...inputObj as MSForms.ComboBox olduğu gibi) MSForms.ComboBox gibi bir değişken bildirirseniz
  2. (örn Change(), Click(), DblClick()) ama olaylar GotFocus() ve LostFocus()

Noktalar maruz kalmadığıvardır 1 ve 2, excel'deki nesne modeliyle tutarlıdır. Sonuç olarak, sınıfıma bir ComboBox atamaya çalıştığımda ComboBoxGotFocus() ve LostFocus olaylarını desteklemediğinden bir hata alıyorum (orijinal gönderine bakın).

Şimdi bulmaca için. Bir çalışma sayfasına bir ComboBox eklerseniz (Control ToolBox kullanarak) ve o kodun arkasındaki kodu almak için bu ComboBox'ı çift tıklatırsam, GotFocus() ve LostFocus() dahil olmak üzere tüm olaylar açığa çıkar!

+0

'Her myObj' için' 'Sonraki inputObj' tutarsız ve derleme yapmaz. Bu senin gerçek kodun mu? –

+0

Ayrıca, 'Koleksiyon olarak Dim tbCollection' sınıfınızdadır, ancak bir modülde olduğunu varsaydığım 'Sub InitializePDRInput'' 'tbCollection' kullanırsınız. Burada neler oluyor? –

+0

@ Jean-Francois Corbett - İlk noktanızda, bu kodun sürümünü indirdi. 'Her birimiz için' noktasında sadece bir yazım hatası yazıyorsunuz (yazıyı düzenleyeceğim). 2. noktaya gelince, yazım hatası - "Dim tbCollection ..." bir modülde –

cevap

5

Aşağıdaki işler benim için. Kodunuzda birkaç sorun vardı ve açılan kutularda bir GotFocus etkinliği yok, bu yüzden farklı bir tane kullanmanız gerekecek. Koleksiyonun, sınıfın bir parçası olan modülde bir küresel olması gerekir. Bunu genel "OLEobject" yaklaşımını kullanarak çalıştıramadım (aldığınız aynı hata).

' ### in the class 
Public WithEvents inputObj As MSForms.ComboBox 

Private Sub inputObj_Change() 
    MsgBox "Change!" 
End Sub 

' ### in a module 
Dim tbCollection As Collection 

Public Sub InitializePDRInput() 
    Dim myObj As OLEObject 
    Dim obj As clsPDRInput 

    Set tbCollection = New Collection 

    For Each myObj In Worksheets("Sheet1").OLEObjects 
     If TypeName(myObj.Object) = "ComboBox" Then 
      Set obj = New clsPDRInput 
      Set obj.inputObj = myObj.Object 
      tbCollection.Add obj 
     End If 
    Next myObj 

End Sub 
+0

cevabı için teşekkürler. Kodunuz çalışır (bu yüzden +1) ancak 'GotFocus()' olayına ihtiyaç duyduğumdan kullanamıyorum –

1

Güncelleme

Ben de kod derleme yapımında duruldu ve birisi aşağıda cevap bad juju olduğuna işaret etmek nezaketini gösterdi. Öyleyse kullanmayın. Derleme yapıyor, ama iyi bir cevap değil.


Ben senin oluşturulamamasını ve aşağıdaki bildiriyi değiştirerek sabit: Buna

Public WithEvents inputObj As OLEObject 

: Elbette

Public inputObj As New OLEObject 

, bu yüzden ediyorum beyanının farklı bir türüdür sizin için çalışacağından emin değil. Bu istisnayı ortadan kaldırır.

Ayrıca, Option Explicit setiniz yoksa, yapmanız gerekir. Kodunuzda bildirilmemiş bazı değişkenler var. Tahminimce, sorunuzu göndermeden önce kodu değiştirmiş olabilirsiniz.

Sadece emin olun.

+0

'Genel girdiObj As New OLEObject': Bu, otomatik bir örnekleme değişkeni olarak adlandırılır. Kodda 'inputObj' değişkeni ile ilk karşılaşıldığında yeni bir örnek oluşturulur. Genel olarak, iki nedenden ötürü otomatik örnekleme değişkenlerinden kaçınmalısınız: Birincisi, koda ek yük ekler çünkü değişken kodda her karşılaşıldığında 'Hiçbir şey' için test edilmelidir. –

+0

İkinci olarak, bir otomatik örnek değişkeninin "Hiçbir şey" olup olmadığını sınamanın hiçbir yolu yoktur, çünkü değişken adının bir "If Obj Olduğunda Değildir" ifadesinde kullanılması eylemi otomatik olarak değişkenin bir örneğini oluşturur. [kaynak] (http://www.cpearson.com/excel/classes.aspx) –

+0

@ Jean-François Corbett Bilmiyordum; İşaret ettiğin için teşekkürler. – ray