Nejste přihlášen/a.
Dobrý den,
hledal jsem, ale nenanšel, proto se ptám:
Jak automaticky např. do buňky A1 vložit AKTUÁLNÍ DATUM, když do buňky B1 napíšu nějakou hodnotu?
Byl bych rád, kdyby to šlo bez makra. Pokud použiju něco jako =KDYŽ(B1<>"";DNES();0) , tak se datumy vždy přepočítají, podle aktuálního data a nezůstane datum při vložení.
Snad je to srozumitelné
Díky,
PP
Datum je pouze a jedině číslo, které se automaticky aktualizuje po půlnoci mikrosofťáckého času.
Znáte funkci paste special - vložit jinak? Jestli ne, pak si ji nastudujte. Tuto funkci budete spouštět makrem, bez kterého se neobejdete.
Jestli chcete zabránit aktualizaci datumu, pak úlohu musíte rozdělit na dvě půlky. Jedna vám ve vaší buňce vytvoří aktuální datum (to umíte) a ve druhé půlce musíte použít funkci paste special - vložit jinak - a vybrat způsob uložení jako hodnota - value. Pak vám ve vaší buňce zůstane to skutečné prvotní datum, které se už nikdy nezmění.
Naučte se ručně vkládat aktuální datum a poté jej vložit jinak, jako hodnotu. Až vám to půjde, potom se ozvěte a já přidám.
Zdravím figurek
Díky za reakci.
Postupu rozumím. Vložit datum ručně zvládám, pokud myslíte kombinaci kláves ctrl+|, ale pak nevím, jak vložit jako hodnotu. Pokud vložím aktuální datum např vzorcem =DNES(), buňku zkopíruju, tak vložit ji jako hodnotu dokážu. Princip tedy chápu, ale nevím jak to celé hodit do makra...
Umím tak akorát nahrát makro
Trochu jsem hledal a zkoušel. Zatím zvládám spustit makro při změně buňky (jen mi to nefguje jen na tu konkrétní buňku, ale na jakoukoli):
Private Sub Worksheet_Calculate()Vidím že se propracováváte mezi pokročilé uživatele. Gratuluji.
Tady máte dalších pár námětů pro experimentování.
*
První makro dělá přesně to, co byste dělal ručně.
Do buňky A1 vloží vzoreček, já jej mám ve tvaru =today(), protože mám americký excel. Tvar =DNES() mi nefunguje, vám možná fungovat bude.
Druhý řádek vezme obsah buňky do schránky a třetí jej vrátí zpátky, vložený jako hodnotu.
Mrkněte se na druhé makro. Je to obdoba prvního, s jedním rozdílem. Abyste adresu buňky nemusel psát třikrát, můžete použít strukturu With-End With. Uvnitř struktury popíšete všechno, co se má s buňkou udělat. Užitečná věc je tato struktura.
Třetí makro je obdoba druhého, ale pro buňky v rozsahu A1 až A10. Na obrázku vidíte, že v buňkách je skutečně vloženo datum a ne vzoreček. Také si zkuste, proč jsem do třetího makra přidal poslední řádek Range("A1").Select
Vyzkoušejte, zaexperimentujte a pak se zase ozvěte. Ukáži vám, jak se makra spouší změnou na listu.
Váš způsob Private Sub Worksheet_Calculate je takový nějaký divný.
*
Sub Macro1()
Range("A1").FormulaR1C1 = "=today()"
Range("A1").Copy
Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub
*
Sub Macro2()
With Range("A1")
.FormulaR1C1 = "=today()"
.Copy
.PasteSpecial Paste:=xlPasteValues
End With
Application.CutCopyMode = False
End Sub
*
Sub Macro3()
With Range("A1:A10")
.FormulaR1C1 = "=Today()"
.Copy
.PasteSpecial Paste:=xlPasteValues
End With
Application.CutCopyMode = False
Range("A1").Select
End Sub
Zdravím figurek a děkuji za rychlou odpověď!
Píšete to tak hezky srozumitelně, že je mi to jasný
Co se týče vzorce =today() apod., tak je znám, dřív jsem používal taky anglický excel. Nicméně, ikdyž mám teď český, v makru to musím mít zadané anglicky (pokud přepíšu na .FormulaR1C1 = "=dnes()" , hodí chybu - to jen tak pro info...
Makro mi tedy funguje a docela ho i chápu. Funkce With a End With je opravdu šikovná (tady by to bylo skoro jedno, ale u složitějších věcí... ).
Ale jak udělat, aby se aktuální datum hodilo jen do vedlejší buňky od té, ve které proběhla změna?
Chtěl jsem něco zkoušet, ale např na tohle mi to háže chybu .FormulaR1C1 = "=if(C11<>"";today();0)" .
Díky za trpělivost!
oukej. Mrknul jsem se na ten váš vzoreček
.FormulaR1C1 = "=if(C11<>"";today();0)"
který samozřejmě už od pohledu fungovat nemůže. Problém jsou uvozovky v uvozovkách. VBA vám takový výraz nevyluští. Kdybyste místo vnitřních uvozovek napsal jakékoliv číslo, pak jej vložíte bez problému, viz obrázek dole.
Ale jak jsem si všiml, vy chcete něco jiného, než jste poptával nahoře v dotaze. Tady máte další dvě makra, mrkněte se na ně, přeneste do svého sešitu a zkuste ručně spustit. Makro5 funguje kdekoliv, Makro6 zafunguje jen pro změny udělané ve druhém sloupci. To je ono konečné finální makro. Něco takového jste chtěl, ne?
On Error Resume Next znamená, že nikdy neuvidíte okno s chybovou hláškou.
If ActiveCell.Column = 2 Then je podmínka pro vložení data. Když aktivní buňka nebude ve druhém sloupci, pak se žádné datum nikdy nikam nevloží. Místo dvojky si můžete dosadit jakékoliv jiné číslo, 3, 4 ,10 atd.
ActiveCell.Offset(-1, 1) je trochu komplikovanější věc. Ve chvíli, kdy vložíte hodnotu a stisknete Enter, pak se aktivní buňka posune o řádek dolů. To znamená, že kdybyste použil Offset(0, 1) by se vám datum vloží o řádek níž. Jednička na pravé straně znamená, že se datum vloží o jeden sloupec napravo. Kdybyste napsal Offset(-1, 3), pak se vám datum vloží o tři sloupce napravo.
Tak, to je myslím jasné, zaexperimentujte a uvidíte.
Teď přijde hlavní věc, jak makra spustit automaticky. Musíte použít to, čemu se říká události listu. Změna buňky je událost, změna obsahu buňky je událost, výpočet na listu je událost a podobně. Událostí spustíte makro, chce to ale vybrat tu správnou událost. Asi ti bude událost change. Něco změníte, stisknete Enter a tím spustíte makro.
Dost těžko se popisuje co teď a jak pokračovat, proto jsem vám udělal obrázek. Poklepejte na jméno listu, tím se vám otevře okno pro události listu. V levém rozbalovacím seznamu vyberte Worksheet, v pravém událost change a do kódu této události vložte volání vašeho makra tak jak vidíte, Call Macro6. Tady už vám nepomůžu, přes tuto překážku se musíte prokousat sám.
Možná taky budete mít trochu problém s formátem data
.NumberFormat = "[$-409]d-mmm-yyyy;@"
Kdyby vám nefungoval tady tento formát, pak pusťte záznamník maker a zaznamenejte makro na formátování datumu nějaké buňky. Pak ten váš správný a fungující formát přeneste do kódu makra. Nic složitého.
Tak přeji mnoho zdaru.
*
Sub Macro5()
With ActiveCell.Offset(-1, 1)
.Value = Date
.NumberFormat = "[$-409]d-mmm-yyyy;@"
End With
End Sub
*
Sub Macro6()
On Error Resume Next
If ActiveCell.Column = 2 Then
With ActiveCell.Offset(-1, 1)
.Value = Date
.NumberFormat = "[$-409]d-mmm-yyyy;@"
End With
End If
End Sub
*
Zdravím Vás...
Opět jasné a polopatické. Během chvilky jsem to zprovoznil!
Chtěl jsem přesně tohle i nahoře, ale je možné, že jsem se vyjádřil nepřesně.
Mám ještě jeden doplňující dotaz, ale ten je úplně jiný a tak asi kvůli přehlednosti/dohledatelnosti založím nové vlákno. Vložím sem záhy odkaz a budu rád, když se podíváte.
Opravdu Vám mockrát děkuju za pomoc, jste zlatej!
doplněno 05.09.13 15:35:Odkaz na doplňující otázku: poradte.cz/...
Rád bych zkrátka sešit zamknul, aby v něm nemohl nikdo nic poplést, ale jakmile zamknu sloupec s datumy, který makro upravuje, tak se makro neprojeví :/
Dobrý den,
chtěl by jsem se zeptat šlo by nějak jednoduše upravit Macro6, tak aby se datum doplnilo do prvního sloupce, když bude aktivní jakákoliv buňka ve sloupcích B až L?
Na to jak Macro6 upravit, aby se datum vyplnilo ve sloupci A pokud vyplním hodnotu do buňky ve sloupci B a potvrdím se mi podařilo přijít:
Sub Macro6()
On Error Resume Next
If ActiveCell.Column = 2 Then
With ActiveCell.Offset(-1, -1)
.Value = Date
.NumberFormat = "[$-409]d.mm.yyyy;@"
End With
End If
End Sub
Nyní by jsem toto potřeboval trošku sofistikovanější a to aby se datum ve sloupci A vyplnilo, i když zadám hodnotu do loupce B a pak zaktivním například buňku ve sloupci C nebo L (ve stejném řádku) a nebo prostě zadám hodnotu do kteréhokoliv sloupce.
Snad se mi to podařilo podat dostatečně srozumitelně. Předem moc děkuji za odpoveď a za pomoc.
Díky za snahu, nicméně tohle problém neřeší. (zde v ČJ: office.microsoft.com/... )
Nějaké jiné návrhy?
Bez makra to nejde.
Můžete mít něco na způsob tohoto, záleží na tom, jak a kdy to chcete spouštět (ručně, pokud tam ještě datum není, pokud se změní B1, ..):
Sub datum() Toho jsem se bál
Ale tak dobře, pokud to opravdu nejde, jak to tedy udělat makrem, když potřebuju, aby to takto fungovalo u více řádků?
Tabulka vypadá takhle a jde mi o to, aby stačilo vyplňovat pouze zelené pole:
http://o7.no/1aqKOTw
Díky!
Tak snad například takhle:
Private Sub Worksheet_Change(ByVal Target As Range)If Intersect(Range("C: D"), z) Is Nothing Then Exit Sub
Odpověď na tuto otázku jsem také hledala a stejně jako vy - bez úspěchu. Poradili mi - Stiskněte a držte klávesu Ctrl a k tomu stiskněte i klávesu středník (klávesa pod Esc) = aktuální datum. Nevím, do jaké míry Vám toto řešení vyhovuje, ale pro mě to byla nejlepší varianta, kterou jsem dostala.
Ano tohle je způsob, který je vhodný k rychlému vložení aktuálního statického data, viz: office.microsoft.com/...
Nicméně, na mě je to až moc velký kompromis ) Nějak to jít musí, byť přes ta makra...
Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.
Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.