Polega on na odwoływaniu się do obiektów OLE umieszczanych w arkuszu
Excela 97 (ComboBoxów). Ilustruje go następujący przykład:
1) Kładę na arkuszu ComboBox oraz CommandButton
2) Implementuję Zdarzenie Click w przycisku w następujący sposób:
Private Sub CommandButton1_Click()
ActiveSheet.Cells(1, 1) = ComboBox1.MatchFound
ActiveSheet.Cells(2, 1) =
ActiveSheet.OLEObjects("ComboBox1").MatchFound
End Sub
Po naciśnięciu przycisku program się wykłada w drugiej linii (pierwsza
działa) z błędem "Obiekt nie obsługuje tej właściwości lub metody" tak
jakby nie było dostępu do property MatchFound przy odwołaniu w drugiej
linii. DLACZEGO ???
W rzeczywistości potrzebuję rozwiązać ten problem, gdyż mam dziesiątki
ComboBoxów na arkuszu i chcę się do nich odwoływać przeglądając
kolekcję OleObjects (lub Shapes - jest ten sam problem).
Może ktoś jest w stanie mi pomóc. Pozdrawiam,
Rafał Brzozowski
ra...@bms.com.pl
P.S.
Jest jeszcze inna ciekawa sprawa. Jeśli zmienię nazwę ComboBox'a z
ComboBox1 na cokolwiek innego (np. MyCombo) to odwołanie typu
OLEObjects(index).Name (dla odpowiedniego indexu) ciągle zwraca
ComboBox1 !!!
Co ten Microsoft wymyślił ???
> Do tej pory nikt nie potrafil znalezc odpowiedzi na nastepujacy,
> wydawaloby sie prosty problem:
Bo rzeczywiscie jest prosty, a na takie rzadko sie odpowiada :-)
> Problem polega na odwolywaniu sie do obiektów OLE umieszczanych w arkuszu
> Excela 97
[...]
> Private Sub CommandButton1_Click()
> ActiveSheet.Cells(1, 1) = ComboBox1.MatchFound
> ActiveSheet.Cells(2, 1) = ActiveSheet.OLEObjects("ComboBox1").MatchFound
> End Sub
> Po nacisnieciu przycisku program sie wyklada w drugiej linii
[...]
> DLACZEGO ???
Ponieważ odwołujesz sie do obiektu OLE a nie ComboBox.
> Może ktoś jest w stanie mi pomóc. [...]
Może :-) zobacz to:
Private Sub CommandButton1_Click()
ActiveSheet.Cells(1, 1) = ComboBox1.MatchFound
ActiveSheet.Cells(2, 1) =
ActiveSheet.OLEObjects("ComboBox1").Object.MatchFound
End Sub
A po wyjaśnienia odsyłam do pliku Help VBA dla Excela
Temat: Using ActiveX controls on sheets
Fragment: Control properties that are not shown as properties of the
OLEObject object can be set by returning the actual control object using the
Object property. The following example sets the caption for CommandButton1.
Worksheets(1).OLEObjects("CommandButton1").Object.Caption = "run me"
[...]
> Jest jeszcze inna ciekawa sprawa. Jeśli zmienię nazwę ComboBox'a z
> ComboBox1 na cokolwiek innego (np. MyCombo) to odwołanie typu
> OLEObjects(index).Name (dla odpowiedniego indexu) ciągle zwraca
> ComboBox1 !!!
Mniemam, że problem jest tej samej natury, a .Name zwraca
nazwę klasy, która utworzyła ComboBox; zobacz:
OLEObjects(index).Object.Name
> Co ten Microsoft wymyślił ???
Dobrze to wykombinowali (chcesz to masz OLE, nie to ComboBox lub inne) ;-)
Pozdrowienia
Zbigniew Lewandowski
zbyc...@polbox.com
[ciach]
>> Jest jeszcze inna ciekawa sprawa. Jeśli zmienię nazwę ComboBox'a z
>> ComboBox1 na cokolwiek innego (np. MyCombo) to odwołanie typu
>> OLEObjects(index).Name (dla odpowiedniego indexu) ciągle zwraca
> > ComboBox1 !!!
>Mniemam, że problem jest tej samej natury, a .Name zwraca
>nazwę klasy, która utworzyła ComboBox; zobacz:
>OLEObjects(index).Object.Name
Użycie OLEObjects(index).Object.Name powoduje błąd: "Object doesn't
support this property or method". Tak więc pozostaje użycie np.:
OLEObjects(index).Name .
Wydaje mi się Zbyszku, że Rafał ma rację z tą zmianą nazwy.
Przynajmniej jeśli chodzi o Excel'a 97 (ANG OSR-1). Otóż w tej wersji
(u mnie) aby zmienić nazwę obiektu znajdującego się na arkuszu należy
albo zrobić to poprzez makro albo poprzez edycję pola nazwy na
arkuszu. Właściwość 'Name' w oknie 'Właściwości' "nie reaguje" na
zmianę a z drugiej strony wpisanie tam innej wartości nie powoduje
faktycznie zmiany nazwy obiektu. Być może pole to służy tylko do
określania nazw obiektów umieszczanych na formach albo jest to kolejny
ukryty *feature* Excel'a. Możliwe również, że po zainstalowaniu SR-2
problem znika.
Natomiast w Excel'u 2000 PL zmiana nazwy przy wykorzystaniu
któregokolwiek z tych trzech sposobów powoduje automatyczną zmianę
wartości zwracanych/wyświetlanych przez dwie pozostałe metody. Tak
więc wydaje się, że w tej wersji wszystko jest ok.
--
Pozdrawiam,
Hubert Dołęga
hub...@rava.com.pl
ps,
Dzięki za obszerne wytłumaczenie działania formuł tablicowych na
ms-news-pl-office. Sam bym tego lepiej nie zrobił :-).
[ciach - wytłumaczone przez Zbyszka Lewandowskiego]
>W rzeczywisto?ci potrzebuj? rozwi?za? ten problem, gdy? mam dziesi?tki
>ComboBoxów na arkuszu i chc? si? do nich odwo?ywa? przegl?daj?c
>kolekcj? OleObjects (lub Shapes - jest ten sam problem).
Możesz spróbować czegoś takiego:
================================
Sub VerifyMatch()
Dim intI As Integer, intX As Integer, oleOb As OLEObjects
Set oleOb = ActiveSheet.OLEObjects
intX = 0
For intI = 1 To oleOb.Count
If oleOb(intI).ProgId Like "Forms.ComboBox.1" Then
intX = intX + 1
ActiveSheet.Cells(intX, 1).Value = oleOb(intI).Name
ActiveSheet.Cells(intX, 2).Value = oleOb(intI).Object.MatchFound
End If
Next intI
End Sub
================================