< návrat zpět
MS Excel
Téma: Private Sub Workbook_SheetChange
Zaslal/a pepok4 22.4.2013 14:37
Ahojte,
chcel by som Vas poprosit o pomoc pri nasledovnom probleme. Chcem, aby sa dynamicky menil obsah buniek v zavislosti od toho co vyberiem z drop-down menu v bunke C3. Chcem aby sa povodny rozsah B8:D9 vymazal aj s formatovanim. Nasledne by sa prekopirovala tabulka prisluchajuca vybratemu typu zo Sheet3 na Sheet1 na to iste miesto.
Nechapem preco pri SheetChange udalosti nefunguje klasicke VBA, ktore si nahram aj cez nahravanie makra. Vie mi niekto aj toto objasnit, pripadne ma niekto materialy, aby som lepsie pochopil syntax programovania udalosti.
Dakujem.
Příloha: 13045_example.zip (14kB, staženo 23x)
AL(23.4.2013 1:22)#013062 Minimum, aby to vôbec fungovalo, je asi toto:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.CodeName = "Sheet1" And Target.Address = Range("B3").Address Then 'je potrebne otestovat, ci menis bunku B3
Select Case Range("B3")
Case "A1"
MsgBox "Vybral si TYP A1"
ThisWorkbook.Sheets("Sheet1").Select
Range("B8:D9").Clear
Selection.Clear
ThisWorkbook.Sheets("Sheet3").Activate
Range("A3:C4").Copy
ThisWorkbook.Sheets("Sheet1").Activate
Range("B8").Select 'zabudol si na riadok, urcil si len stlpec
ActiveSheet.Paste
Case "A2"
MsgBox "Vybral si TYP A2"
Case "B1"
MsgBox "Vybral si TYP B1"
Case "B2"
MsgBox "Vybral si TYP B2"
Case "C1"
MsgBox "Vybral si TYP C1"
Case "C2"
MsgBox "Vybral si TYP C2"
Case Else 'je potrebne mysliet na eventualitu, kedy do B3 zapises i inu hodnotu, nez hore vymenovane
MsgBox "ine"
End Select
End If
End SubV kóde som urobil iba minimálne úpravy, aby si videl, kde bol hlavný problém
citovat
pepok4(23.4.2013 9:48)#013066 Vdaka za odpoved a riesenie.
Ja som vcera nad tym dumal preco sa mi moje povodne riesenie zacyklovalo a nasiel som dalsie funkcne riesenie:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Range("B3")
Case "A1"
MsgBox "Vybral si TYP A1"
ThisWorkbook.Sheets("Sheet1").Select
Application.EnableEvents = False
Range("B8:D9").Clear
ThisWorkbook.Sheets("Sheet3").Select
Range("A3:C4").Select
Selection.Copy
ThisWorkbook.Sheets("Sheet1").Select
Range("B8").Select
ActiveSheet.Paste
Application.EnableEvents = True
Case "A2"
MsgBox "Vybral si TYP A2"
Case "B1"
MsgBox "Vybral si TYP B1"
Case "B2"
MsgBox "Vybral si TYP B2"
Case "C1"
MsgBox "Vybral si TYP C1"
Case "C2"
MsgBox "Vybral si TYP C2"
End Select
End Sub
Bolo potrebne pridat prikaz na zamedzenie zacyklenia:
Najprv false:
Application.EnableEvents = False
Potom vratenie na True:
Application.EnableEvents = Truecitovat
pepok4(24.4.2013 8:26)#013076 Ahoj AL,
este by som sa Ta spytal, ci je nejako mozne zmenit nazov listu "Sheet1" na nejaky iny?
V mojom pripade, ked zmenim pomenovanie listu v exceli a potom aj v kode, tak mi to nefunguje.
Vdaka.
citovat
eLCHa(24.4.2013 8:35)#013077 Pokud list přejmenováváte, místo
ThisWorkbook.Sheets("Sheet1")
používejte kódové jméno listu (najdete ve vb editoru) ve složce
Microsoft Excel Objects před závorkou
pak jen např.:
ThisWorkbook.Sheet1
nebo pokud hází chybu (v některých případech)
ThisWorkbook.Sheets(Sheet1.Name)Příloha: 13077_kodovejmenolistu.jpg (37kB, staženo 25x)
citovat
AL(24.4.2013 10:26)#013080 eLCHa Ti dal odpoveď, ja len dodám, že z uvedeného dôvodu som v úvode kódu písal:
If Sh.CodeName = "Sheet1" And Target.Address = Range("B3").Addresscitovat
pepok4(24.4.2013 11:15)#013081 Vdaka za rady, ale nefunguje mi to. Zadal som to nasledovne podla toho co napisal eLCHa:
skusal som tieto varianty:
If Sh.CodeName = Sheets(Sheet1.Name) And Target.Address = Range("B3").Address Then
If Sh.CodeName = ThisWorkbook.Sheets(Sheet1.Name)
And Target.Address = Range("B3").Address Then
If Sh.CodeName = ThisWorkbook.Sheet1
And Target.Address = Range("B3").Address Thencitovat
AL(24.4.2013 13:38)#013083 Má to byť buď, ako som napísal ja, t.j.
If Sh.CodeName = "Sheet1" And Target.Address = Range("B3").Address
alebo modifikácia toho, čo píše eLCHa:
If Sh = Sheet1 And Target.Address = Range("B3").Address Thencitovat
pepok4(24.4.2013 13:54)#013084 @AL: dakujem!
Uz sa mi to podarilo nakombinovat tak, aby mi to fungovalo.
citovat
eLCHa(24.4.2013 14:18)#013085 @AL
jenom technická
If Sh = Sheet1 And Target.Address = Range("B3").Address Then
asi vyhodí chybu (nebo nebude pracovat správně), protože Sh i Sheet1 jsou objekty, takže buď
If Sh.Name = Sheet1.Name And Target.Address = Range("B3").Address Then
nebo (ale takhle to taky napracuje vždycky dobře, zatím nevím proč)
If Sh Is Sheet1 And Target.Address = Range("B3").Address Thencitovat
pepok4(24.4.2013 14:41)#013089 @eLCHa:
If Sh = Sheet1 And Target.Address = Range("B3").Address Then
Ano mas pravdu, tato ALova modifikacia nefungovala spravne a vyhadzovala chybu.
Funkcne riesenia su 2 zatial:
eLCHa:
If Sh.Name = Sheet1.Name And Target.Address = Range("B3").Address Then
AL:
If Sh.CodeName = "Sheet1" And Target.Address = Range("B3").Address Thencitovat