Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Prosím o vytvoření makra v excelu.

Zdravím, potřeboval bych vytvořit makro a ještě nikdy jsem to nedělal :/. Potřeboval bych makro, které vezme sloupec, např sloupec B, projede ho a udělá to, že sečte všechny buňky, které začínají A, poté zvlášť ty které začínají B a ještě ty, které začínají C. Výsledky těch počtů uloží do konkrétních buněk. Takže počet buněk, kde obsah začíná A je 10 a těch 10 tedy uloží do nějaké buňky zvlášť a to udělá u dalších buněk sloupce, které začínají B a C. Tohle by třeba nemuselo být tak těžké, pokud to někdo udělá a i vysvětlí, budu vděčný, rád se přiučím. Pokud by to bylo tedy lehké, ještě je zde jedna věc. Potřeboval bych ty výsledky dále "rozsekat". Ve sloupci C mám k těmto datům také čas např. 10:40 10:45 11:30 12:35 atd. Šlo by, aby to makro projelo nejprve první písmeno ve sloupci B, zde zjistilo, zda začátek odpovídá A, B nebo C, a pokud ano, tak by ještě mrknul na čas a zařadil do nějaké buňky, abych poznal, zda to bylo např. mezi 10 a 11, nebo mezi 11 a 12 nebo mezi 12 a 13 .... A prostě mi to seřadil pod sebe i podle času? Má teorie je, že by nějak mrknul do sloupce B, (countA, countB, countC =0) zde by jel if první písmeno je A, then přičti countA+1, or if první písmeno je B, then přičti countB+1, or if první písmeno je C, then přičti countC+1, else nic nedělej. Pak by vracel hodnoty countA, countB a countC zapsané do určitých buněk. S těmy časy bych vůbec nevěděl ani jak to nějak pobrat, aby to dokázalo vzít. Možná kdyby se jel řádek po řádku, a jel to tak, že by nejprve vzal, zda je v sloupci B na začátku A, B nebo C, udělal by si mezipoznámku, že to bylo třeba A a přitom by mrkl na čas, v kolik to bylo např. 10:35, v tu chvíli by ten čas porovnal nějak if time = 10:xx then je to mezi 10 a 11 a zařadí to do příslušné nové buňky na základě jak prvního písmene ze sloupce B, tak i na základě toho času. Ale já fakt nevím, ani nevím jak ve Visual Basicu dělat. Věděl by někdo nějak poradit a klidně logicky vysvětlit? Moc děkuji.

Předmět Autor Datum
na první problém ti stačí funkce countif - na to makro FAKT nepotřebuješ, to je jedna z úplně základ…
touchwood 19.04.2017 19:35
touchwood
Na countif jsem koukal, ale dělat ho pokaždé u stovek excelů, které tu mám, mi nepřijde zrovna zjedn…
Momoa 19.04.2017 19:40
Momoa
Ako je myslených "stovky Excelov"? Potrebuješ to aplikovať na stovkách PC alebo na jednom PC so stov…
robert13 20.04.2017 08:21
robert13
kontingenčka je na toto hotový kanon na vrabce. :-)
touchwood 20.04.2017 08:45
touchwood
ale rýchly, bez vzorcov a robí, čo potrebuje. Keď nemám vzduchovku ale mám kanón zdarma, ktorý škody…
robert13 20.04.2017 09:06
robert13
kromě toho, že v zadání ty stovky excelů nebyly, tak rovnou říkám, že na to je Excel špatný nástroj.…
touchwood 20.04.2017 09:56
touchwood
nechápem Tvoj názor, ale neberiem Ti ho. Na to, čo popísal, nevidím jednoduchší a dostupnejší nástro…
robert13 20.04.2017 11:07
robert13
Děkuji mnohokrát, hned na to mrknu. Jde o sdílenou složku, kam chodí ty excely a dívá se tam jen pár…
Momoa 20.04.2017 14:57
Momoa
Osobne by som na to asi išiel makrom nadradeného "analyzačného súboru", ktoré by do radu ťahalo údaj…
robert13 20.04.2017 15:24
robert13
:beer: ano, Excel je v tomto případě "Poor man's choice" :-)
touchwood 20.04.2017 18:56
touchwood
Při tvorbě vzorců můžeš mít zapnutý záznam makra - pak se vše, co vytvoříš v sešitu, zaznamená do VB…
Machr55 20.04.2017 08:26
Machr55
Tak ak by Ťa to ešte zaujímalo (veľmi to na to nevyzerá), tak nasledujúce makro z X vstupných súboro…
robert13 21.04.2017 11:51
robert13
P.S. samozrejme, vo vyššie uvedenom príklade ide o ukážku pre odskúšanie na skúšobných súboroch. Pri…
robert13 21.04.2017 14:28
robert13
Ospravedlňujem sa, po opätovnom prečítaní dotazu som zistil, že sa nemá jednať o súčet hodnôt v stĺp… poslední
robert13 22.04.2017 08:23
robert13

