Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Formát buňky v Excelu

1.
Chci, abych v buňce Excelu (2007) napsal

120717

a viditelný výsledek byl

12.07.17

Formát je následující

00"."00"."00

Tohle funguje, pokud nejde o datum.

2.
Podobný případ, ale chci, aby Excel chápal napsané "120717" jako datum, 12.07.17
Nefunguje:

dd"."mm"."rr
dd.mm.rr

Výsledkem je jiné datum, zadávaný řetězec bere jako "pořadové číslo dne" někdy od roku 1900, jako 5.7.2230

Je jiná možnost formátování než použít pomocnou buňku s concatenate? Nechce se mi při psaní datumů zadávat ručně ty tečky mezi dna, měsíci a roky, z numpadu to při psaní zdržuje, pořád přehmatávat..

Díky za tip

Předmět Autor Datum
Ten první případ mohu ještě "zkrášlit", aby to, co bude viditelné, datum více připomínalo: 00"."00"…
L-Core 24.10.2017 10:05
L-Core
v Excelu 2003 mi to funguje přesně jak potřebuješ (dokonce ani rok nemusím psát, doplní si ho to sam…
jirka44 24.10.2017 10:22
jirka44
Funguje to i v Accessu 2007, kde si takový formát mohu nastavit, při zadávání vidím v buňce "__.__._…
L-Core 24.10.2017 10:30
L-Core
Zkus ten formát 12/7, to se dá z numerický celkem pohodlně
jirka44 24.10.2017 10:32
jirka44
Potřebuji i rok, to jsou dvě lomítka. Kdyby šlo o pár datumů, neřeším to. Ale u mě/manželky to budo…
L-Core 24.10.2017 10:42
L-Core
v 2013 mi to funguje, když to zadám jako 12/07 Musíš ale zadávat "/", tedy "12/07/17" nebo "12/7/17…
L-Core 24.10.2017 10:36
L-Core
Já tě chápu, ale pokud nepotřebuješ jiný rok, než aktuální, stačí zadat 12/7 nebo 12/07, což už mi p…
jirka44 24.10.2017 10:42
jirka44
2003 určitě ne, ale je pravda, že v běžném roce by zadávání "12/7" do buňky s formátem DD.MM.RR stač…
L-Core 24.10.2017 10:47
L-Core
Třeba ještě někdo něco vymyslí...
jirka44 24.10.2017 10:51
jirka44
Obavam se ze bez lomitek z prosteho cisla budes potrebovat funkci DATE, ciste pres format bunky netu…
Dwane Dibbley 24.10.2017 11:08
Dwane Dibbley
Konvertovat to dokážu různými způsoby, to není problém. Já to chtěl, aby z toho vylezlo datum autom…
L-Core 24.10.2017 11:50
L-Core
Vsak ten "Text to Columns" by to mel delat primo v bunce kde mas to cislo, musis si tam nascrolovat…
Dwane Dibbley 24.10.2017 11:59
Dwane Dibbley
vlož do modulu hárka nasledujúci kód: Private Sub Worksheet_Change(ByVal Target As Range) If Target…
robert13 24.10.2017 12:34
robert13
Tohle je dobrá cesta, díky moc! :beer: Budu to potřebovat v několika sloupcích, čili If Target.Co…
L-Core 24.10.2017 13:16
L-Core
Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column <> 1 _ And Target.Column <> 7…
robert13 24.10.2017 13:39
robert13
Maximální rok 1999 je ve smyslu, že to moje číslo končí ****99. Kontrolu nekorektních čísel/datumů n…
L-Core 24.10.2017 13:44
L-Core
ale ak Tvoje číslo končí na 99 tak koncový dátum bude 2099, keďže tam vkladám predčíslie "20" pred d…
robert13 24.10.2017 13:46
robert13
Jo, to jsem si neuvědomil.. nicméně o roky 19** už opravdu nepůjde. To naprosto zanedbatelné množstv…
L-Core 24.10.2017 13:51
L-Core
a ujasnime si: ak nepridám "20"-ku, Excel aj tak bude počítať aj u dvojciferného čísla na konci ako…
robert13 24.10.2017 14:00
robert13
P.S. vynechať bodku je prúser, lebo sa procedúra zacyklí, Nejak ju treba zastaviť a na to som využil…
L-Core 24.10.2017 13:55
L-Core
nechápem, prečo chceš medzi tieto dátumy vkladať niečo iné...
robert13 24.10.2017 13:59
robert13
Jde třeba o tiskové sestavy, nahoře to má složitou hlavičku, jednotlivé sloupce jsou pojmenovány, me…
L-Core 24.10.2017 14:06
L-Core
Target sa dá obmedziť i v riadkoch, aby sme uvoľnili riadky hlavičky od spúšťania procedúry i keď bu…
robert13 24.10.2017 14:13
robert13
Přiložil jsem jednoduchý soubor. Hlavičku a jiné texty jsem vyřešil ve sloupcích A, C, E (datumy, kt…
L-Core 24.10.2017 14:26
L-Core
Zamezit zacyklení lze přece jednoduše - jako první řádek v makru stačí napsat: Application.EnableEv…
Machr55 24.10.2017 14:17
Machr55
Machr díky moc :beer:, za toto mám rád túto poradňu... zas som sa niečo naučil ;-) L-Core takže bod…
robert13 24.10.2017 14:24
robert13
Se mi zdá, že tohle nefunguje..
L-Core 24.10.2017 14:32
L-Core
Jo, sorry, je tam chyba, neprepne sa EnableEvents v prípade, že nevyhovujú podmienky. Správne je (vr…
robert13 24.10.2017 14:41
robert13
Doplnenie povolenia výmazu (neskôr som čítal Tvoj vyšší post a ešte je nedočítaný :-D): Private Sub…
robert13 24.10.2017 14:45
robert13
Ošetrenie výmazu či vloženia riadka (alebo iných operácií, kde by dochádzalo k chybe): Private Sub…
robert13 24.10.2017 14:51
robert13
Řešil bych to třeba tak, že nad 50 to bude 1951 1952... a pod/rovno 2050 2049 2048...
L-Core 24.10.2017 15:00
L-Core
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Chyba Application.EnableEvents = F…
robert13 24.10.2017 15:07
robert13
If Target.Row < 50 Then To myslím ne, bude potřeba "targetovat" 5. a 6. pozici v buňce a ne řádek.…
L-Core 24.10.2017 15:15
L-Core
to by šlo
robert13 24.10.2017 15:18
robert13
Nedala by se tam narvat ta podmínka, že zadáváno (=psáno na klávesnici) by tam mělo být šestimístné…
L-Core 24.10.2017 15:07
L-Core
Také jednoduché to nie je, lebo Ty zadávaš tvar dátumu a nie číslo a teda za 310150 v dátumovom poňa…
robert13 24.10.2017 15:12
robert13
Každopádně moc děkuji, člověk se hodně naučí :-)
L-Core 24.10.2017 15:16
L-Core
Ten Text to Columns ti nefungoval?
Dwane Dibbley 24.10.2017 15:26
Dwane Dibbley
Spíše jsem to zavrhl, potřebuji to mít hodně blbuvzdorné, bude to pro i jiné uživatelé, kteří nějaké…
L-Core 24.10.2017 15:38
L-Core
To ale neni funkce. Je to specialni formatovani ktere je mimo jine vhodne i na konverzi "textu" na d…
Dwane Dibbley 24.10.2017 16:09
Dwane Dibbley
Tak jsem se na to díval. Problém u mě je, že ty datumy se mohou pořád přepisovat, případně jsou dop…
L-Core 24.10.2017 16:38
L-Core
Tak ho normalne prdni do funkce Worksheet_Change() a bude se automaticky spoustet vzdy kdyz budes ed…
Dwane Dibbley 24.10.2017 16:55
Dwane Dibbley
Vpodstate by cely skript vypadal zhruba takto "slozite" kde bys musel jen patricne upravit parametry…
Dwane Dibbley 25.10.2017 10:50
Dwane Dibbley
Zatím jsem to pořešil takto: Or Target.Row < 10 Or Target > 311299 Or Target < 10100 Or Mid(Target,…
L-Core 24.10.2017 15:48
L-Core
A včetně století, 49 = 2049, 50 = 1950. Do formátování jsou zařazeny pouze sloupce 1,2,3,4 a 6, krom…
L-Core 24.10.2017 16:43
L-Core
Nnnno, nechce ma to poslúchať (potrebujem prevody medzi formátmi a nejak mi to nejde), tak som to vy…
robert13 25.10.2017 09:06
robert13
Dnes dorazím DPH a hned se na to dám, teď nestíhám.. Každopádně díky!
L-Core 25.10.2017 09:40
L-Core
Odstranil jsem změnu barvy buňky Odstranil jsem okno "Iná chyba" Nechal jsem tam ty své podmínky, po…
L-Core 25.10.2017 11:00
L-Core
To hľadanie čiarok nemusíš dať, pokiaľ tam nejaké sú, vyhodnocovanie v bunke E2 ich odhalí a nedovol…
robert13 25.10.2017 11:19
robert13
mám taký blbý nápad: čo tak pred písaním väčšieho počtu dátumov prepnúť na anglickú klávesnicu? (píš…
lmik 25.10.2017 11:44
lmik
My žiadne čiarky ani bodky nepíšeme, stará sa o to makro. Čiarky boli ošetrované len kvôli tomu, aby…
robert13 25.10.2017 11:48
robert13
o.k. aj tak to nefunguje, excel tam píše čiarku aj keď je klávesnica anglicky.
lmik 25.10.2017 11:56
lmik
Áno je tam chyba. L-Core, ponechaním Tvojich podmienok s číslami a čiarkami (po Target.Row < 5) si v… poslední
robert13 25.10.2017 12:14
robert13

Potřebuji i rok, to jsou dvě lomítka.

Kdyby šlo o pár datumů, neřeším to. Ale u mě/manželky to budou ročně desetitisíce určitě, možná statisíce čísel, často desítky v kuse za sebou. Psát pravou rukou jen 0-9 je mnohem rychlejší, než tam doplňovat vždy dvě lomítka.

Přinejhorším použiju to, co jsem uvedl v příkladě 1 (řada datumů má pouze informační funkci, nemusí se z něj nic počítat ani dle něj řadit). A pro případ, že bych potřeboval další výpočty (počet ní mezi, seřazení), půjdu na to oklikou. Je to ale škoda, práce navíc, tabulka roste…

Konvertovat to dokážu různými způsoby, to není problém.

Já to chtěl, aby z toho vylezlo datum automaticky už při psaní, aby to pro mě bylo jednoduché. Access to dokáže. Stará dBASE z roku 1988 to dokáže. Pokud to nejde v Excelu 2007, mám smůlu - ale poradím si s tím.

Dnes třeba používám postup přes concatenate (číslo 120717 je v buňce D28):

=CONCATENATE(ČÁST(D28;1;2);".";ČÁST(D28;3;2);".20";ČÁST(D28;5;2)))

Výsledkem je datum 12.07.2017 v jiné buňce.

vlož do modulu hárka nasledujúci kód:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Or Mid(Target, 3, 1) = "." Then Exit Sub
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
End Sub

Aby sa kód neuplatňoval u iných stĺpcov, je potrebné definovať stĺpec, do ktorého zapisuješ ten Tvoj "skrátený tvar dátumu".
V uvedenom príklade ide o stĺpec "A" : Target.Column <> 1
Teda, pokiaľ sa nedeje zmena v stĺpci "A", ignoruj procedúru.
Podmienka: Stĺpec "A" musí mať nastavený formát buniek "text"!!!

Ovšem, nie je tu žiadne preverovanie, či nezadávaš blbosť, teda deň väčší ako 28, 29, 30, 31, mesiac väčší ako 12...
K dvojcifernému roku sa automaticky doplní predčíslie "20". Toto predčíslie nie je nutné dopĺňať, ale potom sa rok bude zobrazovať ako posledné dvojčíslie, ale napriek tomu s tým bude počítať ako s dátumom.

Ale teraz vidím, že Dwane Ti už navrhol iný dobrý a funkčný spôsob:
Vyplníš si stĺpec s Tvojim tvarom dátumu, nestaráš sa a na záver uplatníš na celý stĺpec nástroj "Text na stĺpce" pričom si zvolíš výsledok v tvare dátumu. Dokonca aj vzorce nad takto vzniknutými dátumami Ti budú fungovať a do očí Ti udrú chybné dátumy (správne dátumy sa zarovnajú dopravy, chybné doľava... Stĺpec ale musí byť tiež nastavený na formát textu, aby si mohol zadávať v Tvojom tvare ddmmrr

Tohle je dobrá cesta, díky moc! :beer:

Budu to potřebovat v několika sloupcích, čili

 If Target.Column <> 1

musí být jinak
A asi změním to OR na AND a změním tam

Mid(Target, 3, 1) = "."

na něco ve stylu Target je reálné číslo od 10100 do 311299 (nejmenší=01.01.2000 a největší=31.12.1999 datum)

Jak napíšu, že target je třeba sloupec 1, 7, 8, 9 a 15?
Jak napíšu, že target je číslo mezi 10100 a 311299?

Tohle nefunguje (určení sloupců):
If Target.Column <> OR(1;7;8;9;15)
If Target.Column <> "=OR(1,7,8,9,15)"
...

To by bylo dobrá právě proto, že ve sloupci se mohou vyskytovat i další údaje, které tímto způsobem formátovat nechci.

Private Sub Worksheet_Change(ByVal Target As Range)
    If (Target.Column <> 1 _
    And Target.Column <> 7 _
    And Target.Column <> 8 _
    And Target.Column <> 9 _
    And Target.Column <> 15) _
    Or Mid(Target, 3, 1) = "." Then Exit Sub
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
End Sub

ale kontrola bude musieť byť inak. Môžeš tam totiž zadať aj číslo, ktoré sa nedá týmto spôsobom previesť na korektný dátum, napr. 3213nn.
Už som skúšal test Target-u na IsDate ale neposlúchalo. Ešte porozmýšľam...
Napadá ma skúsiť spätný prevod na číslo, ktoré reprezentuje v Exceli dátum a TAM zadať interval, v ktorom sa má Target nachádzať napr Tebou udávaný minimálny dátum je reprezentovaný číslom 36526).
A asi si sa sekol v maximálnom dátume (uviedol si rok 1999).
P.S. vynechať bodku je prúser, lebo sa procedúra zacyklí, Nejak ju treba zastaviť a na to som využil skutočnosť, že akonáhle je tam už vložená bodka, nesmie opätovne reagovať na udalosť Change.
A nehovoriac o tom, že v stĺpci s dátumami by sa nemalo nachádzať nič iné (ak som dobre pochopil)

Maximální rok 1999 je ve smyslu, že to moje číslo končí ****99.
Kontrolu nekorektních čísel/datumů nepotřebuji.

Chtěl bych tam dostat tu podmínku, že to "formátování" bude pouze u zadávaných čísel v intervalu 010100 až 311299 (nebrat jako datumy, ale jako "číslo", ne jako "pořadí dne od 1.1.1900"), což obsáhne všechny mnou použitelné datumy. A nebo jinak (jednodušeji), že tohle formátování bude platit pouze tehdy, je-li zadáváno číslo menší než 311300. Ale problém zase vidím, když ty sloupečky jsou formátovany jako text, jak to bude kontrolovat proti hodnotě čísla (nějak proti Value?), tohle je na mě moc..

Ve sloupečku může být třeba text (například nahoře nadpis "datum operace"), to formátovat samozřejmě na dd.mm.rr nechci.

P.S. vynechať bodku je prúser, lebo sa procedúra zacyklí, Nejak ju treba zastaviť a na to som využil skutočnosť, že akonáhle je tam už vložená bodka, nesmie opätovne reagovať na udalosť Change.
A nehovoriac o tom, že v stĺpci s dátumami by sa nemalo nachádzať nič iné (ak som dobre pochopil)

Hmm, tak to je horší..

Jde třeba o tiskové sestavy, nahoře to má složitou hlavičku, jednotlivé sloupce jsou pojmenovány, mezi tím jsou řádky s mezisoučty, různé texty..

Ale jo, jsem schopen tohle naformátovat tak, že prostě ty texty budou v jiných buňkách, akorát posunuty (třeba mezerníky) na požadované místo. Ovšem otrava, pokud třeba změním šířku sloupců.. mohu ale využít i slučování buněk v těch nadpisech.

Asi to bude tak nakonec (muset) stačit. Zkusím vyrobit nějakou takovou tabulku (zítra, pozítří).

Každopádně díky.

Target sa dá obmedziť i v riadkoch, aby sme uvoľnili riadky hlavičky od spúšťania procedúry i keď bude v stĺpcoch, kam pôjdu tieto dátumy.
Rozšíria sa kontroly o Target.Row, napr aby upravovalo dátumy v daných stĺpcoch ale napr. až od riadka 15

Ale ešte raz mi daj požadovaný interval prípustných dátumov, do zajtra skúsim niečo vymyslieť

Přiložil jsem jednoduchý soubor.
Hlavičku a jiné texty jsem vyřešil ve sloupcích A, C, E (datumy, které chci převádět, jsou v B, D, F), ty pomocné sloupce mohu klidně úplně schovat.

Trochu problém je v tom, že pokud chci něco smazat (datum jsem zadal omylem, má to být prázdné), zůstane tam "...20.2020" a nedá se toho zbavit.
A pokud chci odebrat řádek, vyskočí debug error, ten se dá ale odkliknout.

Mám ty sloupečky s datumy formátované jako text, ale zdá se mi, že úplně stejně to funguje, když nastavím obecné formátování..

---
Datumy jsou mezi 1.1.1980 a 31.12.2099

Mně se zdá, že je to nějak jednoduše neřešitelné… :-/

Machr díky moc :beer:, za toto mám rád túto poradňu... zas som sa niečo naučil ;-)

L-Core takže bodku môžeme vynechať:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If (Target.Column <> 1 _
    And Target.Column <> 7 _
    And Target.Column <> 8 _
    And Target.Column <> 9 _
    And Target.Column <> 15) _
    Then Exit Sub
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
Application.EnableEvents = True
End Sub

Jo, sorry, je tam chyba, neprepne sa EnableEvents v prípade, že nevyhovujú podmienky. Správne je (vrátane doplnenia toho, že naviac nereaguje v riadku menšom ako 10):

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 7 _
        And Target.Column <> 8 _
        And Target.Column <> 9 _
        And Target.Column <> 15) _
        Or Target.Row < 10 Then
        Application.EnableEvents = True
        Exit Sub
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
    Application.EnableEvents = True
