Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Základní makra (VBA) pro práci s Listy v Microsoft Excel.
Doplněno a rozšířeno: 22.12.2013
Tento článek slouží jako rychlá pomůcka při programování ve VBA, kdy pracujete s s listy a potřebujete vložit patřičný kód. Je rozdělen do několika oddílů:
Příkaz vybere třetí list s názvem List3
Sheets("List3").Select
'nebo
Sheets(3).Select
Worksheets("List3").Select
Worksheets(1).Select
Vybrat několik listů
Sheets(Array("List2", "List3")).Select
Vybrat všechny listy:
ActiveWorkbook.Sheets.Select
Vybrat list - hodnota v proměné (buňce)
NazevListu = "List3"
Sheets(NazevListu).Select
' pokud je název v buňce A1
Sheets(Range("A1").value).Select
Vybírat listy podle pozice:
ActiveSheet.Select
Worksheets(1).Select
Charts(1).Select
Sheets(1).Select
Další související články
Přidá list s automaticky přidějeným názvem listu. List se přidává před aktivní list.
Sheets.Add
Přidá nový list pod vašim zvoleným jménem. Přidává se před aktivní list.
Sheets.Add.Name = "Můj název"
Přidání listu za poslední list.
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Můj název"
Poznámka: Pokud již název listu existuje skončí chybou. Nezapomenout tyto stavy ošetřit.
Příkaz přejmenuje List4 na NoveJmeno
Sheets("List4").Name = "NoveJmeno"
Aktivní list bude přejmenován na: jine jmeno
ActiveSheet.Name = "jine jmeno"
Podle čísla listu. Listy jdou za sebou, nezáleží na jejich jménech.
Sheets(1).Name = "Nové jméno"
Poznámka: List nebo jeho pozice musí existovat jinak skončí chybou.
Smaže vybrané listy.
ActiveWindow.SelectedSheets.Delete
Pokud nechcete zobrazovat dialogové okno informující, že v listech mohou být data o které přijdete stačí zapnout nezobrazovat informační okna. Po provedení výmazu nezapomenout zobrazování zapnout ;)
Application.DisplayAlerts = True
Poznámka: To že poslední list nesmažete je doufám jasné. Excel totiž musí obsahovat minimálně jeden list.
Tento příkaz zjistí počet listu v sešitu MS Excel. Hodnota se uloží do NoveJmenopocetListu
pocetListu = Sheets.Count
Jaký je název prvního listu?
' Jméno listu se ulozi do promene jmenoListu
jmenoListu = Sheets(1).Name
nebo zjistit jméno aktivního listu
NazevListu = ActiveSheet.Name
NazevListu = Application.ActiveWorkbook.ActiveSheet.Name
Přesunutí aktivního listu na konec
ActiveSheet.Move after:=Worksheets(Worksheets.Count)
Přesun "List1" za list "List3".
Sheets("List1").Move After:=Sheets("List3")
Přesun "List15" před list "List13".
Sheets("List15").Move Before:=Sheets("List13")
Přesun před první list
ActiveSheet.Move before:=Sheets(1)
Do sloupce A, se vypiší všechny názvy listu v sešitu:
Private Sub CommandButton1_Click()
For i = 1 To Sheets.Count
Cells(i, 1) = Sheets(i).Name
Next i
End Sub
Poznámka: zobrazí skryté i superskryté listy :)
Příkaz "aktivuje" jiný sešit MS Excelu pod názvem sesit-1.xls
Windows("sesit-1.xls").Activate
Tento text slouží jako pomůcka pro programování ve VBA (Visual Basicu for Application). Neklade si za cíl být vyčerpávající příručkou. Napadají vás další kódy pro práci s listy? Můžete se o ně podělit v komentářích.
Článek byl aktualizován: 19.09.2020 11:07
Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.
Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.
Přidáno: 09.05.11 22:32
Děkuji za uvedené kódy, něco jsem i neznal, takže jsem zase chytřejší, ale nemohu se nikde třeba dopátrat, jak ověřovat, zda v otevřeném sešitu je např. List5 a pokud není, jak to elegantně ošetřit (např. If není List5 Then napiš zprávu, že List5 není Else aktivovat List5 End If. Dal jem něco dohromady, ale zastavuje se to na chybě 9. Mám Office 2007 a XP. Díky předem za pomoc.
Přidáno: 10.05.11 17:42
To Vorel:
zjistit počet listu:
pocetListu = Sheets.Count
a přes cyklus for i = 1 to počet listu zjistit
Jméno listu:
NazevListu = Sheets(i).Name
no a poté aplikovat podmínku if ...
Přidáno: 16.01.12 16:23
Dobrý den, chtěl jsem se zeptat, jestli je možné nějákým vzorcem, či jiným způsobem nastavit v jednom listu to, aby se do něho automaticky kopírovala data z ostatních listů. Mějme třeba 5 listů a jeden list pojmenovaný Vše a potřebuji, aby se data z listů 1-5 kopírovala do listu Vše. Děkuji za odpověď
Přidáno: 16.01.12 18:30
To Vít Prchal: Potřebujete, aby po zapsáni hodnoty v listu 1 - 5 bylo ihned doplněno do listu vše? Přes událost "změna"
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Doplnit kód."
End Sub
Přidáno: 15.04.12 23:20
Dobrý den, potřeboval bych poradit. Mám sáhodlouhý seznam dat, ve kterém mám různé údaje (disponenty). Pro každého disponenta (x různých disponentů - datový formát text. Přičemž každý disponent může mít více záznamů v tabulce) potřebuju založit vlastní list a překopírovat jeho vlastní data včetně první řádky a filtru. Po skončení operace vymazat zdrojová data (celý list) Poradíte mi prosím nějaký VBA kód? předem díky moc za pomoc DAvid
Přidáno: 16.04.12 17:50
To David: zkuste použít info z: http://office.lasakovi.com/excel/vba-listy-bunky/radky-sloupce-excel-vba-kody/
Přidáno: 23.12.12 10:24
Dobrý den, Je možné nějakým způsobem zjistit názvy všech listů v sešitu a vypsat je do nějakého seznamu, třeba na jiný list? Děkuji
Přidáno: 23.12.12 19:18
To Martin: Jde například takto. Pro tlačítko CommandButton1:
Private Sub CommandButton1_Click()
Columns(1).Insert
For i = 1 To Sheets.Count
Cells(i, 1) = Sheets(i).Name
Next i
End Sub
Poznámka: zobrazí skryté i superskryté listy :)
Je pochopitelné?
Přidáno: 23.12.12 21:56
Ano, díky. Nakonec jsem proceduru napsal, ale i když procedura proběhne, vyhodí chybovou hlášku. Zítra vyzkouším váš způsob.
Přidáno: 09.01.13 19:56
Dobrý den. Tak jsem nakonec použil váš způsob, jen jsem vypustil vložení nového sloupce "(Columns(1).Insert)". V každém případě bych vám chtěl poděkovat za tyto stránky. Jsou prvním místem v pořadí, kam běžím pro pomoc nebo jen pro inspiraci. Takže DÍKY.
Přidáno: 21.02.13 14:14
Zdravím, narazil jsem na problém a nevím kudy kam. Potřeboval bych přidat v sešitě nový list - to mám vyřešené. Ale následně bych tento list potřeboval dostat na jeho chybějící pozici například mám listy se jmény 152 a 156 a do sešitu jsem přidal list 154. Teď bych chtěl nějakým způsobem tento list dostat na jeho místo, protože automaticky se mi přidá jako první list. Jako řídící bych chtěl použít list označený 156, protože za listem s označením 152 se ještě nachází list "152 - data". Na internetu jsem našel řešení, která jsou schopna umístit ho na konec sešitu či podle poředí přidávaných listů (nikoli jejich jmen). Napadá Vás něco? Předem děkuji.
Přidáno: 21.02.13 16:07
Tak jsem našel tento kód, který mi to řeší:
Sub SortWorksheets()
Dim N As Integer
Dim M As Integer
Dim FirstWSToSort As Integer
Dim LastWSToSort As Integer
Dim SortDescending As Boolean
SortDescending = False
If ActiveWindow.SelectedSheets.Count = 1 Then
'Change the 1 to the worksheet you want sorted first
FirstWSToSort = 1
LastWSToSort = Worksheets.Count
Else
With ActiveWindow.SelectedSheets
For N = 2 To .Count
If .Item(N - 1).Index <> .Item(N).Index - 1 Then
MsgBox "You cannot sort non-adjacent sheets"
Exit Sub
End If
Next N
FirstWSToSort = .Item(1).Index
LastWSToSort = .Item(.Count).Index
End With
End If
For M = FirstWSToSort To LastWSToSort
For N = M To LastWSToSort
If SortDescending = True Then
If UCase(Worksheets(N).Name) > UCase(Worksheets(M).Name) Then
Worksheets(N).Move Before:=Worksheets(M)
End If
Else
If UCase(Worksheets(N).Name) < UCase(Worksheets(M).Name) Then
Worksheets(N).Move Before:=Worksheets(M)
End If
End If
Next N
Next M
End Sub
Zdroj http://www.vbaexpress.com/kb/getarticle.php?kb_id=72
Přidáno: 30.08.13 13:29
Dobrý den. Potřeboval bych poradit. Používám práci s více sešity, někdy je i vytvářím v macru. Pokud pracuji v jednom sešitu je vše vpořádku, ale když si vytvořím druhej a přepínam je Windows(...).Activate nebo Workbook(...).Activate nastane problém kdy mi ještě jde vybrat daný list, ale při výběru buněk ve vybraném listu mi již nejde použít Range(...).select ale musím psát ActiveSheet.Range(...).select . Netuší někdo proč to tak je případně jeslti něco nedělám špatně. Docela mi to vadí a dokonce jsem byl někdy (i když nevím proč) nucen psat třeba Range(cells(1,1).address,cells(1,2).address).select
Přidáno: 30.12.13 14:25
ad Vorel (žádný cyklus):
Sub ExistenceListu()
Dim List As Worksheet
On Error Resume Next
Set List = ActiveWorkbook.Sheets("List5")
ListExistuje = Not List Is Nothing
End Sub
ad Martin (30.8.):
Chyba je v tom, že VBA je benevolentní a nevyžaduje zadávání rodičů pro Range a Cells. Takže si stokrát můžete nadefinovat sešit před Range, ale když totéž neuděláte uvnitř pro Cells, tak si dosadí ActiveSheet. Apropo, nadefinujte si sešit nebo oblast buněk jako objektovou proměnnou a nemusíte v 90 % případů vůbec řešit nějaké Activate, Select. A také není potřeba sahat na kolekci Windows.
Přidáno: 30.12.13 16:27
To Petr Pecháček: Díky za zveřejnění elegantního kódu pro zjištění zda list existuje. A odpověď pro Martina.
Přidáno: 24.02.14 23:40
Sheets.Add(After:=Sheets(Sheets.Count)).Name = Range ("B3") z B3 berie nazov listu ale ak uz ten list existuje,tak mi vyhodi chybu ako doplnim dialogove okno,ze list uz existuje a ci ho chcem prepisat? vopred dakujem
Přidáno: 06.03.14 15:04
Dobrý den, Vaše stránka mi hodně pomáhá, ale přesto bych potřeboval přímou pomoc z jedním problémkem na který jsem narazil. Jedná se v podstatě o jednoduchou věc ale nějak se mi to nedaří vyřešit. Potřebuji pomocí VBA propojit dva sešity mezi sebou tak abych mohl přenášet data mezi nimi. Workbook otevřu pomocí Connections.AddFromFile ale vždy mě vyskočí tabulka abych si vybral list z otevíraného sešitu a nejsem schopen mu předdefinovat danou tabulku. Děkuji za případnou radu.
Přidáno: 17.04.14 08:58
V úvodu v boxu píšete "Doplněno a rozšířeno: 22.12.2014". To je asi nějaký překlep, ne? Prosinec letošního roku...
Přidáno: 17.04.14 20:56
To Honza: Bylo to v prosinci loňského roku, upravil jsem rok. Děkuji.
Přidáno: 24.06.14 17:10
Dobrý den, zápasím s celkem jednoduchou věcí a to je přesun listu mezi dvěma různými sešity. Jakmile se dostanu v kódu na pozici kdy se má provést kopírování listu z jednoho sešitu do druhého, tak mi to spadne a napíše run-time error '9', subscript out of range.
Private Sub CommandButton1_Click()
Dim s As String
Dim ss As String
MsgBox ("Vyber soubor - sestava výkonnosti")
s = Application.GetOpenFilename()
Workbooks.Open s
MsgBox ("Vyber soubor - evidence práce")
ss = Application.GetOpenFilename()
Workbooks.Open ss
Workbooks(s).Sheets(2).Copy Before:=Workbooks(ss).Sheets(1)
'Nepracuje to ani s ručně zadanou kompletní cestou a názvem souboru viz dalších pá řádků
'Workbooks("C:\Users\raska\Documents\_testy_\hodnoceni na smeny\evidence prace (20 tyden).xlsx ").Sheets(2).Copy Before:=Workbooks("C:\Users\raska\Documents\_testy_\hodnoceni na smeny\sestava vykonnosti (20 tyden).xlsx").Sheets(1)
End Sub
Přidáno: 13.10.14 13:08
Dobrý den, ráda bych se zeptala, zda je v Excelu možné sloučit jednotlivé listy do jednoho hlavního. Bojuji s velkým množstvím listů v jednom Excelu a velmi by mi pomohlo, kdyby šel vytvořit hlavní list, do kterého by se dalo přemístit několik listů. Např. hlavní list označený jako realizace projektu, který by šel rozkliknout a nacházely by se v něm všechny listy, které s ním souvisí. Předem moc děkuji za odpověď.
Přidáno: 30.12.14 08:08
To Michal
Takto by to mělo fungovat.
Private Sub CommandButton1_Click()
MsgBox ("Vyber soubor - sestava výkonnosti")
Workbooks.Open Filename:="C:\Users\raska\Documents\_testy_\hodnoceni na smeny\evidence prace (20 tyden).xlsx "
MsgBox ("Vyber soubor - evidence práce")
Workbooks.Open Filename:="C:\Users\raska\Documents\_testy_\hodnoceni na smeny\sestava vykonnosti (20 tyden).xlsx"
Workbooks("evidence prace (20 tyden).xlsx").Sheets(2).Copy Before:=Workbooks("sestava vykonnosti (20 tyden).xlsx").Sheets(1)
End Sub
Přidáno: 30.12.14 09:27
To Tereza Tak jak to myslíš to bohužel nejde, ale nezoufej mám možná i dobrou zprávu jak by tvůj problém šel vyřešit. Šlo by to řešit na způsob obsahu knihy s rychlým odkazem přímo na určitý list. Vytvořit list realizace projektu a v něm kliknou na nějakou buňku a zvolit v horního panelu Vložit/Hypertextový odkaz... a otevře se okno Upravit hypertextový odkaz. Na levé straně tohoto okna je Odkaz na zde zvolit Místo v tomto dokumentu. Pravá strana se změní a můžeš zde vybrat určitý list, který se vztahuje k tomu určitému projektu a zvolit OK. Na listu realizace projektu se vytvořil odkaz na list a když na něj klikneš přesune tě na ten určitý list a určitou buňku. Takto si můžeš vytvářet obsahy k projektům.
Přidáno: 02.01.15 07:28
To Tereza -- po vložení prázdneho listu spustiť tento kód(vykoná pre všetky listy to čo napísal Jarda)Sub CreateLinksToAllSheets()
'Vytvorí odkaz na všetky listy
Dim Sh As Worksheet
Dim cell As Range
For Each Sh In ActiveWorkbook.Worksheets
If ActiveSheet.Name <> Sh.Name Then
ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
"'" & Sh.Name & "'" & "!A1", TextToDisplay:=Sh.Name
ActiveCell.Offset(1, 0).Select
End If
Next Sh
End Sub
Přidáno: 04.01.15 17:06
Dobrý den. Mám naprogramované tlačítko, které daný list kopíruje do jiného sešitu. Potřeboval bych zařídit, aby se list kopíroval právě bez tohoto tlačítka. Díky.
Přidáno: 05.01.15 08:57
To Pavel Kudělka: -- bude sa to musieť musieť viazať na niečo: napr.pri otvorení/zatvorení súboru, aktivácii/deaktivácii listu/okna, zmene listu, zmene alebo výberu bunky, pri určitej hodnote v určitej bunke, atď.
Přidáno: 14.01.15 12:33
Dobrý den, děkuji za skvělé stránky, které mi již mnohokrát pomohli. Teď si ovšem nevím rady. Pracuji s excelem, který má 12 listů. Vytvořil jsem si ještě "úvodní" list, na který jsem dal checkboxy s názvy těch 12 listů. Nyni potřebuji, abych mohl pomocí checkboxů vybrat dané listy a pomocí buttonu(Vytvoř a ulož) vytvořit nový soubor, do kterého se vloží jen vybrané listy a uloží se. Ještě by měla být data v novém souboru zamčena proti přepsání... Budu vděčný za každou radu, děkuji
Přidáno: 23.05.15 19:26
potřebuji poradit potřebuji rozchodit tento kód A1- je odkaz na buňku kde je číslo listu který jsem před tím vytvořil Sheets("A1").Select na 100% je to špatně, ale nevím jak ho napsat.
Přidáno: 24.05.15 11:03
Ahoj, potřeboval bych radu moc mi tyto stránky pomohly a teď jsem se zasekl na možná jednoduchém problému. tento příkaz Sheets("List3").Select potřebuji nahradit List3,kde neznám dopředu název, ale vím že název listu je uložen v listu start a v buňce A1
Přidáno: 26.05.15 08:08
To Zbygi: -- Výber listu podľa hodnoty v bunkeSheets(Range("A1").value).Select
Přidáno: 07.01.16 12:30
dovolil bych si asi amaterský dotaz. potřebuji vytvářet nové listy s názvy buněk tabulky. příklad obsah buňky A1="01" - vytvořit list "01" obsah buňky A2="02" - vytvořit list "03" mám jeden list jako vzor který zkopíruju a přejmenuji. Sheets("vzor").Select Sheets("vzor").Copy Before:=Sheets(1) Sheets("vzor (2)").Select Sheets("vzor (2)").Name = (Range("A1").Value) Potřebuji ale aby se hodnota zdrojové bunky rostla +1 . ( A1,A2,A3 ...)
Přidáno: 11.01.16 20:33
Ahoj všem! Nedaří se mi nějak rozumě poskládat ani dohledat jak na makro, které bude pomocí dvou tlačítek v listu, přesouvat aktivní (vybraný) list před a nebo za list následující / předchozí... Listy v sešitu mohou mít různá jména a může jich být i různý počet, proto se nemohu chytat konkrétních jmen. Struktura sešitu je uzamčená, proto potřebuji ta tlačítka na rovnání listů které se tvoří zase jiným makrem... Pro tlačítko například "posun vpřed" - něco typu: ActiveSheet.Move After:= "za následující list" atd.. Nějak tuto blbinu nemohu dát dohromady. Děkuji všem za případné rady!
Přidáno: 19.04.16 10:50
Ahoj, potřeboval bych prosím Vás udělat makro pro tlačítko, přesun na další/předchozí (vedlejší) list. Jsem na jednom listu a chci se podívat na další/předchozí list, tak nahoře bych měl tyto tlačítko a jednoduše bych mohl mezi listy prohlížet. Máte někdo nějaký nápad? Děkuji
Přidáno: 02.06.16 20:23
To Petr: Není lepší využít hypertextový odkaz?
Přidáno: 11.08.16 11:01
Ahoj. Jsem v programování maker začátečník a potřeboval bych poradit, jak napsat kód. Když do buňky A1 zapíši jméno, chci, aby se automaticky přejmenoval List1. To samé v buňce A2, A3, atd. Děkuji za pomoc
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2024 |