na první problém ti stačí funkce countif - na to makro FAKT nepotřebuješ, to je jedna z úplně základních funkcí Excelu.

Na druhý problém můžeš použít seřazení datové oblasti nejprve podle vypočtené buňky/sloupce pomocí vzorce ZLEVA, která vezme první znak) ze sloupce B a následně (sekundárně) podle sloupce času. Taky celkem triviální.

Ako je myslených "stovky Excelov"?
Potrebuješ to aplikovať na stovkách PC alebo na jednom PC so stovkami súborov na spracovanie? Na stovkách PC by si totiž musel tiež doplniť do ich súborov modul s makrom a to je pri tak jednoduchej úlohe skoro tak "náročné" ako tam doplniť vzorce...
Ale áno, dá sa to...
Predtým však dávam na zváženie jedno elegantné a veľmi rýchle riešenie prostredníctvom kontingenčnej tabuľky. Prikladám ukážku princípu, ktorý rieši to, čo potrebuješ.
Máš to pozoskupované podľa písmen aj podľa časov... máš k dispozícii celkové súčty a možnosť filtrácií...
Nemusíš riešiť vzorce či funkcie, len do príslušného hárka nadefinuješ pár klikmi parametre kontingenčnej tabuľky.

kromě toho, že v zadání ty stovky excelů nebyly, tak rovnou říkám, že na to je Excel špatný nástroj. Neříkám, že to v něm udělat nejde, ale není to elegantní, ani účelné.

Osobne by som na to asi išiel makrom nadradeného "analyzačného súboru", ktoré by do radu ťahalo údaje zo všetkých čiastkových súborov zdieľanej zložky a vytváralo súhrnnú tabuľku, ktorej riadkami by boli identifikátory autorov dielčích súborov a stĺpcami by boli súčty podľa písmen a hodín...
Po Tvojej doplňujúcej informácii však dávam za pravdu Touchwoodovi, čím sa mu ospravedlňujem (touchi :beer:). Excel je v takomto prípade akýmsi "núdzovým" riešením, ale keďže inými nástrojmi ani znalosťami nedisponujem, tiež by som si to vyriešil Excelom. Za jednoznačnej nutnosti dodržiavania pravidiel autormi čiastkových vstupných súborov! V opačnom prípade by sa riešenie komplikovalo exponenciálne k nedisciplinovanosti autorov zdrojov.

Při tvorbě vzorců můžeš mít zapnutý záznam makra - pak se vše, co vytvoříš v sešitu, zaznamená do VBA a můžeš to použít opakovaně ve více sešitech (pravděpodobně po mírných úpravách). Tím se taky seznámíš se syntaxí jazyka VBA.
Jinak na studium (nejen) VBA doporučuji tenhle web.

Tak ak by Ťa to ešte zaujímalo (veľmi to na to nevyzerá), tak nasledujúce makro z X vstupných súborov v zdieľanom adresári s rovnakou štruktúrou dát v hárku s názvom "zdroj" (vystaval som to na niekoľko kópií mojej vzorovej tabuľky, ktorú som prikladal minule) vytvorí X hárkov kontingenčných tabuliek v "analyzačnom súbore" KT.xlsm, ktorý sa musí nachádzať tiež v onom zdieľanom adresári a ktorý obsahuje toto makro.
T.j. v súbore KT.xlsm sa spustením makra vytvárajú hárky kontingenčných tabuliek, zodpovedajúce príslušným vstupným čiastkovým súborom, pričom každý hárok dostane pridelený názov podľa názvu zdrojového súboru.
Nie je vylúčené vyhotovenie jednej sumarizačnej kontingenčnej tabuľky namiesto týchto individuálnych, ale keďže si sa neozval kvôli ďalším doplňujúcim informáciám, tak som narýchlo zbuchol takúto ukážku.
Po zmene vstupných údajov sa kontingenčné tabuľky samé neaktualizujú. Tu je to však vyriešené nie formou aktualizácie, ale vyhotovením celej analýzy nanovo, keďže k dispozícii môžu byť už iné súbory...

Sub Vypisy_KT()

    On Error GoTo Chyba
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ChDir ActiveWorkbook.Path
    
    If ActiveWorkbook.Sheets.Count > 1 Then
        For i = 1 To ActiveWorkbook.Sheets.Count - 1
            Sheets(1).Delete
        Next i
    End If
    
    Application.DisplayAlerts = True
    
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(ActiveWorkbook.Path)
    Set fc = f.Files
    
    i = 1
    j = 1
    
    For Each f1 In fc
    
        If f1.Name = "~$KT.xlsm" Or f1.Name = "KT.xlsm" Then GoTo Dalsi

        Sheets(j).Select
        Range("A1").Select

        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="[" & f1.Name & "]zdroj!R1C1:R10C3", _
        Version:=xlPivotTableVersion14).CreatePivotTable TableDestination:=Range("A1"), TableName:="KT" & i, DefaultVersion:=xlPivotTableVersion14
        ActiveSheet.Name = Left(f1.Name, Len(f1.Name) - 5)
        With ActiveSheet.PivotTables("KT" & i).PivotFields("názov")
            .Orientation = xlRowField
            .Position = 1
        End With
        ActiveSheet.PivotTables("KT" & i).AddDataField ActiveSheet.PivotTables("KT" & i).PivotFields("počet"), "Súčet z počet", xlSum
        With ActiveSheet.PivotTables("KT" & i).PivotFields("čas")
            .Orientation = xlRowField
            .Position = 2
        End With
        Cells(3, 1).Group Start:=True, End:=True, Periods:=Array(False, False, True, False, False, False, False)
        Sheets.Add After:=Sheets(Sheets.Count)

        j = j + 1
    
Dalsi:
        i = i + 1
    Next
    Sheets(1).Select
    Exit Sub

Chyba:
    MsgBox "Chyba"

End Sub

P.S. samozrejme, vo vyššie uvedenom príklade ide o ukážku pre odskúšanie na skúšobných súboroch.
Pri skúšaní je potrebné si uvedomiť napr. to, že hárky súboru KT.xlsm sú pomenovávané názvami vstupných súborov a keďže dĺžka názvu hárku je obmedzená, musia tento fakt rešpektovať i názvy vstupných súborov.

Nasledujúce prílohy si ulož do spoločného adresára, otvor súbor KT.xlsm (povoliť spúšťanie makier) a spusti v ňom makro Vypisy_KT...

Môžeš si vytvoriť dalšie súbory zdroj..., pomeniť v nich údaje a spúšťať makro...

P.S. P.S. Ako vidím, v prílohe sa zmenila veľkosť písma v názve súboru. Po stiahnutí budeš musieť premenovať súbor kt.xlsm na KT.xlsm

Ospravedlňujem sa, po opätovnom prečítaní dotazu som zistil, že sa nemá jednať o súčet hodnôt v stĺpci tabuľky "počet", ale o počet výskytov podľa zoskupinovaného času. Týmpádom je v kontingenčnej tabuľke potrebné definovať dvakrát stĺpec času, raz v poli menoviek riadkov a raz v poli výpočtov, stĺpec B zdrojovej tabuľky je bezpredmetný.
Dielčia kontingenčná tabuľka má teda vyzerať ako v priloženom súbore.
V tomto zmysle je potrebné zmeniť i makro, čo urobím, ak je dotaz ešte aktuálny, najskôr však v pondelok (som na inej verzii Excelu)

Zpět do poradny Odpovědět na původní otázku