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)).
Všimnul jsem si dvou problémů.
V kódu dotazu má být:
html = Text.Replace(html_maska, "<<Datum>>", Date.ToText(datum, "d.M.yyyy") ),
Tj. ve formátu má být "M" a ne "m". Jinak stránka vrací (zřejmě) poslední data.
Dále je vhodné zakázat aktualizaci dotazu na pozadí:
Pravý klik na na dotaz "Table 0", vlastnosti, zrušit zaškrtnutí u "povolit aktualizaci na pozadí".
Adresa v dotazu je normální text. V PQ se to opraví snadno:
let
datum = #date(2022,2,9),
html_maska = "https://www.kurzy.cz/~nr/kurzy-men/nejlepsi-kurzy/EUR-euro/D-<<Datum>>-Ordb--Ord--Z-3-s-/",
html = Text.Replace(html_maska, "<<Datum>>", Date.ToText(datum, "d.m.yyyy") ),
Zdroj = Web.Page(Web.Contents(html)),
...
Datum je tu natvrdo, nenapsal jsi, kde se má brát. Asi bych ho četl z listu.
ve vba je to podobné:
Dim wb As Workbook
Dim dotaz As String
Set wb = ThisWorkbook
dotaz = wb.Queries("Table 0").Formula
v proměnné dotaz je text dotazu. Musíš jen najít datum, nahradit ho a vrátit opravený dotaz zpět.
Za mne je řešení přes PQ snažší.
Dotazuješ se na jméno souboru v jednom dotazu a soubor čteš v jiném. To vadí ochraně osobních dat. V prostředí PQ jde o hlášení Formula.Firewall.
Když to provedeš v jednom dotazu, tak to projde.
// Zdroj
let
Soubor = Excel.CurrentWorkbook(){[Name="FPath"]}[Content][Column1]{0},
Zdroj = Table.FromColumns({Lines.FromBinary(File.Contents(Soubor), null, null, 1250)})
in
Zdroj
Ochrana se zablokuje v nastavení. Tam se dostaneš z excelu:
Data/rozbalit "Načíst data"/"Možnosti dotazu"
Nebo z prostředí PQ:
Soubor/Možnosti a nastavení/Možnosti dotazu.
V dialogu : Ochrana osobních údajů/Vždycky ignorovat....
Zkuste v nastavení, ochrana osobních údajů, zadat vždy ignorovat.
Problematika typů u pq je dost složitá. Tak jen krátce.
Pokud přidáte sloupec a deklarujete typ, tak je to deklarace jen na úrovni tabulky. Obsahu jednotlivých buněk netýká se to netýká a pokud nějaký typ požadujete, je to nutné ošetřit ve funkci.
Tohle bude fungovat
let
Zdroj = Table.FromList({1 .. 10}, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Přidané: Vlastní" = Table.AddColumn(Zdroj, "Vlastní", each "asg", Int64.Type)
in
#"Přidané: Vlastní"
a sloupec "Vlastní" bude deklarován jako celé číslo.
Jinak řečeno: V tabulce se deklarují "typy" sloupců, ale tyto typy nemusí odpovídat typu jednotlivých buněk.
Navíc během výpočtu na deklarovaném typu moc nezáleží, hlídají se hlavně typy předávané funkcím.
Navíc k přepsání deklarovaného typu dochází v procesu zpracování běžně.
Změna typu je něco jiného, tam občas dochází ke skutečné korekci dat.
Typ má ale význam při interakci s okolím. Tj. v případě exportu tabulky do listu, kt, datového modelu je k typu přihlíženo.
Závěr: Nastavení typu je důležité na konci zpracování. V procesu výpočtu je potřebné jen výjimečně.
ps. Přidávání sloupce nebo oprava sloupce. Pokud má tabulka pár řádků je to jedno. Když má pár (desítek) miliónů řádků , tak to jedno není.
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.