Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
... jestliže, pak... a ne jinak :) Jak VBA program (makro) rozdělit do více větví podle určitých podmínek.
Doplněno: 10.6.2016
Při programování ve VBA mnohdy potřebujeme určitým způsobem usměrnit provádění příkazu, neboli větvit program. Využít můžeme příkazy If, Then, ElseIf, Else. Toto větvení může vzdáleně připomínat funkci KDYŽ, která je taktéž k dispozici v programu MS Excel.
Pro přehlednsot je článek rozdělen na kapitoly:
Trocha teorie do začátku:
If podmínka_1 Then
výsledek_1
ElseIf podmínka_2 Then
výsledek_2
...
ElseIf podmínka_n Then
výsledek_n
Else
výsledek_jinak
End If
Poznámka: ElseIf, Else jsou volitelné.
Použití porovnávací operátory:
If Name Like "*obsahuje*" Then
Použití logické operátory:
Podrobněji v článku: Operátory VBA Excel
Podrobněji o operátoru Like v článku: Operátory Like v VBA Excel
jestliže ... pak
Nejednodušší větvení. Přeloženo do češtiny: jestliže ... pak.
´jestliže je odpověď muž pak zobrazí zprávu.
IF Odpoved = "muz" Then
MsgBox "Jsi muž."
End If
Lze zapsat i do jednoho řádku:
If 8 > 2 Then MsgBox "8 Je větší než 2"
jestliže ... pak... jinak
Trochu složitější větvení. Odpovídá českému: jestliže, pak, jinak.
´jestliže je odpověď muž pak zobrazí zprávu jinak zobrazí jinou zprávu
IF Odpoved = "muz" Then
MsgBox "Jsi muž."
Else
MsgBox "Jsi žena."
End If
jestliže a - pak a ...jestliže b - pak b ... jinak
Nejsložitější, tedy relativně nejsložitější. Tímto způsobem můžeme přehledně usměrnit i velice složitý požadavek.
IF Vek < 15 Then
MsgBox "Jsi dite."
Elseif Vek < 30 Then
MsgBox "Jsi mlaďoch."
Elseif Vek < 60 Then
MsgBox "Jsi v nejlepších letech."
Else
MsgBox "Jsi téměř v důchodu."
End If
Jak opustit if then:
If Vek < 0 Then
Exit Sub
End If
Podrobněji v samostatném článku: Exit .
Jak zkontrolovat dvě podmínky, minimálně jedná musí být splněna. Kontrolována hodnota je umístěna v buňce B14.
Odpoved = Range("B14").Value
If Odpoved = "A" Or Odpoved = "B" Or Odpoved = "C" Then
MsgBox "Písmeno A, B nebo C"
Else
MsgBox "Jiné písmeno než A, B, C."
End If
Jak zkontrolovat dvě podmínky, které platí současně. Kontrolované hodnoty musí být umístěny v buňkách B18 a B20.
Odpoved1 = Range("B18").Value
Odpoved2 = Range("B20").Value
If Odpoved1 = "žena" And Odpoved2 = "ANO" Then
MsgBox "Jsi žena kuřačka."
ElseIf Odpoved1 = "žena" And Odpoved2 = "NE" Then
MsgBox "Jsi žena nekuřačka."
ElseIf Odpoved1 = "muž" And Odpoved2 = "NE" Then
MsgBox "Jsi muž nekuřák."
Else
MsgBox "Jsi muž kuřák."
End If
Zadat číslo a provést rozhodnutí, zda je sudé, nebo liché. V případě, že je zadáno něco jiného chybová hláška za využití On Error GoTo.
On Error GoTo nalezen_problem
Dim number As Integer
number = InputBox("Zadej číslo: ")
If number Mod 2 = 0 Then
MsgBox "Číslo sude!"
Else
MsgBox "Číslo liché!"
End If
Exit Sub
nalezen_problem:
MsgBox "Problém, asi nebylo zadáno číslo :)"
Jak na podmínky v Google tabulkách:
function IfThen2() {
var i = 2;
if (i == 1) {
Browser.msgBox( 1 );
}
else {
Browser.msgBox( "No 1." );
}
}
// ---------------------------------------------
function IfThen3() {
var i = 2;
if (i == 1) {
Browser.msgBox( 1 );
}
else if (i == 2) {
Browser.msgBox("Number Two.");
}
else {
Browser.msgBox( "No 1, 2." );
}
}
// ---------------------------------------------
function IfThenOR() {
var i = 2;
if (i == 1 || i == 2) {
Browser.msgBox( "i = 1 or i = 2" );
}
}
// -----------------------------------------------
function IfThenAND() {
var i = 2;
if (i == 2 && i == 2) {
Browser.msgBox( "i = 2 and i = 2" );
}
}
Soubor If Then Else - praktické příklady - Excel VBA ke stažení zdarma. Soubor využívá makra.
Tento článek je součástí on-line výukového kurzu VBA MS Excel.
Máte nějakou praktická ukázku jak používat podmínky ve VBA. Můžete zmínit 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: 02.07.14 12:26
Dobry den prajem, prvy krat vidim VBA, poradte mi prosim ak mozete mam v exceli stlpec A1 s udajmi a potrebujem ich rozsortovat. Zdroj zaciatok = xxx odbor = A titul = dsdasd strany = 10 koniec zaciatok = zzz odbor = B titul = ggdfgs strany = 9 koniec zaciatok = yyy odbor = C titul = ujhre strany = 69 koniec zaciatok = eee odbor = A titul = fsafaf strany = 80 koniec zaciatok = fff odbor = A titul = ghnjkw strany = 6 koniec zaciatok = qqq odbor = B titul = hjgks strany = 16 koniec Potrebujem z tohoto zdroja v stlpci A1 v sheete1 vytvorit Sheety s nazvom odboru teda jednotlive sheete sa budu volat: A, B, C a v tychto sheetoch budu zo sheetu 1, stlpca A1 jednotlive riadky, stlpce (bude to transponovane). Nazvy stlpcov v sheete A budu zaciatok, odbor, titul, strany, koniec. Vysledok: Sheet s nazvom A zaciatok odbor titul strany koniec xxx A dsdasd 10 eee A fsafaf 80 fff A ghnjkw 6 Sheet s nazvom B zaciatok odbor titul strany koniec xxx B ggdfgs 9 xxx B hjgks 16 dakujem uz vopred za pomoc, odpoved, cas.
Přidáno: 01.09.14 14:57
Dobrý den. Snažím se udělat podmínku if jestli porovnávaný parametr nabývá nějakou hodnotu z množiny hodnot 1, 3, 5, 7, anebo hodnotu z množiny 2, 4, 6, 8. Pokud ano, pak provede něco, pokud ne, provede něco jiného. Předpokládám, že bude nutno do toho nějak zapojit funkci pole. Něco ve smyslu: if a=(A1:A4) then, else if a=(A5:A8) then, else. Ale zatím se mne nepovedlo přijít na to jak. Napadá vás něco? Něco lepšího než to porovnávat postupně if a=1 then, else if a=2 then, else if a=3 then..... Pokud to hraje roli, potřebuju to obecně, ne pro sudá, a lichá čísla. Množin mám víc a obsahují i sudá i lichá čísla.
Přidáno: 03.09.14 07:57
To Poipop: Podľa toho, koľko je tých čísiel(ak sa to má riešiť obecne). Ak ich je menej, tak napr:Select Case TestovaneCislo
Case 1, 3, 5, 7
'Ak splnené...
Case 2, 4, 6, 8
'Ak splnené...
Case Else
'Ostatné prípady
End Select
--pri väčšom počte by som to riešil napr. cez pole...
Přidáno: 30.09.14 19:00
Dobrý den, dostali jsme úkol ve škole že máme vytvořit svojí vlastní funkci, kde přiřadíme různé lidi do dvou skupin. Přesněji máme udělat funkci, která do buňky napíše Dítě jestliže je věk osoby menší než osmnáct a pokud je větší než osmnáct tak je to dospělý.
Přidáno: 06.10.14 08:21
To Ondra: -- (Dospelý ak >=18) -- =KDYŽ(A1<18;"Dítě";"dospělý")
Přidáno: 13.10.14 08:04
To Ondra: Více o funkci KDYŽ a jejím použití v samostatném článku KDYŽ - praktické použití logické funkce
Přidáno: 25.12.15 20:49
Dobrý den, existuje v Excelu způsob, jakým třeba i jinou funkci než IF použít následujícím způsobem? =KDYŽ($F4="Výdaj";"O2-G4";"O2+G4") Vysvětlením: tak aby, pokud v určité buňce bude určité slovo, aby se provedla určitá početní operace? Třeba i složitější funkce? Mám za to, že IF může vrátit jenom přesně definované slovo, a k tomuto úkonu se moc nehodí. Děkuji předem za odpověď.
Přidáno: 07.01.16 19:38
Zdravím, není tady někde, jak se dá udělat negace? Tedy, potřebuju rozeznat, zda hodnota NENÍ nulová, podle toho přičítám určité číslo.
Mám následující kód:
Dim osoby As Variant
osoby = ThisWorkbook.Sheets("List1").Range("A3:A36")
Dim pocet As Variant
pocet = 0
If osoby(1, 1) = Not Null Then
pocet = pocet + 1
End If
S tím, že těch osob je až 34 :D Řešeno pomocí samostatných Ifů, které jsou po sobě řetězem. Zkontroluje se nejprve první buňka, pokud není prázdná, má se přičíst jednička k počtu osob (na začátku makra se nuluje, pro jistotu). A takhle to pokračuje až k poslední, 34. buňce.
Jenže problém je v tom, že ani, když něco napíšu do jedné z kontrolovaných buněk, tak to nechce přičítat.
Jak mám definovat nulovou hodnotu a jak to znegovat? :(
Přidáno: 15.01.16 10:41
To Ondra: Pokud to dobře chápu tak ti stačí nahradit řádek: If osoby(1, 1) = Not Null Then řádkem: If osoby(1, 1) <> "" Then Tento zápis znamená přesně to, že hodnota není nulová.
Přidáno: 10.06.16 16:41
subor s prikladmy sa neda stiahnut.
Přidáno: 13.06.16 22:55
To Miro: Opraveno a stažení opět funguje.
Přidáno: 16.06.16 09:47
Zdravím, tisknu adresní štítky na balíky příklad: náklad je 250 ks balík je 200 ks má to tedy vytisknout 2 štítky označení 1/2 jako první balík ze dvou s balíkem 200 ks, a 2/2 jako druhý ze dvou se zbytkem 50ks. Pokud ale náklad 100 ks a balík 100 ks vytiskne se 1 štítek 1/1 náklad 100 ks a balík 100 ks OK.
Jak ale dám náklad třeba 211 ks a balík 200 ks dostanu 3 balíky 2x100 a jeden 11 ks ( mají býd jen 2 1x 100 a 1x 11ks) Můžete někdo poradit, kde je chyba v kódu?
Private Sub CommandButton21_Click()
Dim i, balik As Long
Dim adresa As String
Dim naklad As Long
Dim celychbaliku As Long
Dim poslednibalik As Long
'Dim zbytek As Long
EnvironConst1 = Environ("UserName")
Titulek_dialogu2 = "zadej náklad"
Titulek_dialogu3 = "zadej velikost v balíku"
Titulek_dialogu5 = "zadej adresu"
'pocet = InputBox(Titulek_dialogu)
naklad = InputBox(Titulek_dialogu2)
balik = InputBox(Titulek_dialogu3)
adresa = InputBox(Titulek_dialogu5)
celychbaliku = naklad / balik
poslednibalik = (naklad Mod balik)
If poslednibalik > 0 Then celychbaliku = celychbaliku + 1
If poslednibalik = 0 Then celychbaliku = celychbaliku
'If celychbaliku = celychbaliku Then balik = poslednibalik
For i = 1 To celychbaliku
Cells(30, 2).Value = i & "/" & celychbaliku
Cells(29, 4).Value = naklad
If i = celychbaliku And poslednibalik = 0 Then Cells(29, 2).Value = naklad
If i = celychbaliku And poslednibalik > 0 Then Cells(29, 2).Value = poslednibalik
If i < celychbaliku And poslednibalik > 0 Then Cells(29, 2).Value = balik
If i < celychbaliku And poslednibalik = 0 Then Cells(29, 2).Value = naklad
If i < celychbaliku Then Cells(29, 2).Value = balik
Cells(12, 2).Value = adresa
ActiveSheet.PageSetup.CenterFooter = ("&B&8 strany: " & i & " / " & celychbaliku)
ActiveSheet.PageSetup.LeftFooter = ("&B&8Uživatel: " & EnvironConst1)
''********* vloží do patičky listu - do levého oddílu ****&B&12 - font tučné velikost 8
'ActiveWindow.SelectedSheets.PrintOut ´******************Tisk na předvolenou
ActiveSheet.PrintOut Preview:=True '********************Ukázka před tiskem
Next i
End Sub
Přidáno: 17.06.16 07:42
To PAVEL D: -- Zdá sa mi, že v zadaní sú preklepy, ale ak som dobre porozumel otázke, riešil by som to takto:
Riadky:
celychbaliku = naklad / balik
poslednibalik = (naklad Mod balik)
If poslednibalik > 0 Then celychbaliku = celychbaliku + 1
If poslednibalik = 0 Then celychbaliku = celychbaliku
Nahradiť s:
celychbaliku = Int(naklad / balik)
poslednibalik = (naklad Mod balik)
MsgBox "celychbaliku " & celychbaliku & vbCrLf & "poslednibalik " & poslednibalik
Přidáno: 26.11.16 17:34
Vážení, jsemť já dříve narozený a dokonce jsem si dokázal udělat pamětníček, který funguje celý rok. Ve sloupci A 1.1.2016 přidám k dalšímu řádku +1 a táhnu až do konce roku. Ve sloupci A nastavím formát ddd - dd.mm.rrrr a je to. Jenom nevím, jak zadat podmínku, aby se pro so a ne vybarvilo políčko, abych to nemusel dělat ručně. Děkuji za radu
Přidáno: 20.12.16 07:08
Dobrý den, rád bych poprosil o pomoc s VBA (nebo s jiným programovacím jazkykem jsem nikdy nedělal). Snažím se vytvořit funkci s podmínkou IF s podobnou syntaxí... IF v buňce A1 (seznam) bude text "XXX" THEN zapiš do buňky A2 "číslo" ELSEIF atd...stále se mi to nedaří vytvořit :( díky za Váš čas i pomoc!
Přidáno: 21.12.16 08:07
To Lukáš:' Range("A1") je možné nahradiť s Cells(1, 1)
If Range("A1") = "XXX" Then
'Ak = "XXX"
Range("A2") = 11 ' číslo1
ElseIf Range("A1") = "YYY" Then
'Ak = "YYY"
Range("A2") = 22 ' číslo2
Else
'Inak rob toto...
Range("A2") = "iné" ' text
End If
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 |