< návrat zpět

MS Excel


Téma: Pořadí ZPRAVA - znak TYP(1) rss

Zaslal/a 18.6.2015 15:57

AlfanDobrý den,
chtěl bych požádat o pomoc se zjištěním pořadí ZPRAVA první hodnoty TYP(1) v každé buňce.
Například:
3282011 A výsledek by měl být 3, protože první znak číslo zprava v dané buňce je "" a je třetí zprava, protože je tam mezera. To je má představa.
Děkuji

Příloha: rar25607_rok_wall.rar (35kB, staženo 33x)
Zaslat odpověď >

Strana:  1 2 3   další »
#025608
avatar
prípadne takto
Function PrveCisloZprava(text As String) As Variant
Dim i As Long, j As Long
PrveCisloZprava = "nenalezeno"
For i = Len(text) To 1 Step -1
j = Asc(Mid(text, i, 1))
If (j < 58) * (j > 47) > 0 Then PrveCisloZprava = Len(text) + 1 - i: Exit Function
Next i
End Function
Příloha: zip25608_prvecislozprava.zip (44kB, staženo 32x)
citovat
#025609
Alfan
Jj, děkuji, akorát bych chtěl požádat o doplnění.
Zjistil jsem, že některé kódy mají na druhém místě zprava buď "/" nebo "-". Jsou to řádky 2133, 2134 a 2229, 2230.
Protože my jde o letopočty, tak by se tam asi hodila kontrola, že pokud to najde pozici TYP(1), tak od této pozice doleva ověří, že první až čtvrtá pozice jsou také TYP(1). Pokud ano, zapíše nalezené pořadí, pokud ne, bude hledat další pozici a stejně ověřovat. Pokud by vůbec nenalezl, napíše "0" (nula).
Děkujicitovat
#025610
Opičák
vycházel jsem z toho co napsal Marjankaj - pokud jsem to správně pochopil :-)
Příloha: zip25610_prvecislozprava_x.zip (90kB, staženo 32x)
citovat
icon #025612
avatar
Pokus dostať to celé do jednej funkcie, bez pomocných stĺpcov. Snáď to bude fungovať, treba otestovať:Function Pozicia(Arg1 As String) As Byte
Dim i As Integer, j As Integer
Arg1 = StrReverse(Arg1)
Arg1 = Replace(Arg1, " ", "x")
For i = 1 To Len(Arg1)
On Error Resume Next
j = CInt(Mid(Arg1, i, 4))
On Error GoTo 0
If j > 0 Then
Pozicia = i
Exit For
End If
Next i
End Function
malo by si to poradiť i s reťazcom v nasledujúcom tvare:

007200 9 E

ale nedám ruku do ohňa za to, že je to 100% spoľahlivé, ber to len ako pokus a náznak možného riešenia.citovat
#025613
Alfan
@opičák
děkuji, už je to skoro dobré, ale...
Je tam asi "nekorektně" udělané kontrola:
když najde první číslo zprava, tak by mělo otestovat, jestli tato nalezená pozice (první) a následující další tři (doleva) jsou čísla TYP(1), pokud ano a zároveň ty čtyři znaky jsou číslo v intervalu od 1990 do 2100, tak je vypiš, pokud ne, jiná hláška (např. není rok).
Konkrétně to je na řádcích:
1122
1425 (tady by to mělo ten rok vypsat)
1530 (tady by to mělo ten rok vypsat)
1697 až 1699 (tady je chybně test, mělo by to vypsat 2013)
2291 (tady je také chybně test, mělo by to vypsat 2014)

a ještě maličkost, o které jsem nepsal.
Na řádku 1179 je například SPZ a následujících...
Pokud by šlo přidat ještě jednu "úvodní" kontrolu, že pokud je první nebo druhý nebo třetí znak ZLEVA TYP(2), tak, aby to rovnou napsalo "není rok".

@AL
Také děkuji, nicméně jsou tam nějaké "nekorektní" věci...
Není tam ta kontrola na čtyři znaky, jak jsem psal výše a proto to nefunguje dobře například na řádcích:
1531
1532
ale na řádku 1533 už ano...?
a také to bez té kontroly najde i čísla, která mají jen dva znaky a není tam letopočet. (rok)
A ty SPZ by mi taky pomohly...

Každopádně, pokud byste byli ochotní mi to dopracovat, moc by mi to pomohlo.

Děkujicitovat
icon #025614
avatar

Alfan napsal/a:


Není tam ta kontrola na čtyři znaky, jak jsem psal výše a proto to nefunguje dobře například na řádcích:
1531
1532
ale na řádku 1533 už ano...?


