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.

Makro vba - Powrót do tematu

Tomek456 08 Paź 2013 11:29 2058 24
  • #1 08 Paź 2013 11:29
    Tomek456
    Poziom 9  

    Witam raz jeszcze,
    Mam nadzieję, że piszę już po raz ostatni w tym temacie, ale nie daje mi on spokoju, ponieważ makro traktuje wszystkie procedury jako True. A sądząc z warunku If, jeśli nie znajdzie odpowiedniego wymiaru w tabeli, to powinno być False. Nie wiem też czemu po podświetleniu w kodzie słowa knyps, zawsze wyświetla się knyps=True, a moim zdaniem, powinno być w drugim warunku knyps=False
    Pozdrawiam i dziękuje za każdą pomoc. Makro na dziś dzień wygląda następujaco, może gdzieś popełniam błąd..

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0 24
  • Pomocny post
    #2 08 Paź 2013 11:43
    marcinj12
    Poziom 40  

    Kod łatwiej się czyta, kiedy umieścisz go w znacznikach...
    Na Twoim miejscu zacząłbym od usunięcia

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    bo to, że błędy ukrywasz nie znaczy, że one znikną...

    Nie wiem też, czemu mają służyć te linijki z XlApp - jeżeli chcesz się odwołać do bieżącego pliku, to się robi inaczej (zakłądajc, że jest to makro w Excelu)...
    Wg mnie ten kod powinien wyglądać tak (zwróć dokładną uwagę na wszystkie modyfikacje):
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #3 08 Paź 2013 11:50
    Tomek456
    Poziom 9  

    Już odpowiadam:)
    Zrobiłem makro w programie SolidWorks i dlatego jest XlApp, ponieważ odwołuję się do tabeli w arkuszu Excel. Możliwe, że makro, źle zdefiniowałem, bo program musi tam wejść, przeszukać tą tablicę, jak znajdzie wymiar, to jest True, uruchamia makro1, w przeciwnym razie jest False, musi wyjść z arkusza, wrócić do makra i uruchomić drugi warunek skomplikowane troche:)

    0
  • Pomocny post
    #4 08 Paź 2013 12:47
    marcinj12
    Poziom 40  

    Ale działa to co podesłałem, czy nie? :)

    0
  • #5 08 Paź 2013 13:37
    Tomek456
    Poziom 9  

    Tak szybko sprawdzając, to nie do końca działa..
    Powstał błąd 1004 (Method 'This Workbook' of Object '_Global' failed) w linii:
    Tablica = ThisWorkbook.Worksheets(1).Range("O4:O36").Value

    0
  • Pomocny post
    #6 08 Paź 2013 15:19
    marcinj12
    Poziom 40  

    Tak myślałem, gdyż moje makro jest napisane pod Excela. Nie znam składni SolidWorksa, więc tutaj nie pomogę - być może Twoja składnia była poprawna w tych linijkach.

    0
  • #7 08 Paź 2013 15:28
    Tomek456
    Poziom 9  

    Ale i tak dzięki:) A może jest jakiś łatwiejszy sposób na zadeklarowanie i przeszukiwanie tabeli w arkuszu w Excelu? Można pewnie zadeklarować w kodzie te liczby, tylko to byłoby chyba trochę zbyt proste jak na programistę, metodą prób i błędów próbuję, bo dopiero się uczę:)

    0
  • #8 08 Paź 2013 15:46
    marcinj12
    Poziom 40  

    Tomek456 napisał:
    A może jest jakiś łatwiejszy sposób na zadeklarowanie i przeszukiwanie tabeli w arkuszu w Excelu?
    Sposób wydaje się dobry - musisz tylko z jakoś "dobrać się" do tego arkusza z poziomu tego Solida. Tak naprawdę nie musiałbyś nawet deklarować tej tablicy, wystarczy przeszukać zakres bezpośrednio, coś w stylu:
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Oczywiście składnia z ThisWorkbook najwyraźniej nie zadziała, ale chodzi o samą ideę...

    0
  • Pomocny post
    #9 08 Paź 2013 17:34
    adamas_nt
    Moderator Programowanie

    Tomek456 napisał:
    Powstał błąd 1004 (Method 'This Workbook' of Object '_Global' failed) w linii:
    Tablica = ThisWorkbook.Worksheets(1).Range("O4:O36").Value
    Przerabialiśmy to już Link. Nie używaj zmiennej tablicowej, a "zwykłą" Variant.

    0
  • #10 08 Paź 2013 20:28
    Tomek456
    Poziom 9  

    Wiem przerabialiśmy, ale nadal nie działa tak jak powinno to makro, albo ja coś źle robię..

    0
  • Pomocny post
    #11 08 Paź 2013 21:16
    adamas_nt
    Moderator Programowanie

    Przeczytaj jeszcze raz (deklaracja zmiennej i odwołanie się do wektora):

    adamas_nt napisał:
    3. Nie przypiszesz zakresu do zmiennej tablicowej w ten sposób. Można Np tak
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Teraz, jeśli
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    to, owszem, zadeklarowałeś obiekt, ale co ze skoroszytem Excela? Musisz się do niego odwołać, jeśli otwarty w tej instancji
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Albo go najpierw otworzyć...

    Sprawdź sobie takim testem
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    i napisz co było w komunikatach

    0
  • #12 08 Paź 2013 21:51
    Tomek456
    Poziom 9  

    Wyskoczyło okienko SolidWorks z komunikatem Excel, żeby kliknąć ok, czyli MsgBox.
    Na spokojnie sobie to przeanalizuję, pewnie teraz jeszcze jest źle, ale czy ta pętelka będzie wyglądała następująco?:

    For i = 4 To UBound(Tablica)

    If WymZloz = Tablica(i, 36) Then
    knyps = True
    Exit For
    End If
    Next

    0
  • Pomocny post
    #13 08 Paź 2013 22:11
    adamas_nt
    Moderator Programowanie

    Nieee, jest napisane wyraźnie: If WymZloz = Tablica(i, 1) Then
    To jest (postawiona do pionu) tablica jednokolumnowa przecież...

    0
  • #14 12 Paź 2013 21:34
    Tomek456
    Poziom 9  

    Witam, po kilku dniach przerwy, troszkę zmodyfikowałem kod. Problem był tego rodzaju, że makro nie widziało tej tabeli, którą miało przeszukiwać. Z poziomu SolidWorks otwieram jako obiekt arkusz Excel, mam dostęp do przeszukiwanego zakresu, ale źle ustalam jeszcze kolumnę, zainteresowane osoby w tym temacie pewnie znają odpowiedź. Makro na dziś dzień wygląda następująco:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #15 13 Paź 2013 10:40
    marcinj12
    Poziom 40  

    Porównaj:

    Tomek456 napisał:
    For i = 15 To UBound(Tablica)
    If WymZloz = Tablica(i, 1) Then
    knyps = True
    End If
    Exit For
    Next

    z:
    marcinj12 napisał:
    For i = 1 To UBound(Tablica)
    If WymZloz = Tablica(i, 1) Then
    knyps = True
    Exit For
    End If
    Next

    0
  • #16 13 Paź 2013 11:12
    Tomek456
    Poziom 9  

    Wiem i ja to rozumiem, jest to mój błąd, makro przeszukuje tablicę od pierwszego jej elementu do ostatniego, 15 wpisałem celowo, by zaznaczyć, że jest to numer kolumny, kolumnę O można równie dobrze zapisać jako kolumnę z numerem 15. Kiedy zacząłem stosować oznaczenia x,y jeśli chodzi o arkusz Excel, to makro dopiero wtedy zaczęło widzieć ten zakres Range(Cells(4,15),Cells(36,15)). Tylko zastanawiam się jeszcze nad tą małą pętlą For, coś tam musi być jeszcze nie tak, może gdybym zapisał Tablica(i,15), to wtedy by już zadziałało, bo tak jak mówię już poprawnie otwiera mi arkusz, widzi zakres, ale jeszcze po najechaniu chociażby na i=1 program wyświetla i=Empty naprzykład..

    0
  • #17 13 Paź 2013 11:47
    marcinj12
    Poziom 40  

    Chodziło mi o Exit For umieszczone ZA if'em - w takim wypadku Twoja pętla wykona się zawszy tylko jeden raz, bez względu na warunek wewnątrz...

    0
  • #18 13 Paź 2013 11:49
    Tomek456
    Poziom 9  

    No wiem, już dzięki, już poprawiłem, ale jeszcze czegoś brakuje, no nic mimo wszystko dzięki za poświęcony czas i pomoc:)

    0
  • Pomocny post
    #19 13 Paź 2013 14:12
    czeles
    Poziom 15  

    W deklaracjach robisz błąd:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    i to wywołuje błąd 13 "type mismatch".
    Powinno być:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #20 13 Paź 2013 18:28
    Tomek456
    Poziom 9  

    No ok, poprawiłem, lecz to niestety nie jedyny błąd. Głównie chodzi mi o to by poprawnie wyszukiwał ten zakres, a na ten moment jeszcze go dokładnie nie znajduje, a makro nie widząc zakresu nie może przeszukać go.

    0
  • #21 13 Paź 2013 18:46
    marcinj12
    Poziom 40  

    Bo to:

    Tomek456 napisał:
    Tablica = XlApp.Worksheets(1).Range(Cells(4, 15), Cells(36, 15)).Select

    wcale nie przypisuje do zmiennej Tablica zakresu. Wyrzuć stamtąd Select.

    0
  • #22 13 Paź 2013 18:52
    Tomek456
    Poziom 9  

    No to w takim razie może warto byłoby jeszcze zdefiniować Range jako Variant, dobrze myślę?
    Select wyrzuciłem:)

    0
  • #23 13 Paź 2013 19:33
    marcinj12
    Poziom 40  

    Tomek456 napisał:
    No to w takim razie może warto byłoby jeszcze zdefiniować Range jako Variant, dobrze myślę?
    Jeśli mówisz o zmiennej Tablica, i nie Range jako Variant, tylko Variant jako Range - to odpowiedź brzmi NIE. Zmienną typu Range inaczej się ustawia (Set zmienna = Range(...)) i inaczej po niej iteruje.

    0
  • #24 13 Paź 2013 19:40
    Tomek456
    Poziom 9  

    Ale czy w moim przypadku mogłoby to poskutkować?

    0
  • #25 15 Paź 2013 20:44
    Tomek456
    Poziom 9  

    Wielkie wrazy szacunku i podziękowania za duże chęci i poświęcony czas, przede wszystkim dla dwóch użytkowników:
    adamas_nt
    marcinj12
    Mam nadzieję, że podziękowania zostaną odczytane:)
    Makro poprawiłem, działa, także temat uważam w końcu za zamknięty:-)

    0