Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  119 120 121 122 123 124 125 126 127   další » ... 286

No "hrozí" je hrozné slovo :) Bez výberového zoznamu sa môže stať akurát to, že užívateľ zadá nečíslo (znaky, medzery, dve desatinné čiarky a pod...), potom mu síce výsledok bude chybová hodnota "#HODNOTA", ale toho si nemusí všimnúť, takže by som tam dal Podmienené formátovanie s testom chybovej hodnoty v J63. A na červeno by sa zafarbili všetky zúčastnené bunky, teda H22, J63, J65.
No problemo. A keď už si niekto nevšimne krikľavo červené bunky, tak to už je jeho prob.

Ešte teda ten príklad na ten Výberový zoznam.

No buď to bude menené tým ComboBoxom v K22, alebo Výberovým zoznamom v H22. Teraz to máte na to Combo.

Sheet = WorkSheet = List = Hárok
WorkBook = Sešit = Zošit = Soubor = Súbor

Nieje jasné čo presne má byť výstup. Ak ide len o vizuálne upozornenie, tak sa dá použiť podmienené formátovanie. Tu pre prehľadnosť a menšiu výpočtovú náročnosť aplikované na základe výpočtu v pomocných stĺpcoch. A:B farbené na základe E, a C:D farbené na základe F. Ale lepšie by asi bolo mať tbl oddelené. Dá sa použiť filter na menšie ako 0, väčšie, alebo 0, v stavovom stĺpci, ktorý chceme. Ale nezabúdať že tu je podľa popisu tbl spojená, teda filter ovplyvňuje aj druhú dvojicu. Odporúčam dať na somostatné listy...

Sub VymazHodnoty()
Dim RNG As Range, JK(), R As Long

With ThisWorkbook.ActiveSheet
R = .Cells(Rows.Count, "JK").End(xlUp).Row
If R = 1 Then
ReDim JK(1 To 1, 1 To 1): JK = .Cells(1, "JK").Value
Else
JK = .Cells(1, "JK").Resize(R).Value
End If

For i = 1 To R
If StrComp(JK(i, 1), "ano", vbTextCompare) = 0 Then
If RNG Is Nothing Then
Set RNG = .Cells(i, 2).Resize(, 10)
Else
Set RNG = Union(RNG, .Cells(i, 2).Resize(, 10))
End If
End If
Next i
End With

If Not RNG Is Nothing Then RNG.ClearContents
End Sub


EDIT: Aha, pozerám, že som si nevšimol požiadavku na zoradenie. Takže, to má byť na základe čoho zoradené ?

Inak, prečo nepoužijete filter ???

model A)
Chcete v jednom vzorci násobiť 2 bunky. No a čo potom ? Budete mať 2 výsledky a čo s nimi ? Zrátať, či čo ?

model B)
Chcete podľa jednej bunky ovplyvniť 2 bunky. Veď dajte do každej z ovplyvňovaných buniek rovnakú podmienku.

Ak ani jedno z toho, priložte prílohu s príkladom toho, čo máte, čo sa kde mení, a čo má kde byť výsledkom, pri konkrétnom príklade.

Tiež si myslím, že by mal v tom existovať nejaký export. Čo je to zač (názov) ?

Bunky, kam vkladáte tie OCR data, naformátujte ako text, to tam ale máte, potom stačí takýto vzorec, v ktorom to rozdelíte a zbavíte sa obidvoch typov medzier. V bunke s týmto vzorcom nastavte formát na %:
=TRIM(SUBSTITUTE(LEFT(C7;FIND("/";C7)-1);CHAR(160);""))/TRIM(SUBSTITUTE(MID(C7;FIND("/";C7)+1;LEN(C7));CHAR(160);""))

=PROČISTIT(DOSADIT(ZLEVA(C7;NAJÍT("/";C7)-1);ZNAK(160);""))/PROČISTIT(DOSADIT(ČÁST(C7;NAJÍT("/";C7)+1;DÉLKA(C7));ZNAK(160);""))

Samotné nastavenie tlače nebude problém. Ale ak by ste chcel aby to rovno komunikovalo s externým programom a vkladalo mu hneď aj názov súboru, tak to už bude problém. Daný program musí mať dostupné nejaké API rozhranie, a navyše zdarma. Do tohto dobrodružstva sa púšťať nebudem.

Ak ide iba o samotné odoslanie, môže to byť jednoduchšie (stačí iba názov tlačiarne), alebo zložitejšie (je potrebný interný názov tlačiarne, teda aj s číslom).

Skúste najskôr či Vám funguje jednoduché makro Pokus. Ak nie, tak treba presedlať na ten zvyšok, kde sa riešia aj interné názvy s predložkou a číslami.

Sub Pokus()
Dim AktTlaciaren As String, NovaTlaciaren As String
AktTlaciaren = Application.ActivePrinter
NovaTlaciaren = "Bullzip PDF Printer"
ActiveSheet.PrintOut Preview:=True, ActivePrinter:=NovaTlaciaren
Application.ActivePrinter = AktTlaciaren
End Sub


Kód s popisom na ten obsiahlejší variant je v prílohe.

Čo je na ňom zlé? No, ... celý koncept je zlý.
Napr.:

