Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA problem z tablicami - Error 424 Object required

grubs 25 Kwi 2013 12:50 5031 8
  • #1 25 Kwi 2013 12:50
    grubs
    Poziom 32  

    Witam
    mam poprawnie działającą funkcję która używa argumentu będącego unikatową nazwą arkusza (tą określoną jako (Name) w zakładce Alphabetic w kodzie VBA)

    Stworzyłem tą samą nazwę tylko wpisaną w komórkę innego arkusza i przepisałem ją do tablicy. Jeżeli funkcja (wcześniej poprawnie działająca) użyje argumentu będącego elementem stworzonej tablicy pojawia się błąd (Object required).

    Z tego co zauważyłem pobrana z tablicy nazwa jest używana w cudzysłowiu i stąd pewnie bierze się błąd. Pytanie jak to ominąć.

    przykład działający

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    przykład niedziałający
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    przykładu nie kompilujcie bo nie wiem czy działa chodzi w nim o pokazanie zasady działania.

    0 8
  • #2 25 Kwi 2013 16:08
    adamas_nt
    Moderator Programowanie

    1. Zakładasz, że wartość jest w A1, a do tablicy pisujesz B1:B2
    2. W argumentach zakresu brakuje kropek.
    Po mojemu powinno być (wtedy Tablica(1,1) zwróci wartość z A1)

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    3. Nie wiem jak odwołać się do kolumn z podstawieniem nazwy kodowej arkusza (VBComponents). Zawsze można wyciągnąć nazwę i nią się posługiwać. Np
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    1
  • #3 25 Kwi 2013 19:51
    grubs
    Poziom 32  

    Dzięki za zainteresowanie tematem.
    Pierwsze 1 punkt zgadza się - literówka chodzi o komórkę 1,2

    Kropek nie musi być
    działający przykład:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Co do 3 pkt :do nazwy kodowej wystarczy odwołać się do niej pisząc ją wprost np w oknie Immediate wpisujemy
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    wyświetli komórkę A1 bo domyślnie nazwa kodowa jest Arkusz 1

    natomias t w porównaniu do 1 kodu ten już nie działa:
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dlaczego potrzebuję w tej formie?
    Otóż dzięki temu mógłbym wpisać do tablicy nazwy wszystkich arkuszy które wcześniej wypisuję w komórkach. Dzięki tablicy mam łatwy dostęp do wszystkich nazw poruszając się po elementach tablicy (pętle etc.) ale jak napisałem nie działa to więc co jest nie tak? jak to przerobić do moich potrzeb.

    Powoli zaczynam rozumieć o co chodzi i wydaje mi się że w 2 przykładzie Arkusz1 jest przechowywany jako string a nie jako obiekt czyli musiałbym stworzyć tablicę obiektów które będą nazwami kodowymi arkusza. Czy w twoim przykładzie wyciągając nazwę kodową zamieniasz ją na string bo jeżeli nie to chyba nie było by potrzeby używania komendy Sheets(nazwa).Columns... tylko poprostu nazwa.Columns...

    0
  • #4 26 Kwi 2013 18:58
    czeles
    Poziom 15  

    W procedurze pojawia się błąd, ponieważ musisz użyć: przykładowo MsgBox Worksheets(nazwaarkusza).Range("A1")

    0
  • #5 28 Kwi 2013 20:33
    grubs
    Poziom 32  

    czeles ale ja chcę używać nazw kodowych a nie nazw arkusza które każdy może zmienić i makro już nie będzie działać.

    0
  • Pomocny post
    #6 28 Kwi 2013 21:38
    adamas_nt
    Moderator Programowanie

    Kręcisz się w kółko. Zrozum, że w komórce nie zapiszesz danych jako VBComponent, Object, etc. W związku z tym nie uda Ci się ich pobrać i przekazać do funkcji w taki sposób.
    Możesz zapisać w tablicy nazwy obiektów, ale w odwołaniu musiałbyś używać jej indeksu w tablicy (liczby), nie nazwy.

    Metodę pobrania nazwy arkusza (Properties.Item) znając nazwę kodową (jako string, bo tylko taką pobierzesz z komórki) podałem wyżej.

    Z drugiej strony

    grubs napisał:
    czeles ale ja chcę używać nazw kodowych a nie nazw arkusza które każdy może zmienić i makro już nie będzie działać.
    oraz
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Nie, żebym wytykał Ci niekonsekwencję ;) ale jeśli komuś przyjdzie do głowy zmienić i tę nazwę? Tu śmiało możesz użyć nazwy kodowej ( Np With Arkusz1)

    0
  • #7 29 Kwi 2013 08:30
    grubs
    Poziom 32  

    Wybacz adamas_nt ale jestem początkujący i nie do końca rozumiałem o co chodzi w kodzie podanym przez Ciebie. Teraz mi rozjaśniłeś. :)
    Czyli w twoim przykładzie x to nazwa kodowa arkusza którą wpisuję jako argument funkcji.
    VBComponents(x).Properties.Item(7) - to pole w oknie właściwości arkusza o nazwie kodowej x, tylko dlaczego (7)? Czy jest jakiś spis tych pól w zależności od indeksu.

    Myślę że na podstawie tego co napisałeś o tablicach uda mi się stworzyć to co chcę ale tematu jeszcze nie zamykam w razie gdyby były kolejne problemy. No i proszę Cię o odpowiedź na pytanie powyżej.

    0
  • Pomocny post
    #8 29 Kwi 2013 08:49
    adamas_nt
    Moderator Programowanie

    grubs napisał:
    tylko dlaczego (7)? Czy jest jakiś spis tych pól w zależności od indeksu.
    Liczbę właściwości zliczysz przez .Properties.Count. Nas interesuje tylko kilka. Otwórz nowy skoroszyt, uruchom poniższe makro (umieszczone w module). Następnie zmień nazwę arkusza2, zmień kolejność na pasku, i uruchom ponownie.
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Edit: Coś mi zaświtało, że jest inny sposób. Poszperam przy czasie i dam znać...

    0
  • #9 17 Sty 2014 10:32
    grubs
    Poziom 32  

    Zastosowanie
    VBComponents(x).Properties.Item(7)
    spełniło moje oczekiwania.
    Zamykam

    0