To bude záležať na konkrétnom prípade štruktúry dát. Ak si chcete zamotať hlavu, tak napr. tu riešia kombinácie KT, ListObject, PivotCache, Connection, QueryTable ...
Ak pre Vašu štruktúru dát (prepojenia, dotazy, kt, ...) funguje cesta najmenšieho odporu - RefreshAll, použite ju. Je to schodnejšie, ako zbytočne hľadať prečo sa KT obnovila skôr ako jej zdroj (teda sa tým pádom neaktualizovala), ak Vám to nerobí.
RefreshAll obnoví všetko, druhé makro iba QueryTables. Napr. v tom Vašom súbore wall fuel_format.xlsm nie je ani jediná QueryTables, ale obnoviť dáta cez Obnoviť všetko trvá 3 s.
Dajte si BreakePoint na tento riadok
qt.Refresh BackgroundQuery:=Falsea zistíte, že sa tam makro ani nedostane.
Nebudete predsa spúšťať 74 makier, alebo písať 74x ten istý úryvok kódu. Treba použiť cyklus. Názvy tých súborov máte niekde v zošite uložené aj s heslami?
Takto?ThisWorkbook.RefreshAll
Skúste toto, ale podľa komentárov bude záležať na konkrétnej kombinácii Win+Edge+32/64bit+Office.
Tak včera som sa k tomu nedostal vôbec. Dnes som prispôsobil iba PQ. Prispôsobovať to moje makro sa mi dnes už asi nechce...
Ja som si pre Vás nachystal zatiaľ 3 verzie.
- PQ so zavislosťou na stĺpcoch
- PQ nezavislé na stĺpcoch
- VBA zavislé na počte stĺpcov
VBA verziu nezávislú na počte a názvich stĺpcov som začal rozpracovácať.
VBA je rýchle, ale podľa mňa je pre Vás aj na pochopenie lepšie PQ. Keď prídem, pošlem, a uvidíte, že zložitosť PQ kódu je 20% oproti VBA. Aj keď to je zasa rýchlejšie.
No uvudíme.
Čo myslíte tým, že PQ hádzalo chyby pri doplnení súborov? To predsa nemôže byť problém pre PQ, dáte iba Obnoviť Tabuľku. Ibaže by "zmena" znamenalo niečo iné ako pridanie dát do súborov, pridanie súborov s rovnakou štruktúrov a pod. Napr. zmena hlavičiek, názvu listu, počtu listov (aj iné názvy), nesúrodý počet stĺpcov, neexistujúce hodnoty, prázdne tabuľky a pod.
Pre makro to tiež nebude problém (bez otvárania). Stačí použiť, ako to ja nazývam, "dolovacie vzorce". Hromadná príprava a vloženie poľa vzorcov na bunky a prevod na hodnoty. Je potrebné vedieť, podľa ktorého stĺpca sa určuje počet riadkov, a či sú medzi dátami v tom stĺpci medzery a ich formát. Rozsah dát sa potom (bez otvorenia) vypočítava iným vzorcom.
Teda --> príloha.
Celý koncept logovania zmien do iného Excel súboru je čisto nereálny. Pri každej zmene bunky sa otvára súbor, vkladajú hodnoty (ešte aj to nešťastným spôsobom po jednej), súbor sa uloží a zavrie. Môžete mať akokoľvek rýchly PC, toto bude v sekundách pri každej zmene. Navyše nepočítate s reálnou možnosťou zmeny viacerých buniek naraz.
Schodnejšie by bolo rýchle ukladanie do TXT súborov. A tie by sa hromadne načítali cez PQ v kontrolnom súbore.
EDIT:
Napadlo ma ešte, jedine, že by sa vytvorila nová skrytá inštancia Excelu, a ten kontrolný súbor by bol v nej otvorený, potom by bolo logovanie rýchle. Ale ten kontrolný súbor by sa potom nedal otvoriť, pokým by nebolo nejako vyvolané jeho skryté zatvorenie (nap. ukončením pôvodného zošitu, alebo tlačítkom, a apod.)
???
Čože???
Aká prvá verzia to vloží ako hodnoty?
Veď obe verzie makra vložia do bunky výslednú hodnotu.
Čo chcete aby bolo vo výslednej bunke?
-výsledná hodnota z $J$1:$AW$1 podľa nájdeného indexu J4:AW4<0 (alebo "No Shortage")
-vzorec "=IFERROR(INDEX($J$1:$AW$1;POZVYHLEDAT(PRAVDA;J4:AW4<0;0));"No Shortage")"
???
Chcete aby makro vložilo do bunky vzorec?
Sub Makro3()
wsList.Range("M7").FormulaArray = "=IFERROR(INDEX($J$1:$AW$1,MATCH(TRUE,J4:AW4<0,0)),""No Shortage"")"
End Sub
Príkladov môže byť množstvo. Ide aj o to, koľkokrát to budete robiť. Napr:
Sub Makro1()
Dim Vysledok
Vysledok = Evaluate("=IFERROR(INDEX($J$1:$AW$1,MATCH(TRUE,J4:AW4<0,0)),""No Shortage"")")
wsList.Range("K7").Value = Vysledok
End Sub
Sub Makro2()
Dim Vysledok, Hladaj(), i As Long
Vysledok = "No Shortage"
Hladaj = wsList.Range("J4:AW4").Value
For i = 1 To UBound(Hladaj, 2)
If Hladaj(1, i) < 0 Then
Vysledok = wsList.Range("J1:AW1").Cells(i).Value
Exit For
End If
Next i
wsList.Range("L7").Value = Vysledok
End Sub
Raz som sa pokúšal niečo trošku podobné spáchať známemu do práce na uľahčenie identifikácie, kedy vznikol problém. Tam sa jednalo o 100-200 GB takýchto logov. To bolo pár desiatok senzorov na jednom mieste, tých miest desiatky po celom svete, a vždy asi do 5 druhov úplne iných dát a s iným časovaním. Každú sekundu, každé 3, akokoľvek rýchlo sa len dalo a nepravideľne, každých približne 5 s ale iba v noci, atď. Zariadenia spolupracovali interkontinentálne. On mal spätne aj rok dozadu zisťovať, kedy sa začali kumulovať odchýlky, ktoré nakoniec po roku viedli spolu k problému. Presnosť na 5-6 desatín. To bolo nevyriešiteľné. Nakoniec sme to vzdali.
Ale myslím, že sme vtedy došli k záveru, že sme považovali všetky hodnoty za stálu pokiaľ neprišlo k zmene. Vtedy sme v PowerQuery vypĺňali hodnoty smerom nadol po sekundách predchádzajúcou hodnotou. Takže by to asi mohlo byť, tak ako to máte - nájde prvý menší čas. Aspoň to. Ešte skúsim porozmýšľať, ale nič nesľubujem.
Po započítaní stabilizácie 0:30 a začiatku v A6 je oblasť DATA M35:AS186 a MAX je 51,6. A tá nastala na riadkoch 91-130 sond 51 a 53. Teda všetky posuvy stabilizácie, ktoré nastavia začiatok oblasti DATA na riadky od 35-130, budú mať rovnaké MAX. Až keď nastavíme stabilizáciu na 2:06 (alebo nastavíme začiatok na A101 a stabilizáciu na 0:30) sa dostaneme na iné MAX a to 51,5.
Ale inak je tam dosť skreslení. Tie dáta ťaháte pomocou vzorcov z listov sond, ale nie presne v daný čas a približne -> menší nájdený. Nie každá sonda loguje v rovnaký čas. Potom to skresľujete pripočítaním stabilizácie, kde sa hľadá tiež približný menší čas (neviem odkiaľ sú tie časy v Vyhodnocení!A:A, každopádne logicky nekorešpondujú s časmi a hodnotami v listoch sond). Potom sa to ešte znepresňuje pomocou "nejistotaT". Takže MIN a MAX je deformované. A navyše pri výpise názvov sond sa nezohľadňuje deformované MIN MAX. A logicky ani nemôže, lebo by mohla nastať situácia, keď by sa deformovaný (dopočítaný) MIN/MAX reálne v sondách nenachádzal, a zoznam sond by bol prázdny. Teda zoznam sond nezodpovedá MIN/MAX.
Ale možno nad tým len veľa uvažujem, takto na noc ...
Konkrétny príklad:
Začíname na A101, stab. 0:30, neistota 0,5 : MAX je 52 - v oblasti sa ale vôbec nenachádza.
Ale bez tej korekčnej (no zároveň deformujúcej) stabilizácie a neistoty, to nebude zodpovedať tiež. Viď vyššie, ale aj prípad, keď posunutý čas má oveľa bližšie napr. väčšiemu maximu o riadok/sekundu nižšie, pričom sa bude ale počítať údaj oveľa ďalej od nameranej hodnoty (čas - stabilizácia).
Múdre hlavy, kde ste? Na pive?
Idem spať...
Nemám Excel s funkciou UNIQUE, a ani ju v tomto prípade netreba. Za predpokladu, že sú dáta v A:A zoradené, by som rozsah oblasti dát určil pomocou MIN, MAX a OFFSET. Potom už iba maticový COUNTIF a TEXTJOIN.
A ešte vysvetlite ten "Čas stabilizace" a "Nejistota měření teplota"
Skontrolujte popis a prílohu. Vami udávané príklady (42,7) sa tam nenachádzajú.
Oblasť dát "DATA":
=OFFSET(Vyhodnocení!$M$1:$AS$1;MATCH(Úvod!$B$2;Vyhodnocení!$A:$A;0)-1;;MATCH(MAX(Vyhodnocení!$A:$A);Vyhodnocení!$A:$A;0)-MATCH(Úvod!$B$2;Vyhodnocení!$A:$A;0)+1)
=POSUN(Vyhodnocení!$M$1:$AS$1;POZVYHLEDAT(Úvod!$B$2;Vyhodnocení!$A:$A;0)-1;;POZVYHLEDAT(MAX(Vyhodnocení!$A:$A);Vyhodnocení!$A:$A;0)-POZVYHLEDAT(Úvod!$B$2;Vyhodnocení!$A:$A;0)+1)
MIN / MAX:
=MIN(DATA)&" / "&MAX(DATA)
SONDA:
=TEXTJOIN(",";TRUE;IF(COUNTIF(OFFSET(DATA;;COLUMN(Vyhodnocení!$M$1:$AS$1)-13;;1);MIN(DATA))>0;Vyhodnocení!$M$3:$AS$3;""))&" / "&TEXTJOIN(",";TRUE;IF(COUNTIF(OFFSET(DATA;;COLUMN(Vyhodnocení!$M$1:$AS$1)-13;;1);MAX(DATA))>0;Vyhodnocení!$M$3:$AS$3;""))
=TEXTJOIN(",";PRAVDA;KDYŽ(COUNTIF(POSUN(DATA;;SLOUPEC(Vyhodnocení!$M$1:$AS$1)-13;;1);MIN(DATA))>0;Vyhodnocení!$M$3:$AS$3;""))&" / "&TEXTJOIN(",";PRAVDA;KDYŽ(COUNTIF(POSUN(DATA;;SLOUPEC(Vyhodnocení!$M$1:$AS$1)-13;;1);MAX(DATA))>0;Vyhodnocení!$M$3:$AS$3;""))
Práveže je to úplne bežná vec, že človek naimportuje data ako text z textového súboru (áno CSV export je textový súbor), a nesprávne priradí/nepriradí formát dát. Tým pádom je dátum text. V správnom formáte je totiž dátum číslo. Museli by ste dať prílohu.
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.