End Sub

Doplnenie povolenia výmazu (neskôr som čítal Tvoj vyšší post a ešte je nedočítaný :-D):

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 7 _
        And Target.Column <> 8 _
        And Target.Column <> 9 _
        And Target.Column <> 15) _
        Or Target.Row < 10 Or Target = "" Then
        Application.EnableEvents = True
        Exit Sub
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
    Application.EnableEvents = True
End Sub

Ošetrenie výmazu či vloženia riadka (alebo iných operácií, kde by dochádzalo k chybe):

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 7 _
        And Target.Column <> 8 _
        And Target.Column <> 9 _
        And Target.Column <> 15) _
        Or Target.Row < 10 Or Target = "" Then
        Application.EnableEvents = True
        Exit Sub
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & ".20" & Right(Target, 2)
    Application.EnableEvents = True
    Exit Sub
Chyba:
    Application.EnableEvents = True
    Exit Sub
End Sub

A k tomu intervalu rokov:
Ako má Excel rozoznať, keď ako rok napíšeš napr 90, či myslíš 1990 alebo 2090???

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 7 _
        And Target.Column <> 8 _
        And Target.Column <> 9 _
        And Target.Column <> 15) _
        Or Target.Row < 10 Or Target = "" Then
        Application.EnableEvents = True
        Exit Sub
    End If
    If Target.Row < 50 Then
        Storoc = 19
        Else: Storoc = 20
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Storoc & Right(Target, 2)
    Application.EnableEvents = True
    Exit Sub
