Poznámku o relacích M:N v příspěvku jsem zaznamenal.
Tak ještě jednou možnosti:
a) Upravit strukturu dat (třeba v PQ) a relací M:N se zbavit.
b) Nebo použít virtuální relace pomocí měřítek. Tento přístup je univerzální, jen trochu pracnější. Umožní zohlednit více vazeb. Příklad je uveden výše.
c) A/nebo použít funkci CROSSFILTER k vytvoření relace M:N. V excelu (na rozdíl od jiných implementací) nelze takovou relaci do datového modelu zadat.
Funkce ale umožňuje takovou relaci ve vzorci vytvořit. Je to v běžných případech často jednodušší, než vytváření univerzálního filtru.
Vše se týká datového modelu a výstupu do KT.
Má to snad být něco takového:
=SUMA(List1:List5!A1)
???
Jinak, pokud funkce nevyžaduje odkaz na pole, lze rozsahy i z různých listů skládat do jednoho pole.
např.
=ZVOLIT({1\2}; List2!C1:C6;List3!C1:C6)
složí dva sloupce vedle sebe do jednoho pole.
Možná se dá také použít KT nebo vytvářet souhrn pomocí powerquery.
"skvělý příklad"...
Ty tabulky mají pro spojení je pole Id a ani jednu společnou hodnotu.
Tak tedy obecně.
1. Tabulky převést na tabulky
2. vytvořit kt z jedné tabulky, zatrhhnout "přidat do datového modelu.
3. na data z následujících tabulek je možné se potom odkazovat pomocí virtuálních relací.
Např. pokud budu předpokládat, že pole Id tabulky spojuje, pak např. na prodej se lze dotázat měřítkem:
prodej_rel:=var akt_id = distinct(Tabulka1[id])
return calculate(sum(Tabulka2[prodej]);CONTAINSROW(akt_id;Tabulka2[id] ))
Vhodnější je (např. pomocí power query) dát tabulkám aspoň náznak struktury databáze.
Nechce se mi to zkoumat. Makro je zbytečné.
Podmíněný formát:
Vzorec: =max(C2:C4)>1
formát: červené pozadí
Spíš bych přidal druhý sloupec "datum" a vložil bych filtr "časovou osu". (analýza KT, filtr, vložit časovou osu).
(první datum se v kt automaticky převádí na text, proto ta kopie)
Add manipulace s časem v ose - makro, převést čas na desetinné číslo a vložit do osy.
Pokud jen v excelu, v pomocném sloupci lze kumulativně sčítat tankování. Pokud se má sečíst spotřeba od posledního tankování, tak od kumulativního tankování lze odečíst kum tankování u předchozího ano (viz funkce xlookup, umí hledat od posledního řádku k prvnímu).
Podle dat také funguje
Dim r As Range
Set r = Range("J:J")
r.NumberFormat = "General"
Range("G:G").FormulaLocal = Range("G:G").Value
Nebo lépe:
Sub Makro1()
Dim r As Range
Dim r1 As Range
Dim v() As Variant
Dim i1 As Long
Dim i2 As Long
' vybrat jen texty
Set r = Range("J:J").SpecialCells(xlCellTypeConstants, 2)
For Each r1 In r.Areas
v = r1.Value
For i1 = LBound(v, 1) To UBound(v, 1)
For i2 = LBound(v, 2) To UBound(v, 2)
If IsNumeric(v(i1, i2)) Then v(i1, i2) = CDbl(v(i1, i2))
Next i2
Next i1
r.NumberFormat = "General"
r.Value = v
Next r1
End Sub
Jaké odkazy - do vlastního sešitu, do jiného souboru, do adresáře, někam (onedrive, sharepoint,...), internet, ...
Jsou odkazy v buňce viditelné, nebo jsou schované pod textem?
V čem je problém?
Neumíš načíst samotný hypertextový odkaz?
Neumíš načíst odkaz z tabulky?
Obecná rada/řešení:
Pokud umíš načíst data ze zadaného odkazu, tak vytvoř dotaz, který to provede a přeměň ho na funkci. Odkaz musí být parametrem této funkce.
Potom načti tabulku a na sloupec s odkazem použij Table.TransformColumn, kde transformující funkcí bude ta právě vytvořená.
Taky jde použít průměr:
=PRŮMĚR(FILTER(A4:A2884;--(A4:A2884>0,5)*(--(B4:B2884=E2) + (B4:B2884=F2))*(C4:C2884=G2)))
Pokud tedy máte novější verzi a nechcete pokaždé tabulku řadit, lze použít třeba:
=INDEX(SORT(FILTER(D2:G7;D2:D7=E11);4;-1);1;{3\2})
Matice jsou automatické. Předpokladem je datum-čas ve sloupci G (stačí ve sloupci G nahradit "-" za nic).
V čem to chcete dělat? (verze)
Jen text:
countif(oblast;"*")
2.jak označit v makru více řádků, když v nich kdekoliv mám označeno více buňek.
'zapamatuju si vybrané buňky
dim vybrano as range
Set vybrano = Selection
' vybarvim řádek, kde je nějaká vybraná buňka
vybrano.EntireRow.Interior.Color = vbRed
kopírovat celé tyto řádky/2,5,7,10/, nebo třeba do jiného listu
Dim i As Long
Dim area As Range
Dim list2 As Worksheet
'každý řádek zkopíruje do List2
set list2 = Worksheets("List2")
i = 1
For Each area In vybrano.EntireRow.Areas
With area
list2.Cells(i, 1).Resize(.Rows.CountLarge, .Columns.CountLarge).Value = .Value
i = i + .Rows.CountLarge
End With
Next area
Tahle má asi nejmenší režii:
=A2:INDEX(List1!$D:$D;MAX(KDYŽ(List1!$A:$D<>"";ŘÁDEK(List1!$D:$D);1)))
Vzorec je maticový, ake výrazy v názvech se automatiky vyhodnocují maticově.
Tohle už je volatilní:
=List1!$A$2:POSUN(List1!$D$1;MAX(KDYŽ(List1!$A:$D<>"";ŘÁDEK(List1!$D:$D)));0)
nebo rovnou
=POSUN(List1!$A$2;;;MAX(KDYŽ(List1!$A:$D<>"";ŘÁDEK(List1!$D:$D)));4)
ps.
Když budeš něco podobného ladit, dej ctrl-g a vzorec zapisuj do pole odkaz...
Vzorce jsou šílený. Budu předpokládat, že to není recese. Není vidět, jak velká data budeš zpracovávat a kolik výpočtů k tomu budeš potřebovat.
Max a min - na to jsou funkce:
=MAX(DATA!$D$3:$D147)
Datum a čas výskytu maxima:
=HODNOTA.NA.TEXT(SUMA(INDEX(DATA!$B$3:$C147;POZVYHLEDAT(C2;DATA!$D$3:$D147;0);0)); "d.m.rrrr - hh.mm.ss")
Hledáme jednou, sečteme nalezený datum a čas a převedeme na text.
Výskyty jednoduše:
=HODNOTA.NA.TEXT(SUMA(--(DATA!$D$2:$D147=C2));"(\ 0\x\ )")
Jinak pokud už máš funkce sumif, countif, tak je můžeš použít. I v případě zadání celého sloupce je jejich režie poměrně malá (na rozdíl od jiných funkcí -- sum, max, součin.skalární, ..., které zpracovávají všechny buňky)
V opačném případě se vyplatí udržovat odkazy ručně nebo použít šílenosti typu d3:index(d:d;pozvyhledat(1000000000;d3:d65535)).
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.