Tak napr. spojené pole a Application.Vlookup. Ak toho bude veľa, tak rýchlejšia bude kolekcia. Urobená obdobne - spojený kľúč. Prípadne namiesto IsEmpty() použiť asi rýchlejšie LenB()=0. Každopádne v prvom rade sa zbaviť "prázdnych" desaťtisícov riadkov.
"vlookup z jiného listu" - tým myslíte z iného zošitu, áno? A zatvoreného?
Príloha?
Sub pokus()
Dim a_bunka_r As Long, c_sn As Long
Dim subor As String, cesta As String, lst As String
a_bunka_r = 4
c_sn = 3
subor = "PokusSubor.xlsx"
cesta = "e:\Download\"
lst = "DATA"
With List1.Cells(a_bunka_r, c_sn)
.Formula = "=VLOOKUP(B" & a_bunka_r & ",'" & cesta & "[" & subor & "]" & lst & "'!B2:Z20,21,FALSE)"
.Value = .Value
End With
End Sub
Takže je medzi podmienkami operátor AND? A platí teda, že ak sa nájde prvá podmienka na 6 riadku, tak hľadanie pokračuje logicky až od 6. riadku pre druhú podmienku, a ak nájde 2. podmienku, tak pre tretiu začína hľadanie až od riadku s 2. podmienkou?
Inak šlo by to aj maticovým vzorcom
=INDEX(HNV!$B$3:$B$6;MATCH(1;(HNV!$O$3:$O$6=E5)*(HNV!$L$3:$L$6=C5)*(HNV!$Q$3:$Q$6=H5);0))
=INDEX(HNV!$B$3:$B$6;POZVYHLEDAT(1;(HNV!$O$3:$O$6=E5)*(HNV!$L$3:$L$6=C5)*(HNV!$Q$3:$Q$6=H5);0))
Naschvál som tam pridal aby bola zobrazená pomlčka v tých bunkách so vzorcami v stĺpci Zařízení, aby neboli prázdne. Aby Vás trklo, že tam niečo je. Vidíte, že je tam vzorec odkazujúci na hlavičku Tabuľky? A tie krásne červeno+zelené dvojice súvisiacich dát (teda názov zariadenia+spotreba) mali byť jasné - pridávate dvojice stĺpcov, NIE RIADKY.
Riadky Tabuľky pridávate iba v prípade nedostatku predimenzovaných riadkov v ktoromkoľvek stĺpci, a to natiahnutím za pravydolný roh. Najskôr si ale posuňte tie spodné tbl. Samozrejme má Tabuľka vlastnosť automatického pridávania riadkov pripísaním dát do niektorého stĺpca, ale keďže vidím, že ste schopný prepísať ručne aj stĺpec so vzorcom, tak preto vravím ťahať za pravýdolný roh.
Ak tam chcete dať zariadenie ako zdroj energie, tak ho zapíšte so zápornou spotrebou. No akékoľvek počítanie prijatej energie z nestálych zdrojov diskvalifikuje celý výpočet - je nestabilné. Veď ten solár predsa nedodáva 24/7...
No ak ste dal povoliť pri otvorení súboru, tak fakt netuším, čím je táto hláška spôsobená. Ale vynašiel ste sa. Každopádne makro nepotrebujete, ak tie dáta ostávajú v Exceli. Potom je to zbytočný krok, a stačí to PQ.
PQ: A čo sa Vám na tom nezdá? Veď to dáva správny výsledok.
Iba v prípade, že súbor obsahuje diakritiku zmeňte
Encoding=1250
na
Encoding=65001
V PQ od "veny" je iba 1 parameter navyše, ktorý môj PQ nežerie, ak ani Váš, tak si parameter zmažte
#"Přidané: Index" = Table.AddIndexColumn(#"Změněný typ", "Index", 0, 1, Int64.Type),
na
#"Přidané: Index" = Table.AddIndexColumn(#"Změněný typ", "Index", 0, 1),
Inak oba PQ dávajú rovnaký výsledok. Len "lubo" konvertoval GB/US hodnoty na CZ a "veny" nie.
"Marekh" napsal/a:
ale pak při exportu do původního formátu zase ano.
Upozornenie vybehne, aj keď je spustené iné makro. Tu je príklad.
Aktivujte si v
Workbook_Open
Workbook_BeforeClose
variant, ktorý chcete.
Maticový vzorec (Ctrl+Shift+Enter) ?
=INDEX($C$3:$C$8;MATCH(MIN(IF($B$3:$B$8>=F3;$B$3:$B$8-F3;FALSE));IF($B$3:$B$8>=F3;$B$3:$B$8-F3;FALSE);0))
=INDEX($C$3:$C$8;POZVYHLEDAT(MIN(KDYŽ($B$3:$B$8>=F3;$B$3:$B$8-F3;NEPRAVDA));KDYŽ($B$3:$B$8>=F3;$B$3:$B$8-F3;NEPRAVDA);0))
prípadne
=LOOKUP(MIN(IF($B$3:$B$8>=F3;$B$3:$B$8-F3;FALSE));IF($B$3:$B$8>=F3;$B$3:$B$8-F3;FALSE);$C$3:$C$8)
=VYHLEDAT(MIN(KDYŽ($B$3:$B$8>=F3;$B$3:$B$8-F3;NEPRAVDA));KDYŽ($B$3:$B$8>=F3;$B$3:$B$8-F3;NEPRAVDA);$C$3:$C$8)
ale to je to isté. Nič iné ma nenapadá.
Samozrejme že nie. Veď väčšina omáčky je tam samozrejme kvôli počítaniu a zobrazovaniu požadovaných vecí. Ak len blikanie, tak takto.
"PavDD" napsal/a:
...principielně je to co jsem chtěl...
Ak by som vedel, či sa jedná len o tieto 2 riadky, alebo o nejakú oblasť (podľa čoho ju určiť?), a či každý riadok tej viacriadkovej oblasti začína na
"ExcludeInput = ", tak sa dá urobiť krátke makro, ktoré ten súbor vytvorí jednoduchšie, rýchlejšie, bez prebliknutia obazovky.
To myslíte Vážne, že neviete na čo slúži premenná Seconds a AllSeconds??? Nechceli ste náhodou počítať sekundy?
...
Veď ste chcel, aby sa formulár zatvoril po ubehnutí času. Teraz chcete presný opak.
Timer sa MUSÍ ukončiť. Či už na tom riadku po dopočítaní času alebo v Terminate formulára.
PS: Je to aj v popise v makre, ale ešte raz: Nemôžete meniť tie milisekundy bez rozmyslu. Je to celé nastavené podľa požiadavky na 0,5 sekundové úseky, teda sa kontroluje každý druhý úsek po 0,5 sek, že nastala celá sekunda. Na to je tam toIf SemiSeconds Mod 2 = 1 Then
Pri zmene MILISECONDS treba preprogramovať počítanie, kedy nastala celá sekunda. Chápeme sa?
@Barth: Výber objektu ListBox1 by som zjednodušil na miesto cyklu na toto
On Error Resume Next
Set lb = .OLEObjects("ListBox1").Object
On Error GoTo 0Pridal som Váš kód do prílohy, aby bolo vidieť vizuálnu organizáciu kódu.
To je nevýhoda pripnutia iba kódu do príspevku, že sa stratí práve tá vizuálna organizácia kódu, ktorá by uľahčila čítanie. No a potom, fórum pridá medzi každé riadky jeden navyše, čo spôsobí nefunkčnosť zložených riadkov (so znakom "_" na konci riadku). Je vhodné preto priložiť aj prílohu.
@PavDD: Čo Vám na tom príklade od Barth nejde? Dá sa to v pohode rozbehať, viď vyššie.
Ale Barth má pravdu, že toto rieši niečo trošku iné. Niečo na spôsob KT.
Myslíte VBA UserForm ?
No ak to chcete na časti menšie ako 1s (obmedzenie Application.OnTime) tak jedine API Timer. Toto som otestoval na E2010-32bit a E2019-64bit
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.