Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem triviální makro

Zdravím,

pokouším se začínat s makry v Excelu. Chci udělat takovou logickou hříčku - v buňkách H7 až H11 může být logická hodnota 1 nebo 0. Každé z pěti tlačítek změní logickou hodnotu v jiných buňkách (např. tlačítko 1 mění hodnotu v buňce H7, tlačítko 2 mění hodnotu v buňce H7 a H9, atd.). Problém je, že mi to nefunguje:) Tlačítko 2 změní pouze hodnotu H7 z 1 na 0, ale to je vše. Najde tam prosím chybu? Díky

Sub Makro2()
'
' Makro2 Makro
'

'
h1 = Range("H7").Value
h2 = Range("H8").Value
h3 = Range("H9").Value
h4 = Range("H10").Value
h5 = Range("H11").Value
If h1 = 0 And h3 = 0 Then
Range("h7").FormulaR1C1 = "1" And Range("h9").FormulaR1C1 = "1"
ElseIf h1 = 0 And h3 = 1 Then
Range("h7").FormulaR1C1 = "1" And Range("h9").FormulaR1C1 = "0"
ElseIf h1 = 1 And h3 = 0 Then
Range("h7").FormulaR1C1 = "0" And Range("h9").FormulaR1C1 = "1"
Else
Range("h7").FormulaR1C1 = "0" And Range("h9").FormulaR1C1 = "0"

End If


