Jsem úplný zelenáč a potřebuji napsat jednoduché makro v Excelu 2007, ale narazil jsem na nějaké nesrovnalosti...
1)
Asi jsem nějak nepochopil možnosti metody Select, resp. Activate. Pokud chci vybrat buňku v urč. sešitě, tak při použití příkazu:
Workbooks("jmeno.xlsm").Worksheets("List1").Range("B5").Select
...excel hlásí chybu "metoda Select třídy Range selhala" (pokud není List1 zrovna aktivní).
Musím nejprve vybrat sešit s listem a pak zvlášť buňku... Je to normální?
Např. metoda Copy takto funguje bez problémů.
2)
Pokud se pokusím do objektové proměnné cas typu Range přiřadit oblast Range takto:
r=5
Set cas = Range("B2", Cells(r, 2))
...je vše v pořádku
Pokud ovšem zkusím přiřadit i list:
r=5
Set cas = Worksheets("Výstupní hodnoty").Range("B2", Cells(r, 2))
...hlásí program chybu "1004". Patrně mu vadí vlastnost Cells použitá u objektu Range, ale nechápu proč.
Chápu, že je to trochu "podúrovňový" dotaz, ale nemám se kde jinde zeptat...
Díky za každou radu či vysvětlení!
Workbooks("jmeno.xlsm").Worksheets("List1").Range("B5").Select
...excel hlásí chybu "metoda Select třídy Range selhala" (pokud není List1 zrovna aktivní).
Ano, bohuzel, pokud pouzijes Select nebo Activate na jinem listu nez je aktivni dostanes tuto chybu, musis list predem vybrat, ale nacteni/vlozeni hodnoty z bunky na jinem listu jde.
Pokud ovšem zkusím přiřadit i list:
r=5
Set cas = Worksheets("Výstupní hodnoty").Range("B2", Cells(r, 2))
...hlásí program chybu "1004". Patrně mu vadí vlastnost Cells použitá u objektu Range, ale nechápu proč.
Spravne, tady vadi objekt Cells, protoze, se vztahuje k aktivnimu listu, kdezto ty se snazis zapisovat na jiny. Proste delas krizeni a to se mu nelibi, bud pred to Cells uved jmeno toho listu nebo to udelaj pres "B"&r (osobne bych to delal cele pres Cells, ale ja jsem trosku ulitlej na Cells ...
Chápu, že je to trochu "podúrovňový" dotaz, ale nemám se kde jinde zeptat...
Nedelej si problemy, forum je tu od toho aby se na nem lidi ptali, takze se nestresuj a ptej se klidne dal :-)
Nikdy neni tak zle, aby nemohlo byt jeste hur :-)
Office 2007 EN & Office 2003 CZ & Office 2000 EN & Office 2010 EN
Upravil Premek, 07.03.2010 20:34
Díky moc za vysvětlení! Je to vlastně logický, ale člověka to nenapadne...
Ještě se zatím vyskytl problém se sloučenýma buňkama. Když jí (nebo spíš je) dám jako cíl kopírování, ohlásí se chyba 1004. Nefunguje ani když se zadá levá horní buňka ani celá oblast sloučení. Přitom třeba kopírovat ze sloučených buňek se dá bez problémů...
Nemůžu taky přijít na to, jak otestovat pomocí VBA, jestli v buňce se vzorcem je použito dělení nulou, tedy v prostředí excelu v buňce zobrazeno "#DIV/0!".
A ještě taková možná zbytečnost... v nápovědě VBE se mi nepodařilo najít kompletní objektový model Excelu, takže mi trochu uniká, jak se vyznat v některých příkazech. Např.:
ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Clear
...jestli to dobře chápu, tak všechny výrazy nalevo od poslední tečky reprezentují objekty, až poslední je vlastnost nebo metoda. Lze to tak obecně říct? A předchozí příklad mi připomíná - je třeba rozdíl mezi setříděním oblasti pomocí metody sort nebo přes objekt sort? Ani nevím, jestli jsem to dobře pojmenoval :)
Nakonec je toho docela dost... Stačí mi úplně jen "zrychlené" odpovědi. Možná se radši ještě zeptám, jakou knížku byste mi mohl doporučit, abych se trochu vzdělal. Dál už nebudu zahlcovat fórum, slibuju :)
zelenac napsal:
Ještě se zatím vyskytl problém se sloučenýma buňkama. Když jí (nebo spíš je) dám jako cíl kopírování, ohlásí se chyba 1004. Nefunguje ani když se zadá levá horní buňka ani celá oblast sloučení. Přitom třeba kopírovat ze sloučených buňek se dá bez problémů...
Tak MergeCells = sloucene bunky jsou takove zahadne, ale ne moc
Prikaz activecell.MergeCells ti vrati True nebo false pokud je aktivni bunka sloucena nebo ne activecell.MergeArea.Cells.Count ti vrati pocet sloucenych bunek no a kdyz das za MergeArea tecku tak dostanes klasicky Range objekt => mas k dispozici veskere vlastnosti a metody
zelenac napsal:
Nemůžu taky přijít na to, jak otestovat pomocí VBA, jestli v buňce se vzorcem je použito dělení nulou, tedy v prostředí excelu v buňce zobrazeno "#DIV/0!".
Vetsinou to delam pres SpeciallCells, ale pokud chces kontrolovat treba jednu bunku tak muzes takto IsError(ActiveCell) vraci True pokud aktivni bunka ma chybu Activecell.Text vrati Text, ktery je zobrazen v bunce, muzes zkontrolovat zda je to #DIV/0! nebo pouzit funkce z listu = pokud tam je nejaka primo na #DIV/0!
A ještě taková možná zbytečnost... v nápovědě VBE se mi nepodařilo najít kompletní objektový model Excelu,
takže mi trochu uniká, jak se vyznat v některých příkazech. Např.:
ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Clear
...jestli to dobře chápu, tak všechny výrazy nalevo od poslední tečky reprezentují objekty, až poslední je vlastnost nebo metoda.
Ano, chapes to spravne Clear je metoda
A předchozí příklad mi připomíná - je třeba rozdíl mezi setříděním oblasti pomocí metody sort nebo přes objekt sort? Ani nevím, jestli jsem to dobře pojmenoval :)
Myslim si ze je to uplne jedno.
Objekt range ma metodu Sort, kde muzes nastavit parametry trideni
pak je samostatny objekt Sort (ktery je pridan ve verzi 2007) a ktery vlastne rozsiruje moznosti razeni, ale podle me, pokud zadas do obou stejne kriteria dostanes stejne serazeny seznam (nezkousel sem)
Nikdy neni tak zle, aby nemohlo byt jeste hur :-)
Office 2007 EN & Office 2003 CZ & Office 2000 EN & Office 2010 EN
Přejít na:
... nejlépe se zpracovávají tabulky mléčné čokolády