- viete čo urobí tento riadok ?
If Len(Text) = 0 Then Exit ForNič! A to je práve ono. Každý prechod každým cyklom príde najskôr na tento riadok, kde otestuje či je Text nulovej dĺžky. A on skutočne je, lebo ho nikde predtým nenastavíte. Až za tým. Ale tam sa nikdy nedostane.

- For List = 3 To a
...
Worksheets(List)
Prečo sa začína od listu číslo 3

- Select - toto sa naučte používať iba keď je to nutné - veeeľmi zriedka. Odkazujte sa rovno na list, lebo každý má nejaké meno. Prípadne na jeho odkaz v kolekcii Worksheets.

-Alebo
d = Rows.Count
...
Cells(d + 1, b) = Text
Do "d" uložíte počet riadkov daného Excelu, v tomto prípade staršieho XLS je to 65536. To je maximum, viac mať XLS nemôže. A potom k tomu pripočítate +1, teda vznikne 65537. Bác chyba, taký riadok v XLS neexistuje (XLSX je to až 1048576).

- Nejdem to pitvať, len ako posledný príklad uvediem
Text = Cells(e, 1)Áno načítate si do premennej Text (ktorá mimochodom nieje deklarovaná, síce je typu Variant, ale aj tak pre prehľadnosť musí byť v deklarácii, premenná List takisto), ale vždy iba z 1. stĺpca. Darmo prechádzate cyklom ostatné stĺpce, keď vždy načítate 1.

Plus samozrejme nejaké logické veci, ako napr. ten spomínaný test If Len(Text) = 0. Ak by ste ho aj zaradili na správne miesto, čo ak bude niektorá bunka v tabuľke prázdna? Bác, cyklus sa ukončí a ostatné neskopíruje.
WS.Name = "tabulka" - čo ak ten list už existuje ? No nastane chyba.
Nepočíta sa tam so žiadnou chybou. Preto ja v mojom kóde testujem existenciu spoločného listu, vynechávam ho zo súhrnu, a testujem počet riadkov (či obsahuje list vôbec dáta).
-Prechádzanie všetkých Cells po jednej, je strašne pomalé. Preto som použil bleskové polia.

Ale neľakajte sa problémov, a upozornení na chyby (to nie sú výtky v pravom slova zmysle). Veď začínate, je to v pohode. Treba sa ozvať, keď niečo nepôjde.

Prípadne, ak by hrozilo, že výsledná tabuľka bude mať viac ako 32767 riadkov, tak sa nedá použiť transpozícia poľa, lebo je obmedzená na tento počet riadkov, ale použite túto úpravu.

PS: Transpozícia je potrebná pri poliach, ktorých veľkosť meníte za behu. A to preto, že meniť veľkosť môžete iba poslednému rozmeru poľa, čo je inak povedané na šírku. A keďže nám sa tabuľka zväčšuje na výšku, preto je potrebná pri takomto použití transpozícia poľa. Každopádne toto druhé riešenie, najskôr zistí celkový počet dát, a pole nastaví rovno na výšku, teda transpozícia nieje potrebná.

Stále si ale myslím, že na toto je lepší PowerQuery, ktorý ale ja príliš neovládam (tie čachre s počtom stĺpcov). Tak snáď niekto iný...

Makro čo som Vám dal v predošlej téme sedí presne na Váš súbor, len si ho skopírujte.

No ak pominieme nejaké nelogickosti, ktoré treba dotiahnuť, tak napr. takto.

-Čo ak spoločný list už existuje ? Zmazať v ňom dáta, a nahradiť novými ? Alebo nové pridať pod staré ? Teda inak povedané, je potrebné list Spolu vynechávať zo zlučovania dát ?
-Kde ma byť to makro umiestnené ? Ako sa má spúšťať ? Veď keď máte meniaci sa počet listov, a neistú existenciu spoločného listu, tak makro by mohlo byť asi iba v doplnku či ako tlačítko v lište nástrojov Excelu. Pretože listy meníte, asi aj mažete, a nevieme zabezpečiť existenciu nejakého tlačítka v každom liste.
-Počet stĺpcov sa líši. Je teda možné, že určitý stĺpec bude na inej pozícii ? To by sa muselo ošetriť.

Tých vecí k zamysleniu je viac.

Ale na toto by sa viac hodilo PowerQuery.

Tak za :
1. Vo VBA sa používajú ENG vzorce, teda žiadne POZVYHLEDAT ale MATCH.
2. ENG oddeľovačom argumentov nieje ";" bodkočiarka/středník, ale "," čiarka.
3. Názov listu obalte do apostrofov "'"
4. Úvodzovka musí byť uvedená 2x, aby ju VBA interpretoval ako úvodzovku, inak je to totiž jeden z riadiacich znakov určujúci zač./kon. reťazca.

Výsledok
"=OFFSET('Program'!$A$3,MATCH(1,('Program'!$B$4:$B$30=$X$5)*('Program'!$C$4:$C$30=""Ano""),0),0,COUNTIFS('Program'!$B$4:$B$30,$X$5,'Program'!$C$4:$C$30,""Ano""))"


Strana:  1 ... « předchozí  119 120 121 122 123 124 125 126 127   další » ... 286

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse