Přeskočit navigaci | Přeskočit na novinky

Nový videokurz na Seduo: Excel pro začátečníky

     

Jste zde: Úvodní stránka » excel » vba-listy-sheet » listy-sheet-pridat-smazat-excel-vba

Práce s listy sheet - Microsoft Excel VBA


Základní makra (VBA) pro práci s Listy v Microsoft Excel.

Doplněno a rozšířeno: 22.12.2013

Úvod

Microsoft Excel logo

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ů:


1. Výběr listu

Příkaz vybere List3

Sheets("List3").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

2. Přidání listu

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.

3. Přejmenování listu

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.

4. Smazat list

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.

5. Zjištění počtu listu

Tento příkaz zjistí počet listu v sešitu MS Excel. Hodnota se uloží do NoveJmenopocetListu

pocetListu = Sheets.Count

6. Zjištění jména listu

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

7. Přesouvání listu

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)

8. Vypsaní seznamu z listů

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 :)

9. Přepnutí do jiného sešitu

Příkaz "aktivuje" jiný sešit MS Excelu pod názvem sesit-1.xls

Windows("sesit-1.xls").Activate

Závěr

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: 31.10.2015 20:31

Odměna

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.


Pavel Lasák

Pavel Lasák - autor webu

Microsoft Office (Word, Excel, PowerPoint) se věnuji od roku 2006. Své vědomosti a zkušenosti dávám k dispozici na různých školeních a konzultacích, ale také na tomto webu. K dispozici na tomto webu je mnoho návodu, tipů a triků včetně desítek různých šablon.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil

Doporučte tento článek přátelům

Pokud vám článek pomohl, případně si myslíte, že může pomoci i někomu dalšímu, budu rád když jej sdílením doporučíte přátelům - děkuji:



Komentáře


Vorel

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.

Pavel Lasák

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 ...

Vít Prchal

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ěď

Pavel Lasák

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

David

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

Pavel Lasák

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/

Martin

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

Pavel Lasák

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é?

Martin

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.

Martin

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.

Stanley

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.

Stanley

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

Martin

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

Petr Pecháček

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.

Pavel Lasák

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.

miro

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

Karel Kyncl

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.

Honza

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...

Pavel Lasák

Přidáno: 17.04.14 20:56

To Honza: Bylo to v prosinci loňského roku, upravil jsem rok. Děkuji.

Michal

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

Tereza

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ěď.

Jarda

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

Jarda

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.

Jojo

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

Pavel Kudělka

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.

Jojo

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ď.

Kobe

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

Zbygi

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.

Zbygi

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

Jojo

Přidáno: 26.05.15 08:08

To Zbygi: -- Výber listu podľa hodnoty v bunkeSheets(Range("A1").value).Select

Vojtaha

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 ...)

aleuž

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!

Petr

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

Pavel Lasák

Přidáno: 02.06.16 20:23

To Petr: Není lepší využít hypertextový odkaz?

Radek

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


Přidání nového komentáře

Poznámka: Z časových důvodu není v mých sílách zodpovědět všechny dotazy. Děkuji za pochopení.




(vlož číslo padesátpět)

Z bezpečnostních důvodu dočasně nemůžete použít HTML značky, kromě <code> a </code> (pro vkládání VBA kódu). Děkuji za pochopení.
Děkuji, za Vaše komentáře.

Za obsah komentářů neodpovídám, jelikož jsou komentáře publikovány ihned po jejich napsání čtenářem. Toto nemohu nijak ovlivnit. Přesto si vyhrazuji možnost jakýkoli neslušný komentář smazat bez udání důvodu. V komentářích si tykáme. ;-)






Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Newsletter

Přihlaste se odběru novinek a získejte:
Ebook zdarma -
10 kroků ke zvládnutí (Word, Excel, PowerPoint)
Šipka Kniha 3D Více o ebooku ...

TOPlist Licence Creative Commons webarchiv rss XML

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 - 2016 | 44438

Tento web zatím neprošel jazykovou korekturou. Beta verze redakčního systému.