Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

EXCEL VBA - Odwołanie do komórki

steelek56 10 Lut 2016 11:19 732 4
  • #1 10 Lut 2016 11:19
    steelek56
    Poziom 12  

    Witam,

    Mam problem z pewnym kodem. Wciąż popełniam podstawowe błędy więc podejrzewam że to jakiś szczegół.

    Chodzi o to ze w pętli while mam dodać w 3 przejsciu formułe wyszukaj.pionowo do komórki. Z tym, że formuła musi mieć odniesienie warunkowe (jeżeli while uruchamiana jest w komórce E4, to chcę aby wyszukaj.pionowo odnosiło się do komórki E1, jeżeli np G7 to odwołanie do G4 (zawsze ten sam wiersz, 3 kolumny w lewo).

    Napisałem więc coś takiego.

    Code:
    Dim czas As String
    
    Dim kol As Range
    kol = Range(Rows.Count, Columns.Count - 3)
    czas = "WYSZUKAJ.PIONOWO(" & kol & ";Arkusz2!A:C;3;FAŁSZ)"


    I potem w pętli while próbuje to wywołać czymś takim

    Code:
    If nz = 3 Then czas


    Problem lezy gdzieś w zmiennej komórce jakbym tego Range nie zapisał (z kropką, z Cells itp) to wciąż wywala jakieś błędy.

    Jest mi ktoś w stanie podpowiedzieć co robię źle?

    Z góry dzięki za pomoc.

  • #2 10 Lut 2016 13:15
    JRV
    Specjalista - VBA, Excel

    steelek56 napisał:
    kol = Range(Rows.Count, Columns.Count - 3)

    To ma byc komorka w dolnym prawym rogu wszystkiego arkuszu?
    steelek56 napisał:
    If nz = 3 Then czas

    W tej postaci 'czas' ma byc procedura (Sub czas())
    Poniewaz to zmienna (Dim ...) trzeba przypisac wartosc (czas = "cos")

    Dodano po 5 [minuty]:

    Rows.Count - to liczba wszyskich wierszy na arkusz
    Columns.Count - to samo kolumn
    Wtedy kol to komorka XFA1048576 lub IV65536 dla XL2003

    Dodano po 7 [minuty]:

    steelek56 napisał:
    co robię źle?

    Wyobraź sobie, że lekarz, który bez wiedzy na temat choroby próbuje ktorze leki mogą pomóc

    Dodano po 5 [minuty]:

    Lepiej zacząć nagrywanie makr i jego analiza, ja i teraz tak dzialam chociaż nie w pierwszym roku jestem

  • #3 11 Lut 2016 10:12
    steelek56
    Poziom 12  

    JRV napisał:
    Wyobraź sobie, że lekarz, który bez wiedzy na temat choroby próbuje ktorze leki mogą pomóc


    Tylko ja moimi próbami nikogo nie zabije... ewentualnie sam się rzucę pod pociąg jeżeli mimo usilnych prób nadal nie będe mógł wymyślić co robię źle. Ja na to mówie reverse engineering. Wole odpalić skomplikowane makro i debugować je krok po kroku próbując zrozumieć. Nagrywanie tu niewiele da bo zapytanie, które jest tu stawiane jest oparte na dość sporej ilości "If". Staram się coś sam czasem napisac i czasem wychodzi, a czasem nie. Ale wszystko idzie metodą prób i błędów. W międzyczasie robiłem kursy na codeacademy.org. I okazuje się że javascript, i inne jezyki programowania są z założenia podobne do VBA, ale nie takie same. Stąd moje próby zrozumienia czym się różni i VBA od takiego np javascriptu. Szkoda tylko że nie ma takiego kursu jak właśnie codeacademy dla VBA.

    Makro o które chodzi to to z którym kiedyś dawno temu mi pomogłeś. Próbuje je zaadaptować do pewnej koncepcji na którą wpadłem jakiś czas temu, i która ułatwiłaby mi znacznie życie.

    JRV napisał:
    To ma byc komorka w dolnym prawym rogu wszystkiego arkuszu?


    Nie, to ma być coś co przy nagrywaniu makro nazywa się odwołanie względne, komórka przesunięta od wynikowej o 3 kolumny w lewo. Czyli jezeli wynik ma trafić do komórki D1 to pierwszy argument WYSZUKAJ.PIONOWO ma być A1. W załączniku wrzuciłem o co mi chodzi. Można to zrobić w sposób jak ja to oznaczyłem (pierwszy wiersz ustawić formuły i autouzupełniać do końca), ale długość ciągów w danym wierszu jest rózna. Założenie jest takie, żeby autouzupełnić komórki ale tylko tam gdzie jest co wyszukiwać (komórki oznaczone na zielono). Podczas gdy pomijać komórki gdzie formuła zwróci #N/D (komórki białe).

    JRV napisał:
    Rows.Count - to liczba wszyskich wierszy na arkusz
    Columns.Count - to samo kolumn


    Ha! I tu się złapałem. Sądziłem że Rows.Count i Columns.Count zwraca to samo co formuła WIERSZ i NR.KOLUMNY. Ale teraz tak myślę, skoro reszta makra działa dobrze a ja chce tylko w trzecim przebiegu pętli while dodać tylko wklejenie formuły, to jeżeli wywołałbym

    Code:
    Dim czas As String
    
    czas = "WYSZUKAJ.PIONOWO(ZŁĄCZ.TEKSTY("W";WIERSZ(WK[-4]);"K";NR.KOLUMNY(WK[-4]));Arkusz2!A:C;3;FAŁSZ)"


    To przy założeniu, że przejde w excelu z adresowania standardowego na W1K1, powinno być ok. Ale przy standardowym odniesieniu nie zadziała. Mimo wszystko coś muszę gubić, bo po wrzuceniu czegoś takiego do makra dostaje dwa błędy "expected end of statement" i "syntax error".

  • #4 11 Lut 2016 11:16
    JRV
    Specjalista - VBA, Excel

    steelek56 napisał:
    Tylko ja moimi próbami nikogo nie zabije
    Bez uraz...

    steelek56 napisał:
    czas = "WYSZUKAJ.PIONOWO(ZŁĄCZ.TEKSTY("W";WIERSZ(WK[-4]);"K";NR.KOLUMNY(WK[-4]));Arkusz2!A:C;3;FAŁSZ)"

    W VBA nie tak, jak na arkuszu.
    pierwsze - nazwy funkcji tylko angelskie, np. WYSZUKAJ.PIONOWO tj VLookup
    (Jeśli zarejestrowal by makro podczas wprowadzenia formuły w arkuszu, a następnie w VBA widziałes by to w języku angielskim)
    drugie - separatory w funkcji nie ";" tylko ","
    trzeci - jest różnica, jeśli chcesz formuły w arkuszu lub wartość zmiennej
    dla funkcji w D1
    Code:
    range("D1").Formula = "=VLOOKUP(A1, Arkusz2!A:B, 2, 0)"

    dla zmiennej
    Code:
    czas = Application.WorksheetFunction.VLookup(Range("A1"), Sheets("Arkusz2").Range("A:B"), 2, 0)

  • #5 12 Lut 2016 11:13
    steelek56
    Poziom 12  

    Wiem ze VLOOKUP. Ale myślałem że jeżeli wstawię to jako string to używając zapisu angielskiego zwróci mi błąd w stylu #NAZWA

    Sprawdzę to wkrótce i dam znać co z tego wyszło.

    Dodano po 4 [godziny] 23 [minuty]:

    Ok, zapis funkcji bez żadnego wywoływania zmiennej itp jest ok. Jest tylko problem. Jak w zapisie

    Code:
    Range("D1").Formula = "=VLOOKUP(A1, Arkusz2!A:B,2,0)"


    Wstawić zamiast Komórki D1 tą do której ma formuła trafić. Jezeli wpisze tam cokolwiek innego to trafia do odpowiedniej kolumny i odpowiedniego wiersza. Skorzystałem z podpowiedzi o nagraniu makro. I wychodzi że trzeba to zapisać jako Offset(0,-4). Tylko jak odnieść się do komórki? Przeglądając krok po kroku co robi makro to jest ono tak zapisane że coś w stylu ActiveCell nie wchodzi w gre, bo podczas wykonywania kodu aktywna komórka to wciaz ta która była aktywna w momencie uruchomienia kodu. Więc nie ma punktu zaczepienia dla zastosowania offset.

    Nagrywanie makr opiera się głównie o ActiveCell. Więc niewiele tu tym sposobem wymyślę. Co z tym zrobić?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME