Chcę znaleźć pozycję ostatniej cyfry w ciągu tekstowym i używam tego wzoru, aby to zrobić;
MAX (JEŻELI (ISERROR (ZNAJDŹ ({1; 2; 3; 4; 5; 6; 7; 8; 9; 0}, A1)), "", ZNAJDŹ ({1; 2; 3; 4; 5; 6; 7; 8; 9; 0}, A1))
Jednak to nie działa, jeśli zawiera ciągpowtarzanie liczb. Na przykład, gdy ciąg znaków to "10ABC2010ABC", zwróci 7 zamiast 9. Kiedy łańcuch ma wartość "10ABC2131ABN", zwraca 8 zamiast 9.
Jakieś pomysły, co się dzieje?
Odpowiedzi:
5 dla odpowiedzi № 1Oto działająca formuła:
=MAX(IF(ISNUMBER(VALUE(MID(A1,ROW(INDIRECT("1:" & LEN(A1))),1))),ROW(INDIRECT("1:" & LEN(A1)))))
naciśnij CTRL+PRZESUNIĘCIE+WCHODZIĆ żeby to ocenić.
Wyjaśnienie:
ROW(INDIRECT("1:" & LEN(A1)))
zwraca tablicę{1,2,3,...,Len(A1)}
- używając tej tablicy możemy wziąć każdą postać
A1
komórka:MID(A1,ROW(INDIRECT("1:" & LEN(A1))),1)
- za pomocą
VALUE(...)
staramy się przekonwertować każdy znak na liczbę. Powraca#VALUE!
błąd dla wszystkich postaci z wyjątkiem 1,2,3,4,5,6,7,8,9,0 - za pomocą
ISNUMBER(...)
sprawdzamy, czyVALUE(..)
zwraca liczbę lub błąd, a jeśli zwraca numer, zapamiętujemy jego pozycję. - ostatni krok - użycie
Max(..)
znajdujemy ostatnią pozycję o charakterze numerycznym
3 dla odpowiedzi № 2
FIND
tylko znajduje pozycję pierwsza instancja każdego numeru, więc nie będzie działać zgodnie z Twoimi wymaganiami. Spróbuj użyć tej formuły
=MAX(IFERROR(FIND({1,2,3,4,5,6,7,8,9,0},A1,ROW(INDIRECT("1:"&LEN(A1)))),0))
potwierdzone przy pomocy CTRL+PRZESUNIĘCIE+WCHODZIĆ
To również wykorzystuje FIND
ale ROW(INDIRECT
część rozpoczyna wyszukiwanie dalej wzdłuż ciągu znaków przy każdej okazji. Jeśli w A1 nie ma cyfr, w wyniku otrzymuje się zero (w razie potrzeby można popełnić błąd)
Inną możliwością, jeśli korzystasz z programu Excel 2010 lub nowszego, jest użycie funkcji AGREGATUJ w następujący sposób: [untested]
=AGGREGATE(14,6,FIND({1,2,3,4,5,6,7,8,9,0},A1,ROW(INDIRECT("1:"&LEN(A1)))),1)
To nie wymaga "wpisu tablicy"
Widzieć tutaj dla przykładowego skoroszytu z sugerowanymi formułami
2 dla odpowiedzi nr 3
A ta formuła tablicowa też będzie działała ... ok, ok ... Wiem, że używa przesunięcia :)
=1+LEN(A1)-MATCH(1;ISNUMBER(LEFT(RIGHT(A1;ROW(OFFSET(A1;0;0;LEN(A1);1))))*1)*1;0)