Chyba:
    Application.EnableEvents = True
    Exit Sub
End Sub

Nedala by se tam narvat ta podmínka, že zadáváno (=psáno na klávesnici) by tam mělo být šestimístné číslo, včetně případné počáteční nuly? Nějak podobně, jak tam je

Target = ""

Akorát by to muselo být "obráceně" nějak:

Target <> "interval čísel"

Pokud by v buňce bylo napsáno cokoliv jiného, co by neodpovídalo tomu, že se jedná o číslo 010100 až 311299, to formátování by se prostě neaplikovalo.

Ty čísla nejsou náhodné. Menší šestimístné číslo jako datum není možné zadat (1.1.00) a větší také ne (31.12.99)

Také jednoduché to nie je, lebo Ty zadávaš tvar dátumu a nie číslo a teda za 310150 v dátumovom poňatí nenasleduje 310151 ale 010250

Ale tým prevodom na číselnú hodnotu dátumu by malo ísť niečo poriešiť, len nie všetky funkcie Excelu majú ekvivalent i vo VBA a nie všetky funkcie sú v tvare "Worksheetfunction." využiteľné i vo VBA.
Skúsim niečo vymyslieť ale dnes to nebude, to je trocha na dlhšie (ak Ti to medzitým neporieši niekto iný)

P.S. nadnes musím končiť

Vpodstate by cely skript vypadal zhruba takto "slozite" kde bys musel jen patricne upravit parametry TextToColumns (nejsnadnejsi by bylo nahrat to jako makro a vytahnout to z nej), popripade upravit oblast pro kterou by se to spoustelo.

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Cells.Count > 1 Or IsEmpty(Target.Value) Then Exit Sub
  Target.TextToColumns Destination:=Target, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="/"
End Sub

Zatím jsem to pořešil takto:

Or Target.Row < 10 Or Target > 311299 Or Target < 10100 Or Mid(Target, 6, 1) = "," Or Mid(Target, 7, 1) = "," Then

Formátování se neprovede na prvních devíti řádcích nikde a na dalších řádcích jedině tehdy, je-li zadáváno číslo (které má reprezentovat ddmmrr) v intervalu 010100 až 311299. Jakmile je tam cokoliv jiného (nic, text, desetinné číslo) formátování se nekoná. Pokud chci zadat datum minulého století, prostě tam natvrdo napíšu "31.10.1986".

Vypadá to trochu kostrbatě, vím. U

Or Mid(Target, 6, 1) = "," Or Mid(Target, 7, 1) = "," Then

to neumím napsat do jedné podmínky.
(touto podmínkou vylučují případná desetinná čísla z "povoleného" intervalu)

A včetně století, 49 = 2049, 50 = 1950.
Do formátování jsou zařazeny pouze sloupce 1,2,3,4 a 6, kromě prvních 4 řádků. Formátovaní je na těch buňkách nastaveno na text. Ignorováno je cokoliv mimo celá čísla 10100-311299. Není kontrola, zda datum existuje, ale to mi nevadí. Takže "projde" třeba 32.14.17 jako 32.14.2017. To mi nevadí.

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 2 _
        And Target.Column <> 3 _
        And Target.Column <> 4 _
        And Target.Column <> 6) _
        Or Target.Row < 5 Or Target > 311299 Or Target < 10100 Or Mid(Target, 6, 1) = "," Or Mid(Target, 7, 1) = "," Then
        Application.EnableEvents = True
        Exit Sub
    End If
    If Mid(Target, 5, 1) > 4 Then
        Stoleti = 19
        Else: Stoleti = 20
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Stoleti & Right(Target, 2)
    Application.EnableEvents = True
    Exit Sub
Chyba:
    Application.EnableEvents = True
    Exit Sub
End Sub

Skoro bych řekl, že vyřešeno.
Lepší zápis, případně kontrola existence datumu jsou už jen perličky..

Nnnno,
nechce ma to poslúchať (potrebujem prevody medzi formátmi a nejak mi to nejde), tak som to vyriešil okľukou amatérsky, ale funkčne.
Potrebujeme dve bunky ako pomocné (v danom prípadne sú to E1 a E2, ak to nebude vyhovovať, vzhľadom na hlavičku, prehoď si to inde), kde sa vyhodnotí korektnosť dátumu, takže nie je potrebné žiadne ošetrovanie desatinných čiarok, rozsahov dátumov alebo iných habaďúr, či ide naozaj o dátum.
Do kódu som vložil aj naplnenie bunky E2 vzorcom, zneviditeľnenie obsahu pomocných buniek a farebné zvýraznenie bunky s chybou v dátume, aby si ani s tým nemal starosť (stačilo by ich tam raz dať manuálne ale aj o to som Ťa odľahčil. Takto sa to síce každým dátumom napĺňa opakovane, ale to nevadí).
A formát stĺpcov, do ktorých sa budú tieto dátumy zadávať musíš nastaviť na "text", inak za určitých okolností môže dôjsť k chybe (inak aj to by sa dalo dať do kódu)

Skús

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 2 _
        And Target.Column <> 3 _
        And Target.Column <> 4 _
        And Target.Column <> 6) _
        Or Target.Row < 5 Or Target = "" Then
        Application.EnableEvents = True
        Exit Sub
    End If
    If Mid(Target, 5, 1) > 4 Then
        Stoleti = 19
        Else: Stoleti = 20
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Stoleti & Right(Target, 2)
    
'pomocné bunky E1 a E2
    Range("E1:E2").NumberFormat = ";;;"
    Range("E1") = Target
    Range("E2").FormulaR1C1 = "=IF(ISERROR(DATEVALUE(R[-1]C)),""Chyba"","""")"
    If Range("E2") = "Chyba" Then
        Target.Font.Color = RGB(255, 0, 0)
        Target.Select
        MsgBox "Zadaný údaj nereprezentuje dátum!" & Chr(13) & "Oprav!", vbCritical, "Chyba"
        Else: Target.Font.Color = RGB(0, 0, 0)
    End If
  
    Application.EnableEvents = True
    Exit Sub
Chyba:
    MsgBox "Iná chyba"
    Application.EnableEvents = True
    Exit Sub
End Sub

Odstranil jsem změnu barvy buňky
Odstranil jsem okno "Iná chyba"
Nechal jsem tam ty své podmínky, pokud bych do těch sloupečků potřeboval napsat i něco jiného než datum (vím, je to trochu prasárna…)
Nyní vyskočí upozorňovací okno pouze v případě nějakého "překlepu" v datumu, např. 30.02.2017

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 1 _
        And Target.Column <> 2 _
        And Target.Column <> 3 _
        And Target.Column <> 4 _
        And Target.Column <> 6) _
        Or Target.Row < 5 Or Target > 311299 Or Target < 10100 Or Mid(Target, 6, 1) = "," Or Mid(Target, 7, 1) = "," Then
        Application.EnableEvents = True
        Exit Sub
    End If
    If Mid(Target, 5, 1) > 4 Then
        Stoleti = 19
        Else: Stoleti = 20
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Stoleti & Right(Target, 2)
    
    Range("E1:E2").NumberFormat = ";;;"
    Range("E1") = Target
    Range("E2").FormulaR1C1 = "=IF(ISERROR(DATEVALUE(R[-1]C)),""Chyba"","""")"
    If Range("E2") = "Chyba" Then
        Target.Select
        MsgBox "Zadané datum neexistuje!", vbCritical, "Pozor"
    End If
    Application.EnableEvents = True
    Exit Sub