End Sub
Předmět Autor Datum
Můžeš znovu popsat, čeho se snažíš dosáhnout? A hlavně vložit přílohu. Protože z toho kódu je kulový…
Siki83 24.01.2017 19:51
Siki83
Celé, čo si vytvoril, sa dá zapísať, po opravách, takto: Sub Makro() h1 = Range("H7").Value h2 = Ra…
robert13 24.01.2017 21:52
robert13
sorry... našiel som si tam chybu... Správne je: Sub Makro2() Select Case Range("H7") Case 0 Range("… poslední
robert13 25.01.2017 10:17
robert13
Překlopení hodnot buňky z 0 na 1 a naopak můžeš udělat daleko elegantněji, než IFem s testováním, zd…
Machr55 25.01.2017 08:33
Machr55
pokiaľ použije booleanovské hodnoty True a False, stačí na preklopenie Not: Range("H7")=Not (Range(…
robert13 25.01.2017 08:43
robert13
Jasně. Já jsem se jen držel zadání autora, chtěl přepínat mezi 0 a 1...
Machr55 25.01.2017 08:49
Machr55

Celé, čo si vytvoril, sa dá zapísať, po opravách, takto:

Sub Makro()
h1 = Range("H7").Value
h2 = Range("H8").Value
h3 = Range("H9").Value
h4 = Range("H10").Value
h5 = Range("H11").Value
If h1 = 0 And h3 = 0 Then
    Range("H7") = 1
    Range("H9") = 1
    ElseIf h1 = 0 And h3 = 1 Then
        Range("H7") = 1
        Range("H9") = 0
        ElseIf h1 = 1 And h3 = 0 Then
            Range("H7") = 0
            Range("H9") = 1
            Else
            Range("H7") = 0
            Range("H9") = 0
End If
End Sub

alebo trocha upravenejšie, po odstránení zbytočností, takto:

Sub Makro()
Select Case Range("H7")
    Case 0
        Range("H7") = 1
    Case 1
        Range("H7") = 0
End Select
Select Case Range("H9")
    Case 0
        Range("H9") = 1
    Case 1
        Range("H7") = 0
End Select
End Sub

a dalo by sa to ešte jednoduchšie, keby si namiesto 1 a 0 používal True a False, lenže:

Nech Ti už tlačítka menia hodnoty v bunkách H7 H11 hocijak, keď prebehne kód pre novú kombináciu hodnôt v H7 H11 , horný, či spodný kód robí to isté: pri každom spustení makra sa znegujú hodnoty v bunkách H7 a H9. Nič iné

Priraďovanie do premenných h1...h5 tu nemá zmysel a príkazy, ktoré sa majú vykonať pri splnení určitých podmienok, sa nespájajú operátorom And, ale jednotlivé príkazy sa píšu samostatne, do svojich riadkov.

To ale asi nie je to, čo si chcel. Možno si len nedobre popísal celú činnosť, cieľ si už nepopísal vôbec, alebo máš chybnú predstavu o tom, čo sa vlastne deje pri vykonávaní kódu a čo všetko treba premyslieť a ako to povedať počítaču, aby sa to správalo tak, ako Ty chceš.
To je to prvé, čo musíš, pri začínaní s programovaním, vedieť.

Urob si kontrolu:
Otvor si dve okná vedľa seba, pričom v prvom budeš mať hárok Excelu s bunkami H7 až H11 a v druhom budeš mať Editor VBA s týmto kódom.
V okne Editora VBA sa nastavíš do názvu makra a stláčaním klávesy F8 necháš kód makra krokovať po riadkoch, pri čom môžeš sledovať v hárku Excelu, ako sa vykonávajú jednotlivé príkazy a čo spôsobujú...

Výsledok tohto celého:
Keďže nevieme, čo si chcel dosiahnuť, ani Ti neporadíme, v čom máš chybu.

P.S. Tie kódy, čo som sem vložil, sú len tým istým, čo si napísal Ty, po odstránení chýb spôsobu zápisu...

sorry... našiel som si tam chybu...
Správne je:

Sub Makro2()
Select Case Range("H7")
    Case 0
        Range("H7") = 1
    Case 1
        Range("H7") = 0
End Select
Select Case Range("H9")
    Case 0
        Range("H9") = 1
    Case 1
        Range("H9") = 0
End Select
End Sub

toto robí to čo chceš:
po každom spustení zneguje obsah buniek H7 a H9

P.S.
tento príspevok je len kvôli oprave chyby, ale ešte raz zrekapitulujem aj ostatné:
Ak budeš namiesto 0 používať výraz False (Nepravda) a namiesto 1 výraz True (Pravda), tak to bude ešte jednoduchšie:

Sub Makro2()
     Range("H7")=Not(Range("H7"))
     Range("H9")=Not(Range("H9"))
End Sub

Alebo ešte ako píše nižšie Machr, môžeš samotnú negáciu použiť ako samostatnú procedúdu, do ktorej budeš tlačítkom odosielať adresy viacerých buniek ako argumenty.
Je to detto to, čo píše Machr, rozdiel je len v spôsobe negácie.

Překlopení hodnot buňky z 0 na 1 a naopak můžeš udělat daleko elegantněji, než IFem s testováním, zda je v buňce 0 nebo1, třeba za použití operátoru Mod (Modulo = zbytek po dělení). Pro každou buňku pak stačí napsat 1 řádek:

Range("H7").Value = (Range("H7").Value + 1) Mod 2

Tenhle řádek si pak můžeš dát do samostatné procedury a adresu buňky použiješ jako parametr. Ke každému tlačítko si pak napíšeš obslužnou proceduru, v které budeš volat tu proceduru s adresou buňky, kterou chceš změnit. Pokud budeš chtít jedním tlačítkem změnit obsah více buněk, zavoláš tu pomocnou proceduru vícekrát, vždy s jinou adresou buňky.
Aby to bylo snáze pochopitelné; píšeš:

... např. tlačítko 1 mění hodnotu v buňce H7, tlačítko 2 mění hodnotu v buňce H7 a H9...

Tak přesně tohle řeší následující kód:

Sub Preklop01(Adresa As String)
' Parametr: Adresa buňky (např. "B2", "H7", ...)
' Procedura překlopí obsah předávané buňky z 0 na 1 a naopak
    Range(Adresa).Value = (Range(Adresa).Value + 1) Mod 2
End Sub

Sub Tlacitko1()
' Obsluha Tlačítka 1 - změní obsah buňky H7
    Preklop01 ("H7")
End Sub

Sub Tlacitko2()
' Obsluha Tlačítka 2 - změní obsah buněk H7 a H9
    Preklop01 ("H7")
    Preklop01 ("H9")
End Sub

Při vytváření tlačítek si pak musíš ke každému tlačítku na listu přiřadit odpovídající makro.

Zpět do poradny Odpovědět na původní otázku Nahoru