» Poradna » Programy

VBA v Excelu, chyba kompilace

Odpovědět  |  Zobrazit bez stromu  |  Upozornit redakci  |  nových odpovědí: 3/3
 |   |  Microsoft Windows 7 Firefox 21.0  |  [90.180.74.---]

V Excel tabulce mám dva sloupce. První obsahuje kód výrobku, např. "10.450" a do druhého chci doplnit jeho cenu, kterou najde VBA funkce "Hledej" v tabulce na druhém listu v sešitě, kam jsem načetl data v textovém tvaru z katalogu v PDF. Druhý list tedy obsahuje jeden sloupec s řádky s textem. VBA funkce hledej nejdříve prohledá celý list TXT a zjisti, zda tam najde kód výrobku, předaný funkci z prvního sloupce v prvním listu. Pokud ano, zavolá VBA funkce Hledej podprogram "Cena", kterému předá pozici nalezeného řádku v druhém listě TXT s daným kódem a začně od daného řádku hledat cenu pro daný kód výrobku. Ta ale nemusí být hned na stejném řádku s nalezeným kódem, ale může být dále i několik dalších řádku (mezi kódem výrobku a jeho cenou může být doprovodný text). Cena je vždy na jednom řádku ukončena v textu znaky ",-" a může být v následujích variantách: " 23,-" " 123,-" " 1 124,-" a " 12 345,-". Tj. v případě ceny větší než 1.000,- Kč je trojice číslic oddělena mezerou, a před začátkem vlastního číselného údaje ceny je také mezera. V textu ale může být i "...rozměry 125 m2 1 234,- nejlepší výrobek...".Nevím proč mi při spuštění funkce hlásí VBA chybu:Compile error:Expected Function or variablea podtrhne slovo "Cena" při volání tohoto podprogramu ve funkci Hledej.Program mám zatím jen v "pracovní fázi" a potřebuji ho odladit krokováním. To mi teď ale kvůli té chybě nejde. Vypadá to, že je nějaký problém s definicí proměnných nebo funkcí a podprogramem samotným. Ve VBA běžně neprogramuji.Global vArr As VariantPublic Function Hledej(kod As String) As StringDim j As LongDim Up As LongHledej = "Ne"vArr = Range("TXT!A1:A18160")Up = UBound(vArr)For j = LBound(vArr) To UBound(vArr)If InStr(vArr(j, 1), kod) ThenHledej = "Ano" & Cena(j, Up)If Hledej = "Ano" Then Exit ForEnd IfNext jEnd FunctionPublic Sub Cena(r As Long, Max As Long)Dim Cena As LongDim p As LongDim m As LongCena = 0For k = r To MaxIf InStr(vArr(k, 1), ",-") Thenp = InStr(vArr(k, 1), ",-") - 1m = InStr(Left(vArr(k, 1), Len(vArr(k, 1)) - p), " ")If Mid(vArr(k, 1), m - 2, "m2") ThenCena = Val(Mid(vArr(k, 1), m, Len(vArr(k, 1) - p)))If Cena > O Then Exit ForEnd IfIf IsNumeric(Mid(vArr(k, 1), m - 1, 1)) And Not IsNumeric(Mid(vArr(k, 1), m - 2, 1)) ThenCena = Val(Mid(vArr(k, 1), m - 1, Len(vArr(k, 1) - p)))End IfIf IsNumeric(Val(Mid(vArr(k, 1), m - 1))) And IsNumeric(Val(Mid(vArr(k, 1), m - 2))) And InStr(Mid(vArr(k, 1), m - 3), " ") ThenCena = Val(Mid(vArr(k, 1), m - 2, Len(vArr(k, 1) - p)))

Odpovědi na otázku

 |   |  Microsoft Windows 7 Firefox 21.0  |  [90.180.74.---]

Na konci programu se mi ještě schovalo:End IfEnd IfNext kEnd Sub

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Opera 9.80

To bude tim, ze mas CENA definovane jako proceduru, ktera nic nevraci a pouzivas ji jako funkci. Deklaruj ji jako funkci, ne jako SUB

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 21.0  |  [90.180.74.---]

Díky, už to běhá .

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: 10, Kompilace, Cena, Exit, Trojice



Určitě si přečtěte