Chyba:
    Application.EnableEvents = True
    Exit Sub
End Sub

To hľadanie čiarok nemusíš dať, pokiaľ tam nejaké sú, vyhodnocovanie v bunke E2 ich odhalí a nedovolí ich.
A farbu si odstraňovať nemusel, po zapísaní správneho tvaru sa sama odfarbí.
"Iná chyba" tam bola kvôli tomu, aby sa odhalilo niečo nepredpokladané, lebo inak makro skončí bez toho, aby si vedel, že nejaká chyba nastala.

Áno je tam chyba.
L-Core, ponechaním Tvojich podmienok s číslami a čiarkami (po Target.Row < 5) si vylúčil moju kontrolu cez bunku E2, takže ako píše lmik, nefunguje to.
Použi moje podmienky v prvom bloku If

Zrušenie farbenia a vynechanie "Iná chyba" je Tvoja vec, ale moja kontrola správnosti dátumu nebude fungovať, keď tam nebudú správne podmienky.
Kontrolovať voči tým Tvojim číslam je chyba, to som Ti už písal vyššie. Nemôžeš porovnávať "dátumový tvar" voči radu prirodzených čísel.
Dátumovo po 310110 nasleduje 010210 a nie 310111 a preto Tvoje porovnávanie nemôže dať správny výsledok.

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