Zavrieť

Porady

Excel - makro pracujuce s dynamicky sa meniacimi datami

Dobry den,

dlhsie sa trapim s problemom dynamickych dat. V jednoduchosti rozpisem moju zakladnu ulohu:


a) Mam nasledujucu tabulku v Zosit_1:

A B
1 Nazov Cislo
2 W 100
3 X 200
4 Y 300

b) Chcem vytvorit take makro, ktore mi vytvori v Zosit_2 takyto obsah:

A B C
1 Nazov Cislo 1. cislica B
2 W 100 1
3 X 200 2
4 Y 300 3

Toto viem naucit makro jednoducho tak, ze skopirujem stlpec A zo Zosit_1 do Zosit_2, funkciou VLOOKUP() vyplnim v nom stlpec B a pomocou funkcioe LEFT() stlpec C.


Problem, ktory potrebujem vyriesit je, ze makro si pamata tieto operacie len pre staticku tabulku v Zosit_1. Ako docielim dynamicku pracu makra?

V Zosit_1 mi pribudne Riadok 5:

A B
1 Nazov Cislo
2 W 100
3 X 200
4 Y 300
5 Z 400

a makro zareaguje na toto doplnenie tak, ze Zosit_2 bude vyzerat:

A B C
1 Nazov Cislo 1. cislica B
2 W 100 1
3 X 200 2
4 Y 300 3
5 Z 400 4


Budem Vam velmi vdacny za pomoc,

Igor.
Naposledy upravil jan.maticky : 27.04.16 at 15:52
Pravidlá a tipy
  • Každý móže napísať len 1 odpoveď. Neskor mozete svoju odpoveď vylepšiť.
  • Odpoveď má priniesť riešenie na otázku, vyvarujte sa hodnotenia otázky.
  • Odpoveď má byť viac o faktoch ako o názoroch.
Dalšie pravidla a tipy
    Ak potrebujete v otázke niečo upresniť, najskôr sa spýtajte na podrobnosti.
    Koncept slúži na uloženie rozpracovanej odpovede, koncept sa zobrazuje len Vám, až kým ho nezverejníte.
    Ak máte podobnú otázku, založte Novú otázku alebo Súvisiacu otázku.
    ❤ Buďte priateľskí ❤
    Sme súčasťou jednej komunity, ktorá si chce vzájomne pomáhať, rozdieľnosť je vítaná ak neubližuje!
    Usporiadať podľa času

    mepex je offline (nepripojený) mepex

    mepex
    Sub Macro1()
    Range("A1").Select
    Selection.CurrentRegion.Copy
    PocetRiadkov = Selection.CurrentRegion.Rows.Count

    Workbooks.Add
    ActiveSheet.Paste
    Range("C1") = "1.Cislo"

    Range("C2:C" & PocetRiadkov).Select
    Selection.FormulaR1C1 = "=VALUE(LEFT(RC[-1],1))"
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A1").Select
    End Sub
    Naposledy upravil mepex : 05.05.16 at 14:49
    5 komentáre - rozbaľ     zbaliť
    jan.maticky Dakujem velmi pekne. Mohol by som poprosit upravit konkretny kod v excelovskom subore, ktory som prave pridal? Vola sa Priklad.xlsx a je v uvodnej sprave.


    Dakujem za ochotu,

    Igor.
    mepex Nedá sa nič upraviť, lebo súbory s makrami majú mať príponu .xlsm (tento súbor neobsahuje makrá práve kvôli prípone - Excel o tom aj varoval). Možné uložiť aj s príponou .xls, vtedy makrá obsahuje.
    jan.maticky Ahoj, pridal som do povodnej spravy excelovsky subor v pozadovanom formate.

    S vdacnostou Igor.
    jan.maticky Ahoj, pridal som do hlavnej spravy subor Priklad_v2_Workbook.xlsm. Mohol by si mi ho upravit?


    Dakujem,

    Igor.
    mepex Doplnil som do mojej odpovedi prílohu s upraveným makrom.
    MePEx
      zbaliť

    PaloPa je offline (nepripojený) PaloPa

    PaloPa
    Kód od Mepexa je OK, aj keď bude pridaný nový riadok, ale zdrojová oblasť bude súvislá (zabezpečuje "CurrentRegion").

    V prípade ak by bola zdrojová oblasť s prázdnym riadkom, treba kód upraviť nasledovne. (Vrátane ošetrenia vzorca LEFT, aby nehodil chybu v prípade prázdnej bunky):
    Code:
    Sub Macro1()
    
    ' OK pre súvislú oblast
        ' Range("A1").Select
        ' Selection.CurrentRegion.Copy
        ' PocetRiadkov = Selection.CurrentRegion.Rows.Count
        
    ' Pre oblast s prázdnym riadkom
        PocetRiadkov = Range("A50000").End(xlUp).Row - Range("A1").Row
        Range("A1", Range("B1").Offset(PocetRiadkov, 0)).Copy
    
    
    Workbooks.Add
    ActiveSheet.Paste
    Range("C1") = "1.Cislo"
    
    Range("C2:C" & PocetRiadkov + 1).Select
    
    ' Selection.FormulaR1C1 = "=VALUE(LEFT(RC[-1],1))"
    Selection.FormulaR1C1 = "=IFERROR(VALUE(LEFT(RC[-1],1)),"""")"
    
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A1").Select
    
    End Sub
    Naposledy upravil PaloPa : 29.04.16 at 14:34 Dôvod: Verzia 3
    8 komentáre - rozbaľ     zbaliť
    jan.maticky Ahoj, nefunguje mi Tvoja excelovska uprava. Nereaguje to na pridanie riadkov.
    PaloPa Skus pls podrobnejšie popísať, ako robíš celý postup, mne to funguje OK.
    PaloPa Pridal som aj tvoje upravené riešenie: Priklad_v2_Workbook.zip
    jan.maticky Dakujem, presne tak som to myslel. Tvoj kod funguje tak ako som chcel. Chcem Ta este poziadat, mohol by si tam nieco doplnit? Ked sa zrusia niektore riadky, dava tam "N/A". Na rozsirenie reaguje OK, ale ked sa znizi pocet riadkov, tak to vyhadzuje chybu. Velke DAKUJEM.
    PaloPa Do kódu som pridal riadok, ktorý najskôr premaže staré dáta v cieľovom liste ( Rows("2:30000").Delete Shift:=xlUp 'Mazat stare
    ). Viď Priklad_v3_Workbook.zip
    jan.maticky Dakujem krasne :-). Ako mam chapat tych 30.000? Tolko riadkov vymaze v cielovom zosite? Vies, pracujem este s vyssim poctom riadkov. Excel konci riadkom 1.048.576 a konci stlpcom XFD.
    Ako mam chapat tych 30.000?

    Dakujem,

    Igor.


    P. S.: Kod ma este jednu chybicku krasy. Ked mas napr. 10 riadkov a 5. vymazes, da do cieloveho N/A. Chapem preco. Posuvat riadky na hor by to chcelo asi nejakou funkciou, ze?
    PaloPa Ad 30000: Má význam "x krát rádovo viac ako bude reálne použitých", zmeň si kľudne i na 1 mil.

    Ad N/A: "Delete Shift:=xlUp" znamená "maž a posuň riadky nahor", to už tam je.
    Ale chybu 10 vs 5 zmazaných zopakovať neviem. Skús pls podrobnejšie popísať postup (krok za krokom) , ako sa vygenerovala
    jan.maticky Ahoj, mozeme sa skontaktovat v realnom case (telefonicky, a pod.)? Tak by sa to vysvetlilo najlepsie. Prosim, napis mi svoj kontakt spravou na e-mail jan.maticky@gmail.com.

    Dakujem.
      zbaliť

    Excel - makro pracujuce s dynamicky sa meniacimi datami

    Porady, ktoré by vás mohli zaujímať

    Prihláste sa a sledujte len tie Porady, ktoré Vás zaujímajú.