< návrat zpět

MS Excel


Téma: Null v podmínce VBA rss

Zaslal/a 15.4.2010 9:38

Ahoj,
dělám tu jedno makro a dostal jsem se k jistému problému a nevím kudy z něj 3
Mám proceduru kde volám tento dotaz:
Application.WorksheetFunction.Match(Cells(4, 16), Stredisko, 0)

S tím, že proměná "Stredisko" je typu Range a má odkaz na oblast buněk s údaji. Vše funguje naprosto parádně až do chvíle, kdy hledaná hodnota v oblasti "Stredisko" není. Je sice správně zadaná na počet míst, ale neexistuje.

Snažil jsem se přijít nějak na to, jak tam dát jednoudchou podmínku If..Then..Else, ale nevím co porovnávat, pač volaná metoda vždy hodí chybu, že hodnotu nemůže najít. Někde jsem se dočetl, že by se to mohlo řešit snad dotazem na "Null", ale tam má zkušenost s VBA zatím nesehá. Můžete někdo poradit nějaký dotaz, kterým bych se VBA zeptal, zda funkce Match proběhla a vrátí hodnotu, než hodí VBA chybu, že tuto operaci nelzé provést?

Děkuji moc

Zaslat odpověď >

Strana:  1 2   další »
icon #001467
Poki
Jestli to dobre chapu, tak hledana hodnota neni v zadane oblasti - pak lze použít napr. toto:

On Error Resume Next
promenna = Application.WorksheetFunction.Match(Cells(4, 16), Stredisko, 0)
If Err.Number = 1004 Then
MsgBox "Chyba - hledaná hodnota se v oblasti nenachází"
exit sub
end if
citovat
#001468
avatar
Paráda, funguje to naprosto přesně tak jak má.
Mohu ještě poprosit o vysvětlení toho zápisu:

On Error Resume Next

Z jakého důvodu se tam toto musí dopsat a jakou funkci to plní?
Děkuji za objasnění 6citovat
icon #001469
Poki
On error resume next pouze zamezi tomu, aby se beh makra ukoncil pri chybe - 'při chybě pokračuj na další řádek'.
Na tom dalším řádku (podminka If) se pak provede test čísla chyby...
Pokud chyba nenastane, makro pokracuje vesele dal :)citovat
#001470
avatar
Ah, vyborně další vychytávka objasněna a zapsána do chytrého sešitu 6
Když jsme tak u toho vysvětlování, můžu poprosit o vysvtlení tohoto?

Private Sub Worksheet_Change(ByVal Target As Range)

Použil jsi to v radě pro spuštění makra na základě změny buňky, ale jsem z toho nějakej zmatenej 3

Mám to dokonce i v jednom makru od tebe, které jsi mu tu poradil, ale nikde v tom nevidím nic, co by tu procedůru dělalo procedůrou když Worksheet_Change je jenom název a parametr je definice nějaké proměné, kterou už pak nikde nedefinuju nebo tam nepřiřazuju nějakej odkaz. Děkuju za vystělní pro začátečníka 4citovat
icon #001471
Poki
Tohle je udalostni procedura listu - je implementovana ve VBA.
Spusti se vzdy, kdyz dojde ke zmene v nejake bunce na konkretnim listu, kde se procedura nachazi.
Target je potom bunka, kde doslo ke zmene.

Tahle procedura (stejne jako ostatni udalostni procedury listu nebo nebo sesitu) muze byt vzdy jen JEDNA (na tom konkretnim listu nebo sesitu).

Nic se tam nenastavuje, protoze vse je definovano primo ve VBA.citovat
#001472
avatar
Hmm Hmm, potom tedy poslední dotaz, jak VBA pozná, které makro má spustit a při jaké změny buňky? To mi nějak nejde pořád logicky dohlavy 3 Pač když tam těch maker mám víc, nebudou se spoustět všechny vždy, když nějaká buňka bude změněna?citovat
icon #001473
Poki
No, tady ta '_Change' procedura musi byt umistena v modulu konkr. listu a VBA vi, ze kdyz tam je, tak pri KAZDY zmene JAKYKOLIV bunky (nebo oblasti) ji musi provest!
VBA nespusti pri zmene bunky vsechny makra - vzdy jen Private Sub Worksheet_Change(ByVal Target As Range).

Pouziva se to, kdyz chces treba spustit makro v pripade, ze se zmeni napr. bunka A1 - pak v te procedure napises:
if target.address = "$A$1" then msgbox "zpráva"
Pokud se tedy stane zmena v jine bunce nez A1, tak se zdanlive nestane nic, ale VBA overi podminku Ifcitovat
#001474
avatar
Takže pro jednoduché ujasnění.
Pokud si do moduluu napíšu tuto proceduru Worksheet_change, tak pro celý list platí, že to co bude v procdůře zapsané se provede napři:

Private Sub Worksheet_Change(ByVal Target As Range)
Range("P4") = 1
If Cells(1, 1) < 10 then
Cells(2, 2) = 8
Else
Cells(2, 2) = 5
End If
End sub

Pokud to tedy takto napíšu, tak při každé změně, kterékoliv bunky proběhne to, že do P4 se napíše 1 a dle podmínky do bunky B2 bude 8 nebo 5?, ale ostatní makra mimo procedůru Worksheet_Change se nebudou provádět na změnu? Nebo je to tak, že všechny procedůry Private se budou provádět vždy na nějakou změnu? 7

Promin, zda moc otravuju, ale moc by mi to pomohlo při pochopení logiky VBA, tak se ptám 1citovat
icon #001475
Poki
Presne tak, pri kazde zmene na tom konrektnim listu bude P4 = 1 a B2 = 5 nebo 8.

Ostatni makra nebudou spustena.
Predstav si tyhle udalostni procedury treba tak, ze jsou prirazeny tlacitku, ktery se automaticky spusti vzdy, kdyz nastane udalost, kterou postihuji.

Vzdy ale bude provedena jen ta konkretni procedura.
Samozrejme do ni muzes vlozit spusteni jineho makra, prikazem Call Nazev_makracitovat
#001476
avatar
Super, v tom případě jsi mi zase pomohl a jdu si s tím pohrát. Mám však ještě jeden dotaz na toto téma 7

Kdysi jsi mi poradil toto makro:

Private Sub Worksheet_Calculate()
ThisWorkbook.Names.Add "Stredisko", "=Seznam!$A$" & Range("W8") & ":$N$" & Range("W9")
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Procedura Worksheet_calculate() se však provadí vždy na změnu nějaké buňky i když není volaná v procedůře Worksheet_Change a nevím ted tedy proč 3citovat

Strana:  1 2   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