< návrat zpět

MS Excel


Téma: Přejmenovat list podle změněné hodnoty buńky rss

Zaslal/a 22.1.2024 10:54

Zdravím vespolek. Prosím o pomoc s úpravou makra níže (mám vloženo v modulu), které přejmenuje aktivní list na základě změny hodnoty buňky B6 v tomtéž listu. Jedná se o číslovku 1 až 12 označující kal. měsíc. Změna hodnoty se uskuteční ručně uživatelem. Těchto strukturou stejných listů bude v sešitě postupně přibývat kopírováním vzorového listu. Potřebuji do makra přidat ošetření pro situaci, kdy by mělo dojít ke kolizi názvů, tzn. stejná hodnota v buňce B6 u více listů. Řešení si představuji takové, že v případě, kdy se v aktivním listu vyskytne v buňce B6 hodnota již existující v jiném listu, přidá se do názvu listu k hodnotě buňky B6 navíc pořadové číslo. Pro příklad: první list s výskytem hodnoty B6=3 bude pojmenovaný "3", druhý list s výskytem hodnoty B6=3 se pojmenuje "3(1)" atd.Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Target = Range("B6")
If Target = "" Then Exit Sub
Application.ActiveSheet.Name = VBA.Left(Target, 31)
Exit Sub
End Sub

Líbilo by se mi, kdyby se ten název listu (kal. měsíc) konvertoval na slovní název, tedy podle uvedeného příkladu místo "3" by byl "březen", místo "3(1)" by byl "březen(1)". Bylo by asi jednodušší, než komplikovat makro, kdybych měl v jiné (třeba skryté) buňce tu transformaci čísla měsíce na jeho slovní pojmenování provedenou a použila by se pro název listu adresa této buňky.

Zaslat odpověď >

#056012
Začátečník
Pro zjištění názvu měsíce z pořadového čísla lze použít např.:jmenoMesice = Format(DateSerial(2023, mesic, 1), "mmmm")

Jak bude zajištěno pořadí listů v případě, že je takových stejných názvů více - březen, březen(2), březen(1), březen(3)?
Je nutné projít všechny listy sešitu a zjistit kolik takových listů je již vytvořeno a doplnit správnou pořadovou číslovku, která bude navazovat.

Je nutné a smysluplné mít v jednom sešitu takto pojmenované listy?
Za mě to značně komplikuje přehled, který měsíc platí a co znamená. Není lepší vygenerovat kalendář pro celý rok a nějaké změny tohoto typu uživateli neumožnit?

Nebo jaký smysl má toto přejmenování? Co když bude těch listů třeba 20 v jeden měsíc?citovat
#056015
avatar
Teoreticky by stačilo 12 listů, 1 pro každý měsíc, dopředu nachystaných na celý rok. To, že by pro jeden kal. měsíc vzniklo více listů, je spíše výjimka, než pravidlo, a když už, tak určitě ne víc jak 2, a to prakticky v případě potřeby "vyrobit" z nějakého důvodu alternativní verzi výkazu k jednomu měsíci...citovat
#056016
Začátečník
Pak se inspirovat https://wall.cz/index.php?m=topic&id=56008citovat
#056020
avatar
Tak jsem záměr ještě promyslel a trochu přehodnotil. Vpřípadě, kdy by měl vzejít již existující název listu, by se přejmenování neuskutečnilo a makro by zobrazilo MsgBox se zprávou: "List s názvem JmenoMesice již existuje, a proto jej nebylo možné použít znovu pro tento list".
Ale nefunguje mi ten Format(DateSerial... Kde je zakopaný pes?'Přejmenování listu podle změny v buňce B6
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Range("B6")
Dim JmenoMesice
If Target = "" Then Exit Sub
Set JmenoMesice = Format(DateSerial(rok_vykaz, Target, 1), "mmmm")
Application.ActiveSheet.Name = JmenoMesice
Exit Sub
End Sub
rok_vykaz je v sešitě definovaný název, odkazující na buňku v jiném listu.

Edit: Po úpravě už je to OK:'Přejmenování listu podle změny v buňce B6
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Range("B6")
Dim sh As Worksheet
Dim jmenoMesice As String
For Each sh In ActiveWorkbook.Sheets
If sh.Name = jmenoMesice Then
MsgBox "List s názvem JmenoMesice již existuje, a proto jej nebylo možné použít znovu pro tento list."
End If
Next sh
If Target = "" Then Exit Sub
jmenoMesice = Format$(DateSerial(rok_vykaz, Target, 1), "mmmm")
Application.ActiveSheet.Name = jmenoMesice
Exit Sub
End Sub
Zakomponováno ošetření pokusu o použití stejného názvu pro list. Je to ale nefunkční...citovat
#056023
Stalker
Kde je zakopaný pes?
1) řádně nedeklaruješ proměnné.
2) práce s definovaným názvem ve VBA -> [rok_vykaz] nebo Jménolistu.Range("rok_vykaz")
3) Tvůj kód bude neustále provádět přejmenování při jakékoliv změně na listu
4) Není ošetřen vstup (Target) na zadání jiných hodnot než čísel z rozsahu 1 až 12citovat
#056024
avatar

Stalker napsal/a:

Kde je zakopaný pes?
1) řádně nedeklaruješ proměnné.
2) práce s definovaným názvem ve VBA -> [rok_vykaz] nebo Jménolistu.Range("rok_vykaz")
3) Tvůj kód bude neustále provádět přejmenování při jakékoliv změně na listu
4) Není ošetřen vstup (Target) na zadání jiných hodnot než čísel z rozsahu 1 až 12
Provedl jsem úpravy v kódu a už to pracuje. Určitě tam jsou nedostatky, které já ale se svými (ne)znalostmi nevidím nebo si s nimi neumím poradit. Tak bych byl vděčný, kdybys mi to naservíroval trochu názorněji.
ad4) Vstup hodnot je ošetřen ověřením dat v buňce B6, stejně tak u buňky s def. názvem rok_vykaz. Vím, z hlediska makra to není dokonalé.
'Přejmenování listu podle změny v buňce B6
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Range("B6")
Dim sh As Worksheet
' Dim jmenoListu As String
Dim jmenoMesice As String
For Each sh In ActiveWorkbook.Sheets
jmenoMesice = Format$(DateSerial(rok_vykaz, Target, 1), "mmmm")
If sh.Name = jmenoMesice Then
MsgBox "List s názvem " & jmenoMesice & " již existuje, proto jej nebylo možné použít znovu v procesu automatizovaného pojmenování tohoto listu. Výchozí název listu můžeš ale přejmenovat ručně standardním způsobem zvolením jiného vhodného názvu.", , "Konflikt s duplicítním názvem listu"
Exit Sub
End If
Next sh
If Target = "" Then Exit Sub
Application.ActiveSheet.Name = jmenoMesice
Exit Sub
End Sub
citovat
#056025
Stalker
'Přejmenování listu podle změny v buňce B6
Private Sub Worksheet_Change(ByVal Target As Range)
Dim JmenoMesice As String
If Not Intersect(Me.Range("B6"), Target) Is Nothing Then
If Target = "" Then
Exit Sub
Else
JmenoMesice = Format(DateSerial([rok_vykaz], Target, 1), "mmmm")
If ListExistuje(JmenoMesice) = True Then
MsgBox "List s názvem " & JmenoMesice & " již existuje, proto jej nebylo možné použít znovu v procesu automatizovaného pojmenování tohoto listu. Výchozí název listu můžeš ale přejmenovat ručně standardním způsobem zvolením jiného vhodného názvu.", vbExclamation, "Konflikt s duplicítním názvem listu"
Exit Sub
Else
Application.ActiveSheet.Name = JmenoMesice
End If
End If
End If
End Sub

Private Function ListExistuje(ByVal strJmeno As String) As Boolean
On Error Resume Next
ListExistuje = Not Worksheets(strJmeno) Is Nothing
End Function
citovat
#056026
avatar
To Stalker: Moc děkuji za učesaný kód. Jedna věc, na kterou jsem ještě přišel už u toho mého výtvoru. Když se edituje hodnota v buňce B6 tak, že výsledkem bude hodnota stejná jako před editací, makro to vyhodnotí jako duplicitní výskyt názvu listu a vyhodí MsgBox, což může být pro uživatele poněkud matoucí. Jinak na výslednou činnost makra to vliv nemá. Ale kdyby to šlo ještě ošetřit...citovat
#056027
Stalker
Můžeš porovnat hodnotu zadanou do buňky s aktuálním jménem listu a zobrazit hlášku nebo kód ukončit:

JmenoMesice = Format(DateSerial([rok_vykaz], Target, 1), "mmmm")
If JmenoMesice = ThisWorkbook.ActiveSheet.Name Then Exit Sub
If ListExistuje(JmenoMesice) = True Thencitovat
#056031
avatar
Řádek jsem přidal, zprvu se zdálo, že zcela bez efektu... Teď už to funguje, jen někdy, jakoby nahodile nikoli. Přitom vložená sekvence vypadá jasně a srozumitelně. No, uvidíme.
Ještě jednou díky.citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje