[Excel] Przyporządkowanie liczb do zbiorów

Witam! Szukam funkcji, która wykona poniższe działanie:

1-4 -> A

5-10 -> B

11-15 -> C

.

.

.

Wpisuję w komórkę X liczbę 2, a w komórce Y ma pojawić się A.

Próbowałem to zrobić najprostszą funkcją, jaka mi przyszła do głowy JEŻELI(ORAZ(;;);), ale Excel ma limit 30 bodajże wyrażeń logicznych, więc się to nie nadaje.

Tu masz przykład:

http://www.sigreg.pl/pub/FunZbior.xls

Możesz użyć do tego celu makro. Poniżej załączam fragment kodu:

Public Function GetLetterFromNumber(number As Integer)

Dim result As String


If number < 1 Then

    result = ""

ElseIf number <= 4 Then

    result = "A"

ElseIf number <= 10 Then

    result = "B"

ElseIf number <= 15 Then

    result = "C"

' itd.

End If


GetLetterFromNumber = result

End Function

W komórce Excela będziesz to wywoływał jak każdą inną predefiniowaną funkcję czyli np. =GetLetterFromNumber(A1) Ten kod musisz dokończyć, tzn. ręcznie podopisywać resztę warunków. EDIT: Jest też druga wersja kodu.

Public Function GetLetterFromNumber(number As Integer)

Dim result As String

Dim letters As Variant

Dim i, j As Integer


letters = Split("A B C D E F G H I J K L M N O P R S T U W Y Z", " ")

result = ""


If number < 1 Then


ElseIf number <= 4 Then

    result = letters(0)

ElseIf number <= 10 Then

    result = letters(1)

Else

    j = 16

    For i = 2 To UBound(letters)

        If number < j Then

            result = letters(i)

            Exit For

        Else

            j = j + 5

        End If

    Next

End If


GetLetterFromNumber = result

End Function

Zadziała pod warunkiem, że przedziały począwszy od liczby 11 tworzone są w następujący sposób:

11 - 15

16 - 20

21 - 25

26 - 30

itd.

Tą listę z literami “A B C D E F G H I J K L M N O P R S T U W Y Z” możesz sobie zmienić na taką jaką potrzebujesz. Jedyne o czym musisz pamiętać to żeby oddzielać kolejne litery spacją.

Możesz zrobić na piechotę, w arkuszu obok dać tabelkę

1 A

2 A

3 A

4 A

5 B

6 B

7 B

8 B

9 B

10 B

11 C

12 C

13 C

14 C

15 C

16 D

17 D

i następnie w podanej komórce formułę np. wyszukaj.pionowo

Dziękuję bardzo za pomoc :wink: Skorzystam raczej z kodu gregorsi , bo jest najkrótszy.

Marcin511 , taaak, tworzyć tabelkę, w której mam 15000000 wierszy ? :stuck_out_tongue:

A pomocnicze pytanie brzmi - jak odwołać się w makrze do określonej komórki arkusza ?

Chcę wstawiać liczby dynamicznie, czyli zamiast pisać

ElseIf liczba <= 10 Then

    wynik = "B"

chciałbym używać coś w rodzaju

ElseIf liczba <= (komórka A1) Then

    wynik = (komórka A30)

EDIT: Zrobiłem takie coś, ale nie wiem czy dobrze

ElseIf liczba <= ActiveSheet.Range("a1") Then

    wynik = ActiveSheet.Range("a30")

A1:B5 - tabliczka:

-1e100 za mało

     1 A

     5 B

    11 C

    16 za dużo

E1 - liczba

Dowolna komórka - =WYSZUKAJ.PIONOWO(E1;$A$1:$B$5;2)

poniżej 1 – wypisze “za mało”

1-4.99999 – wypisze A

5-10.9999 – wypisze B

11-15.99999 – wypisze C

16 i wyżej wypisze “za dużo”

Oczywiście możesz to zapisać bez tabliczki:

=WYSZUKAJ.PIONOWO(E1;{-1E+100;“za mało”\1;“A”\5;“B”\11;“C”\16;“za dużo”};2)

W porządku na chwilę obecną uzyskałem to, co zamierzałem.

Teraz zastanawia mnie co zrobić, aby Excel nie traktował pustych komórek jako 0, np. taka funkcja

JEŻELI(komórka=0;OK;NO) wszędzie, gdzie jest pusta komórka wstawi mi wartość OK, a chciałbym, aby nic nie było w takim przypadku zwracane.

Jak sobie z tym poradzić ?

=JEŻELI(ORAZ(ILE.NIEPUSTYCH(komorka)=1;komorka=0);"OK";"NO")

Ekstra, dziękuję Ci raz jeszcze :smiley:

A czy istnieje odpowiednik takiej funkcji w VB ?

If Not IsEmpty(Range("A1").Value) And Range("A1").Value = 0 Then

    Range("A2").Value = "OK"

Else

    Range("A2").Value = "NO"

End If

Nie ma za co.

Już prawie mam to, co chciałem. Gdybyś jeszcze mógł mi powiedzieć, jak zrobić z tego funkcję, tak aby działała dynamicznie na parametrach, a nie określonych komórkach arkusza.

Poniżej stworzyłem sobie taką funkcyjkę, w której nie wiem jednak jak zastąpić wartość A1 parametrem. Funkcja ta działa, ale tylko dla komórki A1.

Public Function wyrok(liczba As Long) As String

If Not IsEmpty(Range("A1").Value) And liczba = 0 Then

    wyrok = "ok"

End If

End Function

Rozumiem. W takiej sytuacji chyba lepiej jest przerobić ten kod i użyć czegoś takiego:

Public Function wyrok(s As String) As String

If IsNumeric(s) And Val(s) = 0 Then wyrok = "ok"

End Function

Może lepiej:

Public Function wyrok(R As Range) As String

    If Not IsEmpty(R.Value) And R.Value = 0 Then

        wyrok = "OK"

    Else

        wyrok = "NO"

    End If

End Function

Poza tym jak zrobisz tak jak zaproponowałem w poprzednim poście to nie będziesz potrzebować tej funkcji.