Excel Makra VBA Příklady

Toto je stránka s příklady 15 hotových užitečných maker. Je to určeno pro mírně pokročilé uživatele, kteří si umí zkopírovat kód makra do svého Excelu.

Pokud to ještě neumíte, můžete se to naučit na mém firemím školení MS Excel, v mém online kurzu pro jednotlivce nebo webináři pro jednotlivce.

⚠️ Upozornění: Makra jsou již dnes historická technologie. Napište mi a já vám poradím, jak přejít na modernější nástroje jako je PowerQuery, OfficeScript a PowerAutomate.

Pokud se chcete v Excelu zlepšovat zdarma, přihlašte se k mým týdenním Excel tipům do emailu

Úvod

Makra jsou krátké prográmky, ve kterých je zaznamenán nějaký postup práce v Excelu.

Makra lze vytvořit

  • Nahráváním – předvedete počítači činnost, ten si jí zapamatuje a opakuje. „Slepý robot“ Funguje jen pro jednoduché případy
  • Z internetu – spoustu věcí, co řešíte, vyřešil už někdo před vámi. Googlete VBA + popis toho, co chcete řešit, ideálně v angličtině. Ne všechno musí fungovat.
  • Programováním – Makro si můžete naprogramovat v jazyku Visual basic. To chce trochu cviku, ale pak zvládnete cokoli.

Makro je uloženo

  • V sešitu. V tom případě musí být uložen jako xlsm. Když je sešit s makrem otevřený, makro funguje i ve všech ostatních otevřených sešitech.
  • V osobním sešitu maker. To je neviditelný sešit na pozadí. Makro bude fungovat na vašem počítači vždy.

Makro se může spustit několika způsoby

  • Klávesovou zkratkou
  • Z menu na kartě vývojář
  • Tlačítkem na vlastní kartě
  • Tlačítkem na listě rychlého spuštění
  • Tlačítkem přímo v sešitu
  • Přímo po otevření sešitu

Tahák na makra zdarma

Stáhněte si tahák na makra. Přijde vhod zejména mírně pokročilým uživatelům.

Makra z Internetu – příklady

Makra z internetu zkopírujte a vložte přes Visual Basic do modulu sešitu, kde chcete aby bylo. Makra z internetu nemusí vždy fungovat! Někdy je třeba vyzkoušet více zdrojů.

Toto je několik mých oblíbených maker, které jsem prověřil, že by měly fungovat v MS Office 365 české i anglické verzi:

1 Převedení všech vzorců na listu na hodnoty

Sub Nahodnoty()
With ActiveSheet.UsedRange
.Value = .Value
End With
End Sub

Zdroj: TrumpExcel.com

2 Odkrytí všech skrytých listů

Sub UnhideAllWorksheet()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
End Sub

Zdroj: ExcelChamps.com

3 Zamknutí a odemknutí všech listů na heslo

Sub ZamknoutVsechnyListy()
Dim ws As Worksheet
Dim ps As String
ps = InputBox("Zadejte Heslo:", vbOKCancel)
For Each ws In ActiveWorkbook.Worksheets
ws.Protect Password:=ps
Next ws
End Sub

A druhé makro na odemknutí

Sub OdemknoutVsechnyListy()
Dim ws As Worksheet
Dim ps As String
ps = InputBox("Zadejte Heslo:", vbOKCancel)
For Each ws In ActiveWorkbook.Worksheets
ws.Unprotect Password:=ps
Next ws
End Sub

Zdroj: ExcelChamps.com

4 Seřadit všechny listy podle abecedy

Sub SeraditListyAbecedne()
Application.ScreenUpdating = False
Dim ShCount As Integer, i As Integer, j As Integer
ShCount = Sheets.Count
For i = 1 To ShCount - 1
For j = i + 1 To ShCount
If Sheets(j).Name < Sheets(i).Name Then
Sheets(j).Move before:=Sheets(i)
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub

Zdroj: TrumpExcel.com

5 Odkrýt všechny skryté řádky a sloupce

Sub OdkrytRadkySloupce()
Columns.EntireColumn.Hidden = False
Rows.EntireRow.Hidden = False
End Sub

Zdroj: ExcelChamps.com

6 Vytvoření záložní kopie dokumentu, se kterým pracujete

Vytvoří do stejné složky kopii tohoto souboru s datumem a časem uložení.

Pozor, nefunguje u dokumentů uložených na Onedrive nebo Sharepointu!

Sub Zaloha()
ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & _
"\" & Format(Now, "yyyy-mm-dd hh-mm-ss") & " " & _
ActiveWorkbook.name
End Sub

7 Poslání aktuálního dokumentu emailem

7a Jednoduchá verze pro ty, co nemají Outlook:

Pokud nepoužíváte Microsoft outlook, zkuste tuto jednodušší verzi, která aktuální dokument pošle výchozím emailovým klientem. Je možné, že to nebude fungovat, zejména pokud používáte webové rozhraní pro mail.

Sub OpenWorkbookAsAttachment()
Application.Dialogs(xlDialogSendMail).Show
End Sub

Zdroj: ExcelChamps.com

7b Pokročilejší verze, co funguje jen s Outlookem

Pokud máte Microsoft Outlook, použijte toto makro, které umožňuje mnohem větší možnosti, například upravit text zprávy.

Sub Send_Mail()
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.to = "excel@jiribenedikt.com"
.Subject = "Report KPIs"
.Body = "Milý týme, posílám v příloze report za předchozí měsíc."
.Attachments.Add ActiveWorkbook.FullName
.display
End With
Set OutMail = Nothing
Set OutApp = Nothing
End Sub

Za řádek s příjemcem můžete přidat také řádky pro kopii a skrytou kopii. Více mailů oddělujte středníkem:

.cc = "adam@jiribenedikt.com;bara@jiribenedikt.com"
.bcc = "cyril@jiribenedikt.com"

Pokud nahradíte

.display

příkazem

.send

Email se rovnou odešle bez náhledu.

Zdroj: ExcelChamps.com

8 Zpráva při otevření sešitu

Sub auto_open()
MsgBox "Dobry den. Toto je pracovni sesit ke kurzu. Vsechny detaily najdete na www.jiribenedikt.com"
End Sub
Sub auto_close()
MsgBox "Diky, bylo to fajn. Kdyby neco, napiste"
End Sub

Zdroj: ExcelChamps.com

9 Vytvoření automatického obsahu

Sub Obsah()
Dim i As Long
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Obsah").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Activeworkbook.Sheets.Add Before:=ActiveWorkbook.Worksheets(1)
ActiveSheet.Name = "Obsah"
For i = 1 To Sheets.Count
With ActiveSheet
.Hyperlinks.Add _
Anchor:=ActiveSheet.Cells(i, 1), _
Address:="", _
SubAddress:="'" & Sheets(i).Name & "'!A1", _
ScreenTip:=Sheets(i).Name, _
TextToDisplay:=Sheets(i).Name
End With
Next i
End Sub

Zdroj: ExcelChamps.com

10 Smazat všechny prázdné řádky z listu

Sub SmazatPrazdneRadky()
    Dim LastRowIndex As Integer
    Dim RowIndex As Integer
    Dim UsedRng As Range
 
    Set UsedRng = ActiveSheet.UsedRange
    LastRowIndex = UsedRng.Row - 1 + UsedRng.Rows.Count
    Application.ScreenUpdating = False
 
    For RowIndex = LastRowIndex To 1 Step -1
        If Application.CountA(Rows(RowIndex)) = 0 Then
            Rows(RowIndex).Delete
        End If
    Next RowIndex
 
    Application.ScreenUpdating = True
End Sub

Zdroj: Ablebits.com

11 Rozdělení na více listů podle jednoho sloupce

Sub RozelitNaListyPodleSloupce()
'updateby Extendoffice
Dim lr As Long
Dim ws As Worksheet
Dim vcol, i As Integer
Dim icol As Long
Dim myarr As Variant
Dim title As String
Dim titlerow As Integer
Dim xTRg As Range
Dim xVRg As Range
Dim xWSTRg As Worksheet
On Error Resume Next
Set xTRg = Application.InputBox("Prosím vyberte řádek s hlavičkou (nadpisy sloupců):", "Jiri Benedikt", "", Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
Set xVRg = Application.InputBox("Prosím vyberte sloupec, podle kterého chcete data rozdělit:", "Jiri Benedikt", "", Type:=8)
If TypeName(xVRg) = "Nothing" Then Exit Sub
vcol = xVRg.Column
Set ws = xTRg.Worksheet
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
title = xTRg.AddressLocal
titlerow = xTRg.Cells(1).Row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
Application.DisplayAlerts = False
If Not Evaluate("=ISREF('xTRgWs_Sheet!A1')") Then
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
Else
Sheets("xTRgWs_Sheet").Delete
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
End If
Set xWSTRg = Sheets("xTRgWs_Sheet")
xTRg.Copy
xWSTRg.Paste Destination:=xWSTRg.Range("A1")
ws.Activate
For i = (titlerow + xTRg.Rows.Count) To lr
On Error Resume Next
If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
End If
Next
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
ws.Columns(icol).Clear
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = myarr(i) & ""
Else
Sheets(myarr(i) & "").Move after:=Worksheets(Worksheets.Count)
End If
xWSTRg.Range(title).Copy
Sheets(myarr(i) & "").Paste Destination:=Sheets(myarr(i) & "").Range("A1")
ws.Range("A" & (titlerow + xTRg.Rows.Count) & ":A" & lr).EntireRow.Copy Sheets(myarr(i) & "").Range("A" & (titlerow + xTRg.Rows.Count))
Sheets(myarr(i) & "").Columns.AutoFit
Next
xWSTRg.Delete
ws.AutoFilterMode = False
ws.Activate
Application.DisplayAlerts = True
End Sub

Zdroj: Extendoffice.com

12 Uložení listů do jednotlivých dokumentů

Sub UlozitPoListech()
'Updateby20140612
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim xWs As Worksheet
Dim xWb As Workbook
Dim FolderName As String
Application.ScreenUpdating = False
Set xWb = Application.ActiveWorkbook
DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")
FolderName = xWb.Path & "\" & xWb.Name & " " & DateString
MkDir FolderName
For Each xWs In xWb.Worksheets
    xWs.Copy
    If Val(Application.Version) < 12 Then
        FileExtStr = ".xls": FileFormatNum = -4143
    Else
        Select Case xWb.FileFormat
            Case 51:
                FileExtStr = ".xlsx": FileFormatNum = 51
            Case 52:
                If Application.ActiveWorkbook.HasVBProject Then
                    FileExtStr = ".xlsm": FileFormatNum = 52
                Else
                    FileExtStr = ".xlsx": FileFormatNum = 51
                End If
            Case 56:
                FileExtStr = ".xls": FileFormatNum = 56
            Case Else:
                FileExtStr = ".xlsb": FileFormatNum = 50
        End Select
    End If
    xFile = FolderName & "\" & Application.ActiveWorkbook.Sheets(1).Name & FileExtStr
    Application.ActiveWorkbook.SaveAs xFile, FileFormat:=FileFormatNum
    Application.ActiveWorkbook.Close False
Next
MsgBox "You can find the files in " & FolderName
Application.ScreenUpdating = True
End Sub

Zdroj: Extendoffice.com

13 Uložit všechny listy jednotlivě jako PDF

Sub UlozitJednotlivePDF()
 
Dim ws As Worksheet
 
DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")
FolderName = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & " PDF " & DateString
MkDir FolderName

For Each ws In Worksheets
ws.Select
nm = ws.Name
 
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=FolderName & "\" & nm & ".pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
 
Next ws
 
End Sub

14 Odstranění diakritiky

Toto je vlastní funkce. K použití zadáte do buňky =BEZDIAKRITIKY( a jako její vstup zadáte text, ze kterého má odstranit diaktitiku.) V této jednoduché podobě nefunguje v osobním sešitě maker!

Function BEZDIAKRITIKY(thestring As String)
Dim A As String * 1
Dim B As String * 1
Dim i As Integer

Const AccChars = "áäčďéěíĺľňóôőöŕšťúůűüýřžÁÄČĎÉĚÍĹĽŇÓÔŐÖŔŠŤÚŮŰÜÝŘŽ"
Const RegChars = "aacdeeillnoooorstuuuuyrzAACDEEILLNOOOORSTUUUUYRZ"

For i = 1 To Len(AccChars)
    A = Mid(AccChars, i, 1)
    B = Mid(RegChars, i, 1)
    thestring = Replace(thestring, A, B)
Next

BEZDIAKRITIKY = thestring
End Function

Zdroj: Miroslavpecka.cz

Pomocná makra pro programování

Často potřebujete v makru procházet jednotlivé položky řádek po řádku až k poslednímu popsanému řádku. Protože nevíte, kolik řádků je, je potřeba využít nějaký postup. Já to dělám takto jako v makru níže. Pomocí tohoto makra můžete projít všechny hodnoty v daném sloupci a pro každou něco udělat – např. vložit list, který se jmenuje podle hodnoty dané buňky a podobně. Také můžete spočítat, kolik vlastně řádků v tabulce je:

Smyčka do posledního popsaného řádku

Pokud chcete jen vědět, jaký je poslední popsaný řádek v daném listu, můžete si jeho číslo takto uložit do proměnné:

lastrow = ActiveSheet.UsedRange.Rows.Count

Pokud chcete řádky upravovat po jednom od shora až po poslední řádek před prvním prázdným řádkem (nemusí to nutně být ten poslední, v případě, že jsou jen vynechané řádky).

Sub cyklus()

'kde začít
sloupec = 3
radek = 1

Do Until IsEmpty(Cells(radek, sloupec))

'sem přijde, co se dá opakovat pro každou buňku, jak jimi budeme postupně projíždět

    'například zde to přečte obsah řádku a vyskočí jako vyskakovací okno
    MsgBox (Cells(radek, sloupec))

'posunout se na další řádek
radek = radek + 1

'(pokud se chcete posouvat po sloupcích, jednoduše místo přičtení řádku o jedna přičtěte sloupec o 1)

Loop

'nyní je v proměnné řádek uložen první prázdný řádek. Pokud potřebujete vědět poslední popsaný řádek, tak to spočítáte takto

posledniradek = radek - 1
End Sub

Získejte přístup k dalším materiálům

Přihlašte se a získáte další Excel příklady, tajné tipy, triky a materiály. Každý týden obdržíte jednu novou věc zdarma: