@AL
Ale i tak by ma ešte zaujímalo - ako do obrázku dostať ten vodoznak wall.cz?
to by asi měl odpovědět někdo s provozujících, ale počítám, že na to mají nějaký skript - takže ten obrázek musí být uložen na wall.cz
@AL
když už jsme OT
2. vložíte obsah schránky do nějakého programu, pomocí kterého ho uložíte na disk jako obrázek
3. uložený soubor nahrajete na nějaký server, aby se na něj dalo odkázat
4. odkaz zkopírujete do schránky
5. při psaní příspěvku použijete tag IMG (7. tlačítko), do kterého vložíte odkaz.
;)
trochu zbytečně komplikované - jednodušší je vložit přílohu ;)
Btw - kdysi jsem to řešil na excelplus.net - už si to nepamatuju, ale myslím, že jsme nakonec napsali kód na odstranění starých položek...
@AL
kliknete na img a vložíte url, kde je uložen ;))
@kp57
dovolím si jednu technickou a dvě faktické poznámky.
Technická:
Použití If podmínka Then Goto label
'kód
label:
není to špatně a vlastně nemám žádný argument proti - snad jen přehlednost - používámIf Not podmínka Then
'kód
End If
Faktická 1:
protože se v tabulce vyskytují vzorce, nefunguje Vám to správně. Protože jste nezadal, co chcete s oblastí dělat (nedávno se tu řešilo), použil kompilátor vlastnost Value a převedl vzorce na hodnoty. Proto by bylo lepší použít .FormulaR1C1
Faktická 2:
Napsal jste 2 stejné procedury - Posun_Nahoru a Posun_Dolu. To samozřejmě nevadí, ale ve chvíli, kdy zjistíte, že chcete něco změnit, budete to muset dělat 2x. Proto je lepší napsat jednu a tu volat.
Váš upravený kód, kde vše ukazujiPrivate Sub Posun_Nahoru()
Call Posun(-1)
End Sub
Private Sub Posun_Dolu()
Call Posun(1)
End Sub
Private Sub Posun(Radky As Long)
Call Zrob_Start
If Union(Selection, rngTab).Address = rngTab.Address Then
Dim rdR As Long
rdR = ActiveCell.Row
If Not rdR = rdFirst Then
Dim xPolozka As Variant, yPolozka As Variant
xPolozka = Intersect(Rows(rdR), rngTab).FormulaR1C1
yPolozka = Intersect(Rows(rdR + Radky), rngTab).FormulaR1C1
With WorksheetFunction
Intersect(Rows(rdR + Radky), rngTab).FormulaR1C1 = .Transpose(.Transpose(xPolozka))
Intersect(Rows(rdR), rngTab).FormulaR1C1 = .Transpose(.Transpose(yPolozka))
End With 'WorksheetFunction
ActiveCell.Offset(Radky, 0).Select
End If
End If
Call Zrob_Konec
End Sub
Aha.
No tato úloha je v podstatě velmi jednoduchá a kdybyste tady dal přílohu, měl byste ji už vyřešenou. Nemůžete ale očekávat, že si nejdříve vytvoříme nějaký soubor, na kterém to potom provedeme.
Záleží, kolik těch podmínek je, buď kombinace několika vnořených fcí nebo lépe vyhledávací databázová funkce s vytvořenou tabulkou, kde bude definováno, co při kterém písmenu dělat.
Koukám, že si pokecáte ;))
koukněte na fce A (AND) a NEBO (OR)
Např.:=IF(AND(A1="A",A2="B");"úsek A")
Jen v rychlosti.
Pro posun řádků bych použil něco jako:Sub subMove(iRows As Long)
ActiveCell.EntireRow.Cut
ActiveCell.Offset(iRows - (iRows > 0), 0).EntireRow.Insert Shift:=xlDown
ActiveCell.Offset(iRows, 0).Select
End Sub
Sub subUp()
Call subMove(-1)
End Sub
Sub subDown()
Call subMove(1)
End SubNa Vaší příloze mi to ovšem neposunulo ty zelené šípky (které bych mimochodem nepoužil).
Vložení řádku třeba:Sub subInsert()
With ActiveCell.EntireRow
.Copy
.Insert Shift:=xlDown
.Offset(-1, 0).SpecialCells(xlCellTypeConstants).ClearContents
End With 'ActiveCell.EntireRow
End Sub
Tyto kódy neřeší omezení horní a dolní hranice, nicméně to by neměl být problém např. pomocí pojmenované oblasti a testu, zda se nacházím na jejím prvním nebo posledním řádku.
Ještě poznámka - pokud tyto kódy spustíte někde uprostřed oblasti, vzorce pod se aktualizují automaticky. Pokud byste ovšem přidal řádek před první nebo za poslední, nebudou se aktualizovat. Toto řeším tak, že vzorce pod tabulkou rozšířím o jeden řádek nad a jeden řádek pod oblast, kde se budou vkládat řádky a nemusím to řešit v kódu.
@Pee
Limitu se bát nemusíte.
Cyklický odkaz musíte řešit, přes to vlak nejede. Dole ve stavovém řádku vlevo máte napsáno, kde je.
Máte tam cyklický odkaz v buňce E12
? doplněn ;)
Tak Err existuje určitě jen 1 - ověřil jsem pomocí následujícího kóduSub test11()
On Error Resume Next
Dim err1 As ErrObject
a = 1 / 0
Debug.Print Err.Number, Err.Description
Call test12(Err)
Debug.Print Err.Number, Err.Description
End Sub
Sub test12(err1 As ErrObject)
On Error Resume Next
Dim b As Byte
b = 1000
Debug.Print Err.Number, Err.Description
Debug.Print err1.Number, err1.Description
End SubDokonce nepomůže ani odkaz hodnotouSub test12(ByVal err1 As ErrObject)Jde prostě o referenci na objekt a když ho dáte do dvou proměnných, obě odkazují na tentýž objekt. Je to podobné jakoSub test2()
Dim r As Range
Set r = Range("A1")
Debug.Print CStr(r.Value)
'změňte hodnotu v buňce A1
Debug.Print CStr(r.Value)
End SubTaké se vždy zobrazí aktuální hodnota a ne hodnota v době nastavení.
Pokud si chcete uchovat 2 chybové hodnoty, můžete to udělat následovněSub test()
Dim err1 As Long, err2 As Long
On Error Resume Next
a = 1 / 0
err1 = Err.Number
Dim b As Byte
b = 1000
err2 = Err.Number
Debug.Print err1, Error(err1)
Debug.Print err2, Error(err2)
End Sub
Jde mi především o upozornění na zvláštní chování On error GoTo 0 případně i okolo objetu err a příkatu On error (Resume nest, Goto ErrorHandler atp)..
V čem Vám to přijde podivné?
Chcete dosáhnout něčeho konkrétního nebo jen zkoumáte?
Já jsem jen amatér a nemám žádné IT vzdělání, takže pokud to nebude odborně správně tak se omlouvám, ale:
On error pri chybe vytvori objekt err a pomoci konstruktoru preda hodnoty do instancnich datovych slozek objektu err?
Nevytvoří - Objekt Err je (pravděpodobně) vytvořen prvním spuštěním kódu a (pravděpodobně) zaniká ukončením kódu. To si ověříte jednoduše, pokud si vytvoříte nejjednodušší proceduru jaká lze a toSub test()
End Subumístíte na ni kurzor, pravým tlačítkem vyberete Add Watch... a do Expression vložíte Err. Zobrazíte si okno Watches a na proceduře stisknete F8. Okamžitě vidíte, že existuje objekt Err s hodnotou 0.
Pravděpodobně je tam proto, že možná existuje celou dobu s aplikací, ale to nevím a tuto informaci ani nepotřebuji, takže to nezkoumám.
Takže pokud tomu výrazu rozumím, tak ano je to Singleton. Upravte si kódSub test()
On Error Resume Next
a = 1 / 0
Dim b As Byte
b = 1000
End Suba opět krokujte a uvidíte, že se mění tentýž jediný objekt
Instrukce On Error pouze nastavuje, jak se má kód chovat, pokud narazí na chybu.
http://support.microsoft.com/kb/141571/en-us
="RC"&HODNOTA.NA.TEXT(ŘÁDEK();"000000")=HODNOTA.NA.TEXT(ŘÁDEK();"""RC""000000")
@kp57
on za mně v podstatě odpověděl lubo, ale pokud do toho ještě zatáhneme Value2, tak
Text je jen pro čtení, takže nelze použítActiveCell.Text = 5a vrací hodnotu typu String tak, jak je zobrazená v buňce (hrozí tedy případ, který zmiňuje lubo)
Value2 vrací skutečnou hodnotu buňky - pro číslo je to Double, text = String, Chyba = Error nebo logická hodnota = Boolean
Value je stejné jako Value2 s tím, že pokud je hodnota v buňce číslo a buňka obsahuje formát měny, vrací typ Currency nebo pokud je tam Datum, vrací typ Date. Pokud je v buňce formát času, vrací Double (@lubo - označení, že vrací objekt mi přijde nepřesné, protože objekt obsahuje vlastnosti a metody a pokud by to byl objekt, tak při dosazování hodnoty by bylo vyžadováno Set - nicméně to je jen lpění na detailech)
Z toho vyplývá, že není bezpečné používat Text, ale je lepší použít Value a převést si hodnotu na String
Pokud jde o Value vs Value2, tak pokud chcete získat číselnou hodnotu, správnější by bylo používat Value2. Pokud si ovšem definujete proměnné, tak kompilátor stejně převede číslo na typ proměnné, do které hodnotu vkládáte. Takže, pokud je v aktivní buňce číslo ve formátu měny, není rozdíl meziDim a As Long
a = ActiveCell.ValueaDim a As Long
a = ActiveCell.Value2V obou případech je a typu Long. Pokud však napíšeteActiveCell.Value = CCur(5)vloží se hodnota 5 do aktivní buňky a naformátuje se jako měna (u mně se zobrazí 5,00 Kč).ActiveCell.Value2 = CCur(5)vloží do buňky číslo 5 a musíte si ho formátovat sám.
Čímž se tedy omlouvám za zjednodušenou a ne zcela přesnou předchozí odpověď
Value dá hodnotu buňky jak je vložená (bez formátování) - takže jako číslo
Na závěr - Value vs Value2 mi přijde, že mělo být naopak, ale je to tak jak to je a v podstatě na tom nezáleží. Text jsem nikdy nepoužil a neuvědomuji si ani Value2, protože používám to vysmívané Option Explicit a mám tedy všechny proměnné definované.
@AL
takže Evaluate vlastne používam skoro stále, akurát mi nedocvaklo
což jsem Vám psal cca před rokem ;))
http://wall.cz/index.php?m=topic&id=15503
@Dingo
Zprvu jsem důsledně psal všude Cell.Value, nechal jsem toho, když jsem to okoukal ve zdejších nebo jiných kódech, že je zvykem to neudávat.
VBA je velmi tolerantní jazyk a umožňujne velmi volný zápis. Nicméně tím přenecháváte kompilátoru rozhodování, co se má udělat a tak někdy může dojít k nechtěnému průběhu kódu. Toto jiné jazyky neumožňují a kde není jasné co se chce je vyhodnoceno jako chyba. Někdy je to otravné, ale je to tak lepší. Ve VBA je proto lepší vždy psát co chcete udělat.
Není to tedy zvykem a nedoporučuji to.
Pokud jde o to zda použít Value nebo Text
Value dá hodnotu buňky jak je vložená (bez formátování) - takže jako číslo
Text dá hodnotu buňky jak je zobrazená (včetně naformátování) - takže jako textový řetězec
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.