Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 57922 Skopiuj do schowka Property let procedure not defined and property get proc ...
Autor Wiadomość
apollo
ExcelSpec


Pomógł: 1230 razy
Posty: 4257
Wysłany: 03-07-2017, 20:32   Property let procedure not defined and property get proc ...

Mamy 2 procedury test1 (dodana jest referencja do biblioteki scrrun.dll) i test2 (bez referencji). Kod test1 jest bez błędu a w kodzie test2 jest błąd "Property let procedure not defined and property get procedure did not return an object" w linii .Key(.Keys(0)) = "c"
Kod:

Sub test1()
Dim slownik As Dictionary
    Set slownik = New Dictionary
    slownik.Add "a", "b"
    With slownik
        .Key(.Keys(0)) = "c"
    End With
    Set slownik = Nothing
End Sub

Sub test2()
Dim slownik As Object
    Set slownik = CreateObject("Scripting.Dictionary")
    slownik.Add "a", "b"
    With slownik
        .Key(.Keys(0)) = "c"
    End With
    Set slownik = Nothing
End Sub


Poprawiłem linię z błędem, poprawny kod jest w załączniku.

Jest pytanie i proszę o wyjaśnienie przyczyny błędu. Coś tam mam w głowie ale nic konkretnego ;-)

Co do poprawienia kodu to proszę nie zaglądać do załącznika. Niech każdy najpierw sam spróbuje poprawić kod i wyjaśni, dlaczego jest błąd.

Pytam, bo nie umiem konkretnie wyjaśnić. Słownik jest tylko przykładem, bo dany błąd występuje w wielu przypadkach. Ale chcę wyjaśnienie dla tego, i na podstawie tego konkretnego przypadku.

Pozdrawiam

slownik.txt
Pobierz Plik ściągnięto 102 raz(y) 529 Bajtów

ID posta: 325604 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1230 razy
Posty: 4212
Wysłany: 07-07-2017, 13:16   

To raczej nie moja działka, ale ponieważ mądrzejsi ode mnie milczą, to napiszę tylko co udało mi się ustalić po przejrzeniu różnych tekstów w sieci. Wygląda na to, że uniwersalnym sposobem użycia metod Keys i Items jest ich zapisanie z parą pustych nawiasów, czyli np.
Kod:
Keys()(ItemNumber)
lub
Kod:
Items()(ItemNumber)
Wersja bez nawiasów działa tylko przy wczesnym wiązaniu. Ale dlaczego tak jest, to już trudno zrozumieć, jak się nie zna dokładnego mechanizmu generowania kodu.
ID posta: 325833 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1230 razy
Posty: 4257
Wysłany: 07-07-2017, 14:32   

Dziękuję za zainteresowanie.
Maciej Gonet napisał/a:
Wygląda na to, że uniwersalnym sposobem użycia metod Keys i Items jest ich zapisanie z parą pustych nawiasów

Ja wiedziałem, jak mam pisać
Cytat:

Ale dlaczego tak jest, to już trudno zrozumieć

I właśnie chodzi mi o to, dlaczego jest błąd.

Ja sobie kombinuję jak niżej, ale nie wiem, czy poprawnie, stąd moje pytanie .

"Przy wczesnym wiązaniu to już wiadomo, jest metoda Keys zwracająca tablicę. No i Keys(0) to pierwszy element tej tablicy.

Przy późnym wiązaniu to compilator musi wywołać jakąś funkcję systemową żeby pozyskać wskaźnik do metody lub właściwości Keys z
parametrem, bo Keys(0). A ponieważ nie znajdzie, co prawda jest metoda Keys ale bez parametru, więc zwracany jest błąd."

Ale z komunikatu to wynika chyba, że nawet nie było próby szukania metody, była tylko próba szukania właściwości, bo property get / property let
???

Czyli pytałem o takie wyjaśnienie. Co do pisania kodu to w załączniku już podałem
Kod:

With slownik
        .Key(.Keys()(0)) = "c"
    End With
ID posta: 325838 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Pomógł: 2613 razy
Posty: 8611
Wysłany: 10-07-2017, 09:30   

Ja wygrzebałem taki wątek. Acz przyznam, że nie miałem siły i czasu go analizować. Ale może Cię naprowadzi na odpowiedź "dlaczego?".
Gdybyś rozwiązał zagadkę chętnie poznamy rozwiązanie. :-)

Artik
ID posta: 325927 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1230 razy
Posty: 4257
Wysłany: 10-07-2017, 11:34   

Artik,

Dziękuję z zainteresowanie. Zauważ, że w moim problemie nie ma błędu kiedy jest referencja. Jest błąd kiedy nie ma referencji.

Tutaj jest podobnie. Jeśli jest
Kod:

Property Get exception()
    exception = o_exception
End Property

to nie ma błędu przy
Kod:

Public Sub test()
Dim a As Class1
    Set a = New Class1
    Debug.Print a.exception(0)
End Sub

Bo to jest podobnie jak dodajemy referencję (mamy Dim a As Class1).

Jeśli mamy Dim a As Object to będzie owy komunikat.

No bo właściwość exception to właściwość, że tak powiem, bez parametru, która zwraca tablicę. A a.exception(0) "sugeruje", ze jest właściwość exception z parametrem, co jest nieprawdą. Dlatego jest błąd.

Jeśli mamy
Kod:

Property Get exception(index As Long)
    exception = o_exception(index)
End Property

to już jest jasne: jest właściwość exception z parametrem, która zwraca wartość zamiast tablicy. Dlatego
Kod:

Public Sub test()
Dim a As Object
    Set a = New Class1
    Debug.Print a.exception(0)
End Sub

nie generuje błędu.

Z Property Get exception() i Dim a As Object (jakby nie było referencji) to musi być
Kod:

Public Sub test()
Dim a As Object
    Set a = New Class1
    Debug.Print a.exception()(0)
End Sub

--------------
Wracając do mojego problemu to uważam tak:

Kiedy właściwość jest bez parametru i zwraca tablicę to jedyny słuszny sposób dostępu do elementu tablicy jest
Kod:

Debug.Print slownik.Keys()(0)


W takim razie dlaczego kiedy jest referencja to poprawny jest i kod
Kod:

Debug.Print slownik.Keys(0)

???
Uważam dodatkowo, że w tym przypadku ponieważ jest referencja (lub As Class1) to VBA może sprawdzić Keys, i po prostu "idzie na rękę", "pozwala iść na skrót". Czyli pozwala opuścić "()"

Wniosek (na mój użytek): nie polegać na łasce, na ułatwieniu, które oferuje VBA. Po prostu lepiej nie opuścić "()"
ID posta: 325940 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe