VBA - inverzní funkce k funkci CHAR

Od: Datum: 26.02.13 16:24 odpovědí: 4 změna: 27.02.13 19:12
avatar

Dobrý den.

Mám problém se cvičenými opičáky. *bum*Potřebuji je přinutit, aby do zadání přes text box ve formuláři VBA vkládali pouze a jedině písmena. K tomu potřebuji kontrolní funkci.

V čistém Excelu se tato funkce dala napsat například takto

=IF(CODE(A1)<65,FALSE,TRUE)

=IF(CODE(A1)>122,FALSE,TRUE)

Ve VBA funkce CODE chybí. Nevíte někdo, čím se nahrazuje? Funkce Isnumeric nestačí.

Děkuji předem

doplněno 27.02.13 13:55:

Dobrý den, díky za odpovědi, ale bohužel ani jedna není použitelná. A promiňte. Měl jsem si s otázkou dát trochu víc práce.

Jedná se o toto

Potřebuji bool funkci, která vyhodnotí krátký textový string a vrátí TRUE, FALSE.

funkce vrátí TRUE, když :

1/ je string složený z jednoho nebo dvou znaků

2/ když znak nebo znaky jsou písmeno, např A, B, W, AB, PX, d atd

3/ když jsou znaky dva a nejsou stejné, např AA nebo BB

S malými a velkými písmeny není problém, ještě před vstupem do této funkce se písmena převedou na velká, takže malá písmena se do funkce vůbec nedostanou

Otázka zní takto : Jak vyloučit ostatní textové znaky, aniž bych je musel všechny vyjmenovávat?

Když do té funkce vložíte například _A nebo %B nebo ...&, pak vrací TRUE a to je špatně.

díky za trpělivost, dole přikládám kod a jeho obrázek.

*

Private Function CheckPartnumera(str As String) As Boolean
If Len(str) = 1 Then
If str = " " Or str = "..." Then 'pozor na tvrdou mezeru nebo vypustek a podobne. SPRAVIT!
CheckPartnumera = False
ElseIf IsNumeric(str) = True Then
CheckPartnumera = False
Else
CheckPartnumera = True
End If
ElseIf Len(str) = 2 Then
If Left(str, 1) = Right(str, 1) Then
CheckPartnumera = False
ElseIf IsNumeric(Left(str, 1)) = True Or IsNumeric(Right(str, 1)) = True Then
CheckPartnumera = False
ElseIf Left(str, 1) = " " Or Left(str, 1) = "..." Then 'SPRAVIT!
CheckPartnumera = False
ElseIf Right(str, 1) = " " Or Right(str, 1) = "..." Then 'SPRAVIT!
CheckPartnumera = False
Else
CheckPartnumera = True
End If
Else 'delka stringu partnumera je 0 nebo nad 2 znaky
CheckPartnumera = False
End If
End Function

doplněno 28.02.13 09:03:

************************

Dík dávám bodíky za snahu o pomoc, ale nakonec jsem musel udělat to, čemu jsem se chtěl od začátku vyhnout. Ta funkce se bude muset vyhodnocovat přes excelovskou buňku a tady je vzorec. *klik*

=IF(LEN(B44)=1,IF(AND(CODE(B44)>64,CODE(B44)<91),TRUE, FALSE),IF(LEN(B44)=2,(IF(LEFT(B44,1)=RIGHT(B44,1),FALSE,(IF(OR((IF(AND(CODE(LEFT(B44,1))>64,CODE(LEFT(B44,1))<91),TRUE,FALSE))=FALSE,(IF(AND(CODE(RIGHT(B44,1))>64,CODE(RIGHT(B44,1))<91),TRUE,FALSE))=FALSE),FALSE,TRUE)),FALSE))



Seznam odpovědí:
 
moment čekejte prosím, probíhá přenos dat...
Zobrazení struktury odpovědí v otázce
Skrytí struktury odpovědí v otázce
Zobrazení struktury odpovědí v otázce

 

Odpovědi na otázku:
Od: jirbar*
Datum: 26.02.13 17:20

Otázka je zda testovat každý vstupní znak či až celý textový řetězec. Já se klaním k celému řetězci.

1/ Zjistit délku řetězce funkce Len

2/ Vytvořit cyklus od 1 do Len

3/ Funkcí Mid vypreparovat jeden znak z řetězce, to jest pozice dle cyklu a délka 1

4/ Znak otestovat funkcí Asc zda Ascii kód spadá do intervalu 65 až 122

5/ Funkcí IIf se rozhodnout. Popřípadě ukončit cyklus a přes While, či Repeat (záleží na podmínce) opakovat datový vstup

http://office.microsoft.com/c…p/funkce-iif-HA001228853.aspx

Ohodnoceno: 2x
 
Datum: 26.02.13 18:57
avatar

Stále tu nemám nainstalované officy, abych to vyzkoušel; ale, jestli jde jen o oříznutí vstupu:

V tom okně, kam se píše kód, by někde v Tools - > References měla být i knihovna MS VBscript Regular Expressions nebo nějak podobně. Pak se dá přímo ve VBA kódu vytvořit objekt "VBscript.regexp", takže přijmete jakýkoli vstup, regulárním výrazem vyberete jen to, co je povoleno, dostanete nějakou kolekci, obsahující shody, tu join-nete a je hotovo.

doplněno 26.02.13 21:28:

Jestli tam je něco takového, tak asi není co řešit.

Ohodnoceno: 3x
 
Od: jirbar*
Datum: 26.02.13 19:39

Pravda je, že přes masku pole formuláře by to mohlo jít taky

doplněno 26.02.13 19:46:

Maska "L" uživatel musí zadat písmeno

Ohodnoceno: 0x
 
Datum: 27.02.13 19:12
avatar

K upřesnění: nepáral bych se s ničím extra, vzal bych na to ty regulární výrazy. Mělo by fungovat tohle: ^([A-Z])(?!1)[A-Z]$

Předpokládám ovšem, že se to tu v editoru nechutně rozhodí, takže rovnou i odkaz na online tester, kde to uvidíte v akci: http://regexr.com?33ufr

Ohodnoceno: 1x
 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz

 
Copyright © 2004-2016 Poradna Poradte.cz. Všechna práva na poradně Poradte.cz vyhrazena.