< návrat zpět
MS Excel
Téma: VB v Excel Standard a Excel profesional
Zaslal/a Standa-B 1.4.2015 13:16
Mám problém ve zpracování jedné instrukce Visual Basic, která funguje v EXCEL 2003, 2007 a 2010-profesional. V EXCEL 2010-Standard se VB na této instrukci zastaví s hlášením "Run time error '5': invalid procedure call or argument".
Instrukce vytváří jednoduchý podmíněný formát, kdy podle výrazu "km" v jedné buňce v řádku se jiná buňka stejného zvýrazní tučně a čeveně. Tato instrukce má tvar
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= "=ZPRAVA(r2;2)=""km"""
a je součásti jednouché programové sekvence
Range("q2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ZPRAVA(r2;2)=""km"""
With Selection.FormatConditions(1).Font
.Bold = True
.Italic = False
.ColorIndex = 3
End With
Pro EXCEL 2010 Standard jsem zkusil tento podmíněný formát přeskočit vložením instrukce
On Error GoTo EXCEL2010Standard
Takže uvedená sekvence měla tvar
Range("q2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.FormatConditions.Delete
On Error GoTo EXCEL2010Standard
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ZPRAVA(r2;2)=""km"""
With Selection.FormatConditions(1).Font
.Bold = True
.Italic = False
.ColorIndex = 3
End With
EXCEL2010Standard:
Toto přeskočení se neuplatní u EXCEL 2003, 2007 ani u EXCEL 2010 profesional a podmíněný formát se provede. Pokud u těchto třech Excelů umyslně udělám ve vzorci chybu, např. místo ZPRAVA napíšu v instrukci ZxxRAVA, je podmíněný formát spolehlivě přeskočen.
Pokud stejnou sekvencí obsahující On Error GoTo spustím pod EXCEL 2010 Standard, tak 1x sekvence projde bez hlášení s přeskočením podmíněného formátu a pak různě (4x, 6x atd) skončí chybovým hlášením na té kritické instrukci.
Napadne někoho, jaké řešení by měl tento problém pro EXCEL 2010 Standard? Potřebuji, aby Makro, které obsahuje tuto frekvenci, fungovalo u všech verzí EXCEL stejně, nebo by stačilo napsat ten přeskok tak, že by se v EXCEL Standard ta instrukce spolehlivě vynechávala přeskočením celé uvedené sekvence.
Dík za případné náměty. Nevím, proč by měl být EXCEL 2010 Standard ošizen právě ve zpraování instrukcí pro podmíněný formát.
eLCHa(2.4.2015 10:38)#024359 @Standa-B
Přiznám se, že jsem programátor na "baterky". Profesně jsem elektronik. Navíc oslavím tento rok sedmdesátku. Vyvíjím systémem "pokus-omyl"...nad kterými odborník programátor žasne a kroutí hlavou. Je ale fakt, že moje rozsáhlá aplikace funguje a je využívána servisními techiky lokomotiv.
Většinou na zmínku o věku nereaguji (irelevantní), nicméně udělám u 70 výjimku. Máte můj respekt, držím Vám palce.
Nevím co by na to řekl
odborník programátor, já jakožto amatér nežasnu - jsem zvyklý a vždy je pro mně důležitější jestli to funguje. Ale na ty Selecty mám tak trochu alergii ;))
Jestli mohu poradit - opravdu si nainstalujte virtuální PC
např. VirtualBox - nainstalujte na něj systém. Budete mít na disku vytvořený soubor, který si zazálohujete. Poté na něj nainstalujte excel. Po 30 dnech můžete jeho virtuální disk nahradit zálohou a znovu pouze doinstalovat excel (není třeba znovu instalovat systém). Vyhnete se reinstalaci navíc Vám to umožní mít více instalací excelu na jednom PC aniž by se navzájem ovlivňovaly a můžete mít i více systémů - aniž by se ovlivňovaly.
http://technet.idnes.cz/virtualni-pc-jak-udelat-z-jednoho-pocitace-dva-fow-/software.aspx?c=A090410_151928_software_vsecitovat
eLCHa(2.4.2015 10:48)#024361 ThisWorkbook.Names.Add Name:="vbaFormatCondition1", RefersToR1C1:="=RIGHT(RC[1],2)=""km"""
Range("Q2:Q10").FormatConditions.Add Type:=xlExpression, Formula1:="=vbaFormatCondition1"Tyto dva řádky kódu jsou ukázkou, jak využít pojmenovaný vzorec - pokud zapracujete do kódu, bude to (odvážné tvrzení - vždy bych asi měl napsat
mělo by to ;))) ) fungovat ve všech verzích excelu bez ohledu na lokalizaci a verzi
citovat
Standa-B(2.4.2015 21:52)#024374 eLCHa napsal/a:
.... Takže pokud nemáte možnost zkoušet, změňte ve Vašem kódu....na
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=COUNTIF(R2;""*km"")"
....
Ta instrukce "COUNTIF" je myslím jednoduché a geniální řešení popsaného problému. Ověřil jsem si funkčnost celého programového řádku VB doma na svém EXCEL 2010 Profesional.
Měl jsem již na prověření v EXCEL Standard připraven jenoduchý vorec
"=r2="" km"""
Tento vzorec však vyžaduje pevný současný počet 3 mezer před údajem km. Protože data do aplikace zadává uživatel parametricky podle typu lokomotivy, musel by mít parametr km předepsaný přesný tvar s třemi mezerami. Řešení s COUNTIF a se zástupnou * před km je stejně univerzální jako původně dva znaky zprava.
Pokud ověření na EXCEL 2010 Standard bude zítra úspěšné, má ode mne přítel eLCHa "medaili".
Řešení s využitím pojmenovaného vzorce zatím odložím. Není to pro nás amatéry již tak přehledné jako COUNTIF.
Ozvu se jak dopadnou testy.
citovat
Standa-B(13.4.2015 10:55)#024487 Tak jsem se konečně dostal k ověření vzorce =COUNTIF(R2;""*km""
ve Visual Basic místo původního vzorce
=ZPRAVA(r2;2)=""km""
ve verzi EXCEL 2010 Standard.
Vzorec ve VB s "COUNTIF" je nyní funkční u všech uživatelů ve všech EXCELECH 2003, 2007, 2010 (Profi i Standard).
Vzorec =ZPRAVA.... je normálně funkční při zápisu do buňky EXCEL i pro Standard. Problém s tímto vzorcem se tak týkal asi jen Visual Basic.
citovat