No takže mám to upravené, funkčné. Okrem toho, že vzorec nedokáže vrátiť EMPTY (BLANK), tak tam bol ešte jeden zákerný problém v IIF. Vyriešené.
Chcete aj popis makra ? (Príliš sa mi nechce, ale keby ste naliehal ...)
A a teraz, po mojom trápení, sa potrápte Vy, a dajte čo najpodrobnejší popis o tých súboroch, z ktorých by ste tam ešte chceli čerpať ďalšie data. Ešte raz opakujem, čo najpodrobnejší. Teda napr. (okrem iného):
-kde budú uložené tie iné zošity?
-bude ich premenlivý počet?
-budú mať nemenné názvy?
-ak budú názvy menné, podľa akého vzorca sa budú meniť?
-budú obsahovať meniaci sa počet riadkov?
-budú mať rovnakú štruktúru ako tento zošit?
-budú mať rovnaký typ dát?
-budú mať rovnaký počet a usporiadanie stĺpcov?
Uvidíme podľa toho čo popíšete, či to vôbec bude riešiteľné, a či sa na to dám, pretože popravde, zatiaľ netuším ako by sa to dalo (podľa tipovaných odpovedí na dané otázky).
Takto by som si predstavoval zjednodušenie zadávania filtra pre užívateľa (ten červený filter bude schovaný)). Problém je, že to funguje iba čiastočne.
Preto prosím o radu kolegov, prečo mi to neberie korektne v úvahu dátum, ak vo filtri nieje iná podmienka ? Akonáhle je tam okrem dátumu napr. aj nejaká podmienka veku, hneď to funguje. Ale samotný dátum nie.
@A ještě jedna věc mě napadla když bude více zdrojových souborů aby se výsledky načítali do jednoho listu (do buněk by se napsaly cesty k souborům a z těch by se načetly data)?
Toto bude zložitejšie ako si myslíte, neviem či sa mi s tým bude chcieť paprať. Vy viete koľko vzorcov na získanie dát máte vložiť ? Viete ako sa budú volať súbory ? Viete aké názvy budú mať listy? Viete koľko listov bude ? To sú nesmierne komplikácie na získanie neznámeho počtu dát z neznámeho počtu listov, neznámych názvov listov, neznámeho počtu súborov a ich názvov.
PS: zmenil som makro tak, že sa data zoskupia len keď sa aktivuje list Filter, a ten sa prepočíta, ak je zmenená bunka vo filtri.
EDIT: Takže problém je pravdepodobne v tom, že vzorec nedokáže vrátiť hodnotu Empty, ale iba "" a to robí vo filtri galibu. Pracujem snáď na riešení.
A v tomto poslednom súbore som zabudol ešte po otvorení aktualizovať, a po otvorení to píše chybu, ale to neva, opravím v ďalšej verzii - ignorovať...
Po otvorení zošitu, alebo každom aktivovaní listu Hárok1, alebo po stlačení tlačítka, sa aktualizuje výberový zoznam, ktorý obsahuje všetky súbory .xlsx v adresári odkiaľ je tento súbor otvorený. Po aktualizácii sa automaticky nastaví na 1. voľbu. Vyberiete si v zozname, samé to vloží vzorec na čítanie dát z daného súboru.
Áno, ja som si to všimol, hneď ako som to odoslal, preto som to hneď zmazal, a posielam správnu verziu.
Urobil som Vám vzorce rovno do tabuliek. Mohli ste to dopísať do predošlého vlákna.
No to som aj čakal, že nenapíšete žiadne podrobnosti, ani nedáte prílohu s reálnymi dátami, počtom stĺpcov, typom dát rozložením v listoch a pod.
No nič, 3 x som preleštil moju ošúchanú krištáľovú guľu, vypil 2 čarovné nápoje so žabacieho slizu, prehltol netopiera , o ostatných rituáloch ani nehovorím radšej, ... a navrhol som Vám riešenie. Žiaľ bez udania podrobností Vám to nedokončím, musí to byť na mieru.
Ešte treba zinteligentniť zadávanie filtra, pretože tento predpokladám ovládať vedieť nebudete. Funguje tak, že pre každý stĺpec dát nadefinujete podmienku (>30, <50, lenže napr. prázdny dátum musíte nadefinovať ="="&""), vedľa seba je AND, pod sebou je OR.
Čo sa týka toho obnovovania, v reálnom čase to nieje príliš reálne. Hlavne ak máte množstvo listov s množstvom riadkov. Takže som to nastavil tak, že sa filter vypočíta keď sa prepnete na list Filter, alebo ak zmeníte filter.
Tu máte spojenie tabuliek makrom, a buď si dorobíte filtrovanie podľa tých tajných podmienok, alebo nám ich prezradíte spolu s druhmi, typmi, počtom údajov, a mi Vám pomôžeme to urobiť.
Počet tých tabuliek je nemenný? Počet riadkov v tabuľkách je nemenný ? Dajte prílohu.
No teda! Aspoň k niečomu funkčnému sme sa spoločne dobrali.
Ak si nebudete vedieť s niečim rady, kľudne napíšte aj do tohto vlákna, aj keď sa to nebude týkať priamo odkazov na listy, ako je v názve. Ale aspoň budeme vedieť o čo ide. Nebojte, nikto spoza klávesnice nekúše.
Nekúše ???
Robíte 2 základné chyby.
1. Základná chyba : Vy tam máte v bunkách hodnotu, ktorá je ČÍSLO. V Exceli keď sa odkazujete na Sheets, tak táto funkcia Sheets (alebo Worksheets) je tzv. Preťažená. To znamená, že jej parameter môže mať rôzny typ, a podľa toho aký typ má, taký typ funkcie sa vykoná. Vy keď máte teda v bunke číslo, a pošlete ho ako parameter do funkcie Sheets, ona zistí še sa jedná o číslo, tak to považuje za INDEX ! A list s takýmto indexom samozrejme neezistuje. Vy potrebujete použiť tú druhú preťaženú funkciu Sheets, ktorá očakáva identifikátor ako TEXT, pretože názov listu je text. Toto rieši problém s odkazom - pretypovanie čísla na text.
On Error Resume Next
Sheets(CStr(Cells(1, 1).Value)).Activate
If Err <> 0 Then MsgBox ("List neexistuje." & vbNewLine & Cells(1, 1).Value)
On Error GoTo 0
2. Základná chyba : Je ešte väčšia ako prvá. Nehnevajte sa na mňa, vy vôbec nečítate, čo Vám píšem. A vôbec neodpovedáte na to čo sa pýtam. Prosil som Vás o presný podrobný popis toho čo sa bude diať a čo očakávate aby sa stalo. Dokonca som Vám dal aj príklad ako si predstavujem ten popis. Ja viem že je to účtenka, ale chcel som od Vás dostať informácie, kam sa zapisuje nové číslo účtenky (alebo sa nazapisuje, vytvára sa), kam sa ukladá posledné číslo. Čo sa ukladá/číta do/z tých prázdnych buniek v kóde. Pri každom vytvorení novej účtenky sa vytvorí aj nové tlačítko ? Odkiaľ sa budú brať názvy tlačítok ? Kde chcete ukladať, ktorý list (účtenka) patrí ktorému tlačítku ? Tie tlačítka a listy sa už nikdy mazať/meniť nebudú? Budú sa kopírovať aj iné bunky na nové listy? Nemôžete dať ako príklad súbor, kde uvediete jedno číslo, zlý kód, prázdne strany, žiadne informácie o fungovaní, a čakať, že Vám niekto pomôže. Ako vidíte, snaha o pomoc je, inak by som nenapísal 4x toľko čo Vy (a to má byť opačne). Dajte si kľudne aj hodinu čas na popísanie toho čo chcete. Ja som venoval premýšľaniu o tom čo asi tak chcete celým zošitom dosiahnuť o dosť viac.
A nebojte sa dať viac vyplnenú prílohu. Firemné tajné data prepíšte vymyslenými (aj z inej oblasti), čísla zákazok prepíšte tiež, služby/tovar si vymyslite. To nemôže byť predsa problém, vymyslieť si údaje na jednom liste "start" a jednom či dvoch listoch s účtenkami.
PS: Myslite stále na to, že aj tento môj kvázi-kritický príspevok, je iba snaha Vám pomôcť
Toto vôbec nepoužívam, naozaj je tam možnosť nastaviť formátovanie tak ako Anonym che ? Mne z toho totiž vyplýva, že on chce napr. bunku L28 okrášliť šípkou nahor v prípade, ak sa hodnota tejto bunky zväčšila oproti predchádzajúcej hodnote tejto bunky o 25% (a viac). Netuším, kde to formátovanie bude brať pôvodnú hodnotu tejto bunky. Ale možno to Excel zvláda ľavou zadnou. Ja to nepoužívam, tak neviem. Tak mi treba
Trošičku inak
EDIT: A pridávam ešte, ak by bolo potrebné, aj jedno z riešení vo VBA:
Function GetLog(Log As String, Param As String) As Long
Select Case Param
Case "l": GetLog = Evaluate("=VALUE(MID(""" & Log & """,7,FIND(""_ratio:"",""" & Log & """)-7))")
Case "r": GetLog = Evaluate("=VALUE(MID(""" & Log & """,FIND(""_ratio:"",""" & Log & """)+7,FIND(""_fix"",""" & Log & """)-(FIND(""_ratio:"",""" & Log & """)+7)))")
Case "f": GetLog = Evaluate("=VALUE(MID(""" & Log & """,FIND(""_fix:"",""" & Log & """)+5,FIND(""_adjust"",""" & Log & """)-(FIND(""_fix:"",""" & Log & """)+5)))")
Case "a": GetLog = Evaluate("=VALUE(RIGHT(""" & Log & """,LEN(""" & Log & """)-(FIND(""_adjust:"",""" & Log & """)+7)))")
End Select
End Function
A príklad použitia:
Sub Vysledok()
Dim s As String, hLimit As Long, hRatio As Long, hFix As Long, hAdjust As Long
s = "limit:999_ratio:0_fix:0_adjust:1"
hLimit = GetLog(s, "l")
hRatio = GetLog(s, "r")
hFix = GetLog(s, "f")
hAdjust = GetLog(s, "a")
MsgBox (hLimit & vbNewLine & hRatio & vbNewLine & hFix & vbNewLine & hAdjust)
End Sub
Ešte jeden iný spôsob ako to isté dosiahnuť:
Function GetLog(Log As String, Param As String) As Long
Dim SL() As String
SL = Split(Log, ":")
Select Case Param
Case "l": GetLog = CLng(Left(SL(1), InStr(1, SL(1), "_") - 1))
Case "r": GetLog = CLng(Left(SL(2), InStr(1, SL(2), "_") - 1))
Case "f": GetLog = CLng(Left(SL(3), InStr(1, SL(3), "_") - 1))
Case "a": GetLog = CLng(SL(4))
End Select
End Function
Ešte kratšie
Function GetLog(Log As String, Param As String) As Long
Dim SL() As String
SL = Split(Log, ":")
Select Case Param
Case "l", "r", "f": GetLog = CLng(Left(SL(InStr(1, "lrf", Param)), InStr(1, SL(InStr(1, "lrf", Param)), "_") - 1))
Case "a": GetLog = CLng(SL(4))
End Select
End Function
Dalo by sa ešte kratšie, posledný HardCore :
Function GetLog(Log As String, Param As String) As Long
If Param = "a" Then GetLog = CLng(Split(Log, ":")(4)) Else GetLog = CLng(Left(Split(Log, ":")(InStr(1, "lrf", Param)), InStr(1, Split(Log, ":")(InStr(1, "lrf", Param)), "_") - 1))
End Function
Ak môže byť Param číslo (číslo parametru 1=limit ...) tek
Function GetLog(Log As String, Param As Byte) As Long
If Param = 4 Then GetLog = CLng(Split(Log, ":")(4)) Else GetLog = CLng(Left(Split(Log, ":")(Param), InStr(1, Split(Log, ":")(Param), "_") - 1))
End Function
Škoda že to nežerie IIf(...) bolo by to ešte o pár znakov kratšie. Ak to má byť ale používané mnoho krát, tak tieto krátke sú nevýhodné, lebo Split robia viackrát.
Maličká úprava na začiatku algoritmu, plus ešte jeden algoritmus iný. Testoval som oba na rovnakej vzorke 500 súborov :
na RAMdisku
1. variant (s vkladaním vzorca) - 2,3 sekundy
2. variant (s ExecuteExcel4Macro) - 1,8 sekundy
na HDD (7200 rpm)
1. variant (s vkladaním vzorca) - 1,8 sekundy
2. variant (s ExecuteExcel4Macro) - 1,4 sekundy
na SSD disku
1. variant (s vkladaním vzorca) - 2,3 sekundy
2. variant (s ExecuteExcel4Macro) - 1,7 sekundy
Testy som robil niekoľkokrát, a vyšli na prvý pohľad naozaj veeeľmi zvláštne. Teoreticky by mala byť rýchlosť najlepšia na RAMdisku, potom na SSD, potom na HDD. Najlepšie mi ale vyšiel HDD, pretože SSD je sytémový (momentálne 134 procesov, a to je už optimalizovaný), RAMDisk je používaný ako cahce pre 3 prehliadače ... (+ automatická záloha). A HDD (ten konkrétny kus) je najmenej namáhaný. Je krásne vidieť, že na rýchlosť vplýva všetko.
Otestujte si, a vyberte si.
PS: Merané len tak od oka stopkami.
A odkiaľ zoberieme ten link ? Ak ste mysleli toto, tak opäť zbytočná doterajšia práca, so zoznamom ...
Prosím Vás popíšte presne krok za krokom čo chcete presne dosiahnuť. Ale naozaj krok po kroku, napr. :
-v liste start zapíšem do A1 nejakú hodnotu
-kliknem na tlačítko, a vytvorí sa mi list s názvom, ktorý je o 1 väčší ako číslo v AX1, pričom sa toto číslo tiež zväčší
-do bunky A2 v liste start sa vloží toto nové číslo, rovnako ako aj do bunky A2 v novovytvorenom liste
-chcem zostať prepnutý na novom liste
-zároveň chcem, aby keď sa prepnem znovu na list start, a stlačím tlačítko, aby ma preplo na list ktorého názov je v A1 uvedený ak existuje, ak neexistuje, tak nech ho vytvorí, a prepne ma naspäť na list start
-...
Takto to prosím Vás popíšte. V tom Vašom kóde nemáte definované premenné, nieje vôbec jasné, kedy na ktorý list zapisujete, Odkazujete sa na bunku Cells(1,7) v ktorej ale nič nieje, a ani tam za celú dobu behu makra nič nevkladáte - čiže automaticky to končí chybou. Navyše v kóde je divná podmienka, keď NazevListu sa získava v podmienke, ale zapisuje sa do bunky Cells(1,5) aj mimo podmienku.
... Celý kód je podľa mňa prinajmenšom divný.
Už som sem dával riešenie podobného problému. Viete si to upraviť?
http://wall.cz/index.php?m=topic&id=24791
Ak nie, tak by som Vám to snáď zajtra spáchal. Ten "seznam" má byť ako list alebo ako Výberový zoznam v bunke, a to v nejakom novom súhrnnom zošite ?
EDIT: Posielam nejaký ten návrh.
A ešte otázka, koľko tých súborov v adresári asi bude ?
Z tabletu, takže iba typ:
Toto nefunguje ?
Me.Image1.Picture = LoadPicture(Worksheets("Hárok1").Cells(2,1).Value)
Kde Image1 je objekt Obrázok na forme.
EIDT: A ešte by som ošetril volaciu procedúru :
Sub Tlačidlo1_Kliknúť()
On Error Resume Next
UserForm1.Show
If Err <> 0 Then
MsgBox ("- chybný formát obrázku," & vbNewLine & "- neexistujúci obrázok," & vbNewLine & "- alebo iná chyba pri jeho načítaní")
Exit Sub
End If
On Error GoTo 0
End Sub
pretože stačí aby bola chyba v názve, či nesprávny formát a havaruje to - samozrejme.
A ešte drobnosť, PictureSizeMode by som dal na fmPictureSizeModeZoom, v prípade ak sa nevie aký pomer strán alebo veľkosť budú mať tie obrázky.
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.