Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 4
  • 197

Witam.

Potrzebuję uruchamiać makro (ukrywanie/odkrywanie wierszy w arkuszu) podczas zmiany wartości określonej komórki. Chciałbym aby makro o nazwie "ukryj" uruchamiało się zawsze, kiedy np. w komórce A1 wartość będzie wynosić "1". Wartość komórki zmienia się w zależności jaki projekt wybiorę w moim arkuszu. Makra już mam i działają poprawnie, ale za pomocą przycisków, a ja chciałbym abym nie musiał tego robić manualnie, tylko z automatu po zawartości komórki 1/0.

Próbowałem coś takiego ale coś jest nie tak:

Private Sub Worksheet_Calculate()
 Sprawdz = Range("A1").Value
 Select Case Sprawdz
 Case 1
 Call Ukryj 'makro ukryj
 Case 0
 Call Odkryj 'makro odkryj
 End Select
End Sub

 

Stanisław
  • Zapytał
  • @ Stanisław | 21.02.2017
    • 2
    • 1
    • 4

Odpowiedzi (2)

  • 4

Witam.

Należy umieścić to w innej procedurze:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" And Target.Value = 1 Then
    
        MsgBox "Uruchom makro"
    
    End If
End Sub

Pozdrawiam.

pawel_niemyt
  • Odpowiedział
  • @ pawel_niemyt | 21.02.2017
Komentarze
Zmodyfikowałem ten kod i działa jak wpiszę w komórkę A1 "1" lub "0". Ukrywanie/odkrywanie wierszy działa, ale co zrobić aby to zadziałało gdy wartość komórki A1 zmieni się za pomocą formuły? Np. w A1 będzie formuła "=D2". Wartość A1 będzie się zmieniać w wyniku różnych formuł, więc nie mogę tego wpisywać z ręki. Makro nie odpala jeśli wartość A1 zmienia się za pomocą formuły. Jest możliwość takiego uruchamiania?

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And Target.Value = "1" Then

MsgBox "Zostaną ukryte wiersze 3-10"
'ukrywanie
Sheets("Arkusz1").Select
Rows("3:10").Select
Selection.EntireRow.Hidden = True

Else

If Target.Address = "$A$1" And Target.Value = 0 Then

MsgBox "Zostaną odkryte wiersze"
'odkrywanie
Sheets("Arkusz1").Select
Rows("4:11").Select
Selection.EntireRow.Hidden = False

End If
End If
End Sub
Skomentował : @ Stanisław ,27.02.2017
  • 2
  • 1
  • 4
  • 0

Zastosowałem Worksheet_Calculate() i działa z wyróżnianiem wiersza, ale nie mogę użyć w arkuszu formuły PRZESUNIĘCIE, ponieważ następuje zapętlenie i zamknięcie Excela po błędzie.

Jak w takim przypadku mogę użyć/zastąpić formułę PRZESUNIĘCIE?. Potrzebuję jej do wyświetlenia zawartości aktualnie wybranej (tej którą w danym momencie kliknę) komórki?

W załączniku ten pliczek z wyłączoną formułą PRZESUNIĘCIE.

Załączniki

  • xlsm

    ukryjWierszePrzesuniecie.xlsm ( 20K )
Stanisław
  • Odpowiedział
  • @ Stanisław | 24.03.2017
    • 2
    • 1
    • 4
Komentarze
Pomoże tu zmienna globalna, która przyjmie wartość PRAWDA w momencie wejścia w "klikalny" obszar D15:E18 i będzie warunkiem odpalenia Case'ów przy obliczaniu arkusza (tam trzeba ją od razu przestawić na FAŁSZ). Przy okazji mała propozycja scalenia makr do chowania i odkrywania wierszy :)

Public zmiana As Boolean

Private Sub Worksheet_Calculate()

If zmiana Then
zmiana = False
sprawdz = Range("A1").Value

If sprawdz = 0 Or sprawdz = 1 Then Call pokaz_ukryj(sprawdz)
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("D15:E18")) Is Nothing Then
ActiveWorkbook.Names("AktywnyWiersz").RefersTo = "=" & ActiveCell.Row
wier = ActiveCell.Row

zmiana = True
Range("g1").Value = wier
End If

End Sub

Sub pokaz_ukryj(opcja)

Sheets("Arkusz2").Rows("3:10").EntireRow.Hidden = opcja

End Sub
Skomentował : @ Mirosław_Janiak ,08.04.2017
  • 1
  • 7
  • 1
Witam i dziękuję za pomoc.
Zastosowałem Pana porady ale działa mi teraz jedno albo drugie (ukryj/odkryj) w zależności co wstawię po Call. Jak to zmodyfikować aby działało ukrywanie, kiedy w komórce A1 = 0, a odkrywanie kiedy A1=1? Oczywiście zmiany komórki A1 będę dokonywał klikaniem w pole D15:E18.


Public zmiana As Boolean

Private Sub Worksheet_Calculate()

If zmiana Then
zmiana = False
sprawdz = Range("A1").Value

If sprawdz = 0 Or sprawdz = 1 Then Call odkryj
End If

End Sub



'START: WYRÓŻNIANIE WIERSZA + WYŚWIETLANIE NUMERU AKTYWNEGO WIERSZA

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("D15:E18")) Is Nothing Then
ActiveWorkbook.Names("AktywnyWiersz").RefersTo = "=" & ActiveCell.Row
wier = ActiveCell.Row

zmiana = True
Range("g1").Value = wier
End If

End Sub
Skomentował : @ Stanisław ,10.04.2017
  • 2
  • 1
  • 4
Proponuję bez "panowania", jeśli mógłbym :) Prawdopodobnie pominąłeś funkcję "pokaz_ukryj(opcja)" z mojej poprzedniej odpowiedzi - skopiuj pełny kod (od "Public zmiana" do ostatniego "End Sub" nad podpisem) i zastąp nim cały swój w Arkusz2, wszystko powinno działać, wliczając w to funkcję w E14. Jeśli jednak chcesz zostać przy swoich funkcjach "ukryj" i "odkryj", musisz zastąpić wiersz "If sprawdz = 0 Or sprawdz = 1 Then Call pokaz_ukryj(sprawdz)" (przy okazji: "End If" w kolejnym wierszu jest zbędny, przeoczyłem) np. czymś takim:

Select Case sprawdz
Case 0:
Call odkryj
Case 1:
Call ukryj
End Select
Skomentował : @ Mirosław_Janiak ,11.04.2017
  • 1
  • 7
  • 1
Dziękuję Mirek :-) Faktycznie nie zrozumiałem tej części "If sprawdz = 0 Or sprawdz = 1 Then Call pokaz_ukryj(sprawdz)" i modyfikowałem "pokaz_ukryj(sprawdz)" i dlatego nie działało. Teraz działa! Jestem początkujący w VBA, a potrzebuję ukrywać/odkrywać wiele zakresów w różnych arkuszach (ukrywanie/odkrywanie w zależności od wartości w różnych komórkach), więc poczekam z moimi modyfikacjami do momentu aż się przeszkolę w waszej firmie 25.04.2017 we Wrocławiu. Dziękuję i pozdrawiam.
Skomentował : @ Stanisław ,12.04.2017
  • 2
  • 1
  • 4
Witam. Potrzebuję pomocy w rozszerzeniu powyższej procedury o ukrywanie/pokazywanie dodatkowo dla innego zakresu zależnego od zmiany wartości w innej komórce. Czyli tak jak jest teraz + ukrywanie/pokazywanie wierszy po zmianie wartości w komórce.
Czy nie będzie się to "gryzło" z wyróżnianiem wiersza? W komórkach w których mają być śledzone zmiany mogą występować różne wartości niezależnie (w A1 może być 0, a w np. A2 1.
Np.:
A1 = 0 to ukryj zakres; Rows("3:10") (=1 pokaż)
A2 = 1 to pokaż zakres; Rows("20:30") (= 0 ukryj)
Skomentował : @ Stanisław ,08.05.2017
  • 2
  • 1
  • 4