< návrat zpět

MS Excel


Téma: Private Sub Workbook_SheetChange rss

Zaslal/a 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: zip13045_example.zip (14kB, staženo 23x)
Zaslat odpověď >

icon #013062
avatar
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 Sub
V kóde som urobil iba minimálne úpravy, aby si videl, kde bol hlavný problémcitovat
#013066
avatar
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
#013076
avatar
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
icon #013077
eLCHa
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: jpg13077_kodovejmenolistu.jpg (37kB, staženo 25x)
13077_kodovejmenolistu.jpg
citovat
icon #013080
avatar
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
#013081
avatar
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 Then
citovat
icon #013083
avatar
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
#013084
avatar
@AL: dakujem!

Uz sa mi to podarilo nakombinovat tak, aby mi to fungovalo.citovat
icon #013085
eLCHa
@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
#013089
avatar
@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

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje