Wpis z mikrobloga

Drogie Mireczki, prosiłbym o opinie o kodzie, pierwsza napisana funkcja :) [nie znam polskich nazw funkcji, więc wszystkie będą w języku angielskim ;) )
Praca wymaga ode mnie programowania(nie wiem czy to programowanie/kodowanie, czy VBA jest uznawany za kogos za jezyk programowania) w VBA.
Tworzymy makra dla naszych administratorów, dzięki którym pomaga to im w pracy ;)
Działa za zasadzie Index-Match, tylko w jednej funkcji.
Chciałem stworzyć funkcję jak Vlookup, gdzie można ustawiać minusowe wartości kolumn :) [offset]
Wymagane argumenty to: wartosc szukana, kolumna w ktorej sie znajduje ta wartosc i opcjonalnie liczba kolumn do przodu(liczba z plusem), do tyłu (z minusem). Teraz jak patrze na kod, moglbym dorzucić sprawdzanie kolumny, jeżeli wartość pierwsza jest odwołaniem do komórki. Pobawię się z tym później ;)

Chciałbym nauczyć się jak najwięcej, więc bądźcie srodzy ;)
#vba #programowanie #excel #funkcja
Pozdrawiam, kod poniżej.

Public NumberOfColumn As Integer, NOCAndOffset As Integer, ResultVariable
Function IndexMatch(WordValue, WordRange, Optional Offset = 0)
Application.ScreenUpdating = False
Application.Volatile

NumberOfColumn = WordRange.Column
NOCAndOffset = NumberOfColumn + Offset
MatchResult = Application.WorksheetFunction.Match(WordValue, Columns(NumberOfColumn))
If NOCAndOffset > 0 Then
ResultVariable = Application.WorksheetFunction.Index(Columns(NOCAndOffset), MatchResult)
IndexMatch = ResultVariable
Else
MsgBox "Column number is 0 or lower!"
IndexMatch = "Column number is 0 or lower!"
End If

Application.ScreenUpdating = True

End Function
  • 8
@snapszop: rozumiem, że ta funkcja miałaby być pomocna dla osób, które nie znają INDEX i MATCH? Problem w tym, że jak danych będzie dużo, to ta funkcja (Volatile) zabije kompletnie wydajność arkusza.
@brak_nicku: Tak jakby, bardziej bym powiedział że szybszy sposób na stworzenie połączenie obu funkcji.
Tak, masz rację, ale z tego co widziałem nie ma innej opcji, żeby arkusz odświeżał się płynnie przy bez volatile, ewentualnie przy zmianie na worksheecie.
A funkcja jest jako początek drogi, korzystam z niej sam w personalnym arkuszu na jakieś bardzo szybkie obliczenie. :)
I rozumiem, że ta funkcja jest bez sensu na większą skalę, ale do
bardziej bym powiedział że szybszy sposób na stworzenie połączenie obu funkcji


Nie bardzo widzę, gdzie to przyspieszenie - zamiast podać wektor wynikowy, trzeba liczyć offset. Poza tym zarówno vlookup, jak i podana przez Ciebie funkcja mają wadę - kiepsko to działa przy wypełnianiu w poziomie - trzeba ręcznie zmieniać offset. Często zamiast vlookup stosuję index/match - pozbawione tej wady, mimo że vlookup jest szybsza od index/match.

ale z tego co widziałem nie
@brak_nicku:

Nie bardzo widzę, gdzie to przyspieszenie - zamiast podać wektor wynikowy, trzeba liczyć offset.

hm, w vlookupie tez musisz liczyc offset, jakby nie patrzeć :)

Nie wiem też, czy jest to błąd, czy celowe działanie, ale funkcja zakłada, że przeszukiwany wektor jest sortowany rosnąco i stosuje wyszukiwanie przybliżone.

zauważyłem to i poprawiłem juz :) rzeczywiście, mój błąd :)

a gdzie jest przyspieszenie? hm, w sumie w pisaniu kodu :) tak
Chciałbym nauczyć się jak najwięcej, więc bądźcie srodzy ;)


No to czepiania dalsza część:
- zmienne powinny być zadeklarowane wewnątrz funkcji, a nie globalnie
- każdy moduł powinien bezwzględnie zaczynać się:

Option Explicit
- zmienna ResultVariable jest zadeklarowana niepotrzebnie, zamiast:

ResultVariable = Application.WorksheetFunction.Index(Columns(NOCAndOffset), MatchResult)
IndexMatch = ResultVariable

Powinno być:

IndexMatch = Application.WorksheetFunction.Index(Columns(NOCAndOffset), MatchResult)
- brak obsługi błędów

To na razie tyle:)
@snapszop:

Hm, miałbyś do polecenia jakiś kurs makro? :)


Nie korzystałem raczej z kursów/książek tylko szukałem stron pod konkretny problem

Ile czasu siedzisz w tym?


Z excelem pracuję naście lat, z różną intensywnością, przez pewien czas sporo robiłem w VBA excela, teraz od niedawna znowu VBA, ale inny program

Programujesz/kodujesz coś na codzień?(jakiś inny język?)


Tak, język w zależności od wymagań zmieniał się VB, C#, C++, delphi.