asi som menej chápavý, ale na uvedených riadkoch 1530-1534 vidím hodnoty, ku ktorým funkcia dáva výsledok:

396/2010 1
3962009/01 4
3962009/02 4
3962009-003 5
3962009 1

a ten je pmn správny, pletiem sa?

Alfan napsal/a:

a také to bez té kontroly najde i čísla, která mají jen dva znaky a není tam letopočet. (rok)
- nepriem sa, nehľadal som, ale mohol by si uviesť nejaký príklad?

Alfan napsal/a:


A ty SPZ by mi taky pomohly...
Toto v zadaní nebolo, neriešil som.citovat
#025615
Alfan
@AL
Ty řádky 1531 atd. jsem nějak popletl, asi jsem se překoukl, najde to korektně, omlouvám se za dezinformaci 7

nepriem sa, nehľadal som, ale mohol by si uviesť nejaký príklad?
Jde mi to, aby ta rutina, když najde první číslo zprava, tak by měla ještě otestovat, jestli tato nalezená pozice (první) a následující další tři (doleva) jsou čísla TYP(1).
Pokud ano a zároveň ty čtyři znaky jsou číslo v intervalu od 1990 do 2100, tak je vypiš, pokud ne, jiná hláška (např. není rok).
Příklad:

396/2010 1
3962009/01 4
3962009/02 4
3962009-003 5
952010 1
0952011E 2

V těchto případech by se rok vypsal, neboť od nalezené pozice i další tři znaky doleva jsou TYP(1) a navíc jsou v intervalu od 1990 do 2100.

Naopak tady, by se měla vypsat chyba:

9999 1
9889 1
9999 1
48 1
114 1


A jako první by byla ideální kontrola SPZ, které nepotřebuji, ale zapomněl jsem to původně napsat.
Na řádku 1179 je například SPZ a následujících...
Pokud by šlo přidat ještě jednu "úvodní" kontrolu, že pokud je první nebo druhý nebo třetí znak ZLEVA TYP(2), tak, aby to rovnou napsalo "není rok".


Zatím děkujicitovat
icon #025618
avatar
No, ja už to riešiť ďalej nebudem, páč musím robiť niečo iné. Každopádne, v pôvodnom zadaní nepadla z Tvojej strany zmienka o tom, že rok má byť v intervale 1990-2100. Bez uvedenej podmienky je pre mňa číslo 48 rokom, rovnako i číslo 9999 môže byť rokom. Pokiaľ by mala platiť pôvodná podmienka 4 čísel, tak rokom môže byť všetko v tvare od 0001 do 9999. Chce to byť konkrétnejší a hlavne presnejší pri definovaní zadania, hra Hádej, na co myslím, ma nebaví, zo žiadosti typu: "...a nešlo by ešte toto nejak", mám väčšinou divný pocit, sorry.citovat
#025623
elninoslov
Vyskúšajte toto:
Function GETYEAR(T As String) As Variant
Dim i As Byte, Y As Variant
GETYEAR = vbNullString
If Len(T) >= 4 Then
For i = 0 To Len(T) - 4
Y = Mid(T, Len(T) - 4 - i + 1, 4)
If IsNumeric(Y) And Y > 1900 And Y < 2100 Then GETYEAR = Y: Exit Function
Next i
End If
End Function
citovat
#025631
Alfan
@elninoslov
Super, děkuji, takhle to funguje.
Jen jsem ještě dodělal kontrolu na nové číslování zakázek a zmenšil jsem interval na 1990 do 2100, protože mi tam u auta 1AN 1901 hlásilo rok 1901 ale tím jsem už nechtěl otravovat.
Nebo se mi všechna auta do budoucna, objeví, jako letopočty, pokud se vejdou do intervalu 1990 - 2100?
Já, ale vím, že pokud je to auto, tak má v prvních třech znacích zleva vždycky alespoň jedno písmeno.
Jedině to zkusím ještě upravit v úvodu toho mého vzorce, tuhle kontrolu, že první tři zleva nesmí být TYP(2).

Takže mám ten vzorec takto:
=KDYŽ(TYP(A2)=2;KDYŽ(GETYEAR(A2)="";"NENÍ ROK";GETYEAR(A2));KDYŽ(A(HODNOTA(ČÁST(A2;1;9))>=150001011;HODNOTA(ČÁST(A2;1;9))<=159999999);20&ČÁST(A2;1;2);KDYŽ(GETYEAR(A2)="";"NENÍ ROK";GETYEAR(A2))))

Ještě jednou děkujicitovat

Strana:  1 2 3   další »

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje