Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Excel - úprava kopírujícího makra

Ahoj, potřeboval bych poradit s makrem, které kopíruje data po změně hodnot na jiný list. To se mi podařilo sestavit, ale potřeboval bych tam ještě doladit pár věcí:
V daném souboru je umístěno makro, které po spuštění konkrétního tlačítka přidá do tabulky jeden prázdný řádek. Když se přidá nový řádek, tak se kopíruje jako změněný na nový. Rád bych, aby se přidáním řádku kopírování nespouštělo.
Dosavadní kód přikládám níže:

Private Sub Worksheet_Change(ByVal Target As Range)
        
    ChngRow = Target.Row

SrcRange = "A" & ChngRow & ":K" & ChngRow
Range(SrcRange).Copy
With Sheets("History").Range("A" & Rows.Count).End(xlUp).Offset(1)
    .PasteSpecial Paste:=xlPasteColumnWidths
    .PasteSpecial Paste:=xlPasteValues
End With
    Application.CutCopyMode = False
    
   Worksheets("History").Range("L" & Rows.Count).End(xlUp).Offset(1).Value = Now
Sheets("History").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Environ("username")

End Sub

Mnohokrát děkuji za jakoukoliv pomoc. bloom

Předmět Autor Datum
Nezdá se Ti, že by bylo lepší, abys nám rovnou vyklopil, čeho chceš ve výsledku dosáhnout a na co to…
MachR55 25.03.2014 16:59
MachR55
Já vím, že takhle to působí zmateně, ale dostal jsem určité zadání v práci, které šéf v průběhu mění…
bloom 25.03.2014 21:37
bloom
OK, měnící se zadání - zvláště je-li autorem šéf - znám velmi dobře, cítím s Tebou ]:) Ad 1) To už…
MachR55 26.03.2014 12:56
MachR55
Tak 1) vyřešeno, moc díky za radu. :) Bohužel mi bylo přidáno ještě 3), tak ještě poprosím o jednu r…
bloom 26.03.2014 13:51
bloom
Vyřiď šéfovi, ať si nevymejšlí ;-) Pokud bude editace buňky ukončena klávesou ESC, změna se nevyvolá… poslední
MachR55 26.03.2014 14:21
MachR55

Nezdá se Ti, že by bylo lepší, abys nám rovnou vyklopil, čeho chceš ve výsledku dosáhnout a na co to vlastně potřebuješ, než sem trousit jednotlivé dílčí dotazy?
23.3.: http://pc.poradna.net/q/view/1202395-excel-histori zace-dat
24.3.: http://pc.poradna.net/q/view/1202886-excel-cas-zme ny
24.3.: http://pc.poradna.net/q/view/1202925-excel-makro-k opirovani-radku
25.3.: http://pc.poradna.net/q/view/1203444-excel-spusten i-makra-po-opusteni-radku

K dotazu: v makru přidávající řádek si prvně vypni vyvolání události a pak ji zase zapni:

Application.EnableEvents = False
   < tělo makra s přidáním řádku >
Application.EnableEvents = True

Stačí studovat odkazy, co jsem Ti už dříve poslal: http://office.lasakovi.com/excel/vba-listy-sheet/W orksheet_Change-udalost-listu/

Já vím, že takhle to působí zmateně, ale dostal jsem určité zadání v práci, které šéf v průběhu mění. Bohužel jsem kvůli citlivosti dat soubor nemůžu nahrát. Dostal jsem soubor (ve kterém již bylo vytvořeno to makro, které po spuštění tlačítka přidá řádek navíc) a měl jsem za úkol vytvořit na jiném listu historizaci - tzn. aby se po změně hodnoty v konkrétní buňce tabulky zkopíroval do nového listu řádek se změněnou buňkou, tak jak vypadal před updatem (k tomu ještě s časem změny a jménem osoby, která změnu provedla). To se mi podařilo vytvořit, nicméně je potřeba na tom doladit ještě pár much:
1) aby se kopírování řádku nespustilo, když se pomocí tlačíka spustí makro, které přidá nový řádek
2) aby se kopírování daného řádku spustilo jen po jeho opuštění.

Snad už jsem vše vysvětlil a omlouvám se za zmatky. Děkuji za odpovědi.

OK, měnící se zadání - zvláště je-li autorem šéf - znám velmi dobře, cítím s Tebou ]:)

Ad 1)
To už jsem Ti psal, musíš udělat zásah v tom makru pro přidání řádku (vypnout a pak zapnout vyvolání události)

Ad 2)
Tohle je oříšek, protože xistuje celá řada možností a způsobů, jak lze ukočit editaci buňky (ENTER, TAB, šipky, myší, ...) a v závislosti na tomto ukončení se pak kurzor někam posune (nahoru, dolů, vpravo,...). Tohle obsloužit by bylo značně problematické, navíc bys stejně neošetřil případy, kdy uživatel ukončí editaci buňky klávesou ENTER, což ho hodí na další řádek, ale on se šipkami (nebo kliknutím myší) vrátí zpět do předchozího řádku a ještě něco tam změní (a to udělá třeba 5x).
Nejčistší řešení - editaci buněk umožnit jen pomocí formuláře, který bude obsahovat všechny zadávané hodnoty pro jeden řádek (tj. buňky budou zamčené, nebude je možné ručně editovat).
Formulář buď může být stále zobrazen (pak by měl obsahovat prvky pro pohyb v datech), nebo se může vyvolávat kliknutím na tlačítko či kombinací kláves. Vždy ale bude platit, že bude obsahovat data z jednoho řádku. Dále tam bude tlačítko "Uložit", kterým se ty data uloží do buněk - a taky se hned může vytvořit kopie. Takže makro navázané na změnu buňky už nebude potřeba, vše si budeš obsluhovat z formuláře. Stejně ale nezabráníš třeba tomu, že uživatel bude chtít změnit 3 hodnoty na tom řádku a po každé změně stiskne "Uložit" - budeš mít 3x zálohu.
Druhé řešení je hodně provizorní a bude velice záležet na disciplině uživatelů - na konci řádku bude speciální buňka, do které bude muset uživatel po ukončení editace řádku něco napsat (např. "x") a Ty pak spustíš kopírování (a obsah té buňky vymažeš). Samozřejmě - pokud tam uživatel nic nenapíše, kopie se nevytvoří. Naopak, pokud tam bude zapisovat neustále, budeš mít třeba 20 stejných kopií (šlo by to ošetřit testováním, zda se od posledního zápisu tohoto řádku něco změnilo).
Druhý způsob bych pravděpodobně nepoužil ani v krajní nouzi, jen jsem se tu zmínil, jak to taky jde udělat.

Tak 1) vyřešeno, moc díky za radu. :)
Bohužel mi bylo přidáno ještě 3), tak ještě poprosím o jednu radu:
Rád bych, aby se kopírovací makro nespustilo v případě, když uživatel klikne do buňky, ta se přepne do editace, uživatel v ní ale nic nezmění a nezměněnou ji opustí.
Mohl bych požádat o radu ještě s totuo záležitostí (co kam do kódu doplnit apod.)?
Mnohokrát děkuji. bloom

Vyřiď šéfovi, ať si nevymejšlí ;-)
Pokud bude editace buňky ukončena klávesou ESC, změna se nevyvolá.
Pokud bude editace ukončena kliknutím na jinou buňku, nelze zjistit, zda se obsah buňky změnil či nikoli (opět bys potřeboval znát původní hodnotu). Buď by sis musel v paměti držet obsah celého listu a porovnávat, zda se obsah změnil či nikoli, nebo musíš před zápisem, kopie udělat tyto činnosti:
- zjistit poslední zápis tohoto řádku v kopii
- porovnat nové hodnoty s uloženými a pokud není změna, nezapíšeš. Pokud je změna, zapíšeš.
- pokud řádek ještě zapsán nebyl, musíš ho stejně zapsat (nemáš s čím porovnávat)

Tento požadavek je další argument na komplexní řešení celé úlohy přes formulář.

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