Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 0
  • 1

Dzień dobry.

Staram się utworzyć arkusz z rozwijaną listą wierszy.

Na rozwiniętej już liście ma pojawiać się przycisk. Na początku ma być wyszarzony i dopiero po zmianie wartości w jednej komórce (C14 w arkuszu Checklist) powinien się uaktywniać.

Tak, jak rozwijanie wierszy udało mi się osiągnąć, to już uaktywniania przycisku, niestety nie osiągnąłem pomimo prób. Jedna z nich wykomentowana w kodzie dla makra arkusza.

W załączniku przesyłam plik.

- Zawiera 2 arkusze: 'Checklist' - Tam, gdzie mają zachodzić powyższe zdarzenia. 'Dane' - Arkusz z wartościami i danymi do wyświetlania w komórkach oraz pomocniczymi do makra.

W razie potrzeby większej ilości szczegółów proszę o kontakt.

Pozdrawiam.
KR.

 

 

 

Załączniki

  • xlsm

    Tabela.xlsm ( 30K )
Krzysztof_Rutkowski_cack
  • Zapytał
  • @ Krzysztof_Rutkowski_cack | 01.03.2018
    • 0
    • 0
    • 0

Odpowiedzi (3)

  • 2

1) U mnie po "odkomentowaniu" warunku w zdarzeniu Worksheet_Change przycisk pokazuje się i ukrywa w zależności od zawartości komórki C14, nie bardzo rozumiem, w czym problem. Przy okazji ciekawostka przyrodnicza: można ten warunek zapisać tak (choć nie jest to wskazane ze względu na czytelność kodu. :))

CommandButton1.Enabled = [C14].Value <> ""

2) Jeśli wyłączasz odświeżanie/zdarzenia/przeliczanie arkusza itp. zawsze przywracaj stan pierwotny na końcu makra. Teoretycznie Excel sam powinien o to zadbać, ale w praktyce różnie bywa (daleko nie trzeba szukać, u mnie ekran "zawiesił się" przy grzebaniu w Twoim makrze).

3) Zapomnij o istnieniu metody Select. Zamiast wskazywać komórki, na których chcesz działać (bardzo spowalnia to działanie makr), odnoś się do nich np. przez Cells(x, y), przypisania do zmiennych (Set rng = Range("A1")), iteracje po zakresie (For Each rng in Range("A1:A10")) itp.

4) Zawsze dokładnie sprawdzaj warunki. :) W poniższym wierszu pętla ma działać, dopóki będziemy mieli w komórce zero lub jeden, po co więc dodatkowo sprawdzać, czy jest ona niepusta? Niby niespecjalnie to przeszkadza, ale komplikuje analizę kodu. :)

Do While ActiveCell.Value <> "" And (ActiveCell.Value = "0" Or ActiveCell.Value = "1")

5) Zerknij na poniższe rozwiązanie. Zamiast sprawdzać kolejne komórki w matrycy, przeniosłem potrzebną jej część do zmiennej tablicowej, dzięki czemu nie trzeba wielokrotnie odczytywać danych z arkusza, robimy to tylko raz. Tu oczywiście nie daje to zbytniej przewagi, bo komórek do sprawdzenia jest niewiele, ale przy dużych zakresach różnica potrafi być kolosalna. Ostatnio sprowadziłem w ten sposób wykonywanie makra operującego na kilkudziesięciu tysiącach wierszy z ponad minuty do mniej niż sekundy, jest o co walczyć. Na początku może być to trochę niejasne, ale warto pamiętać o takim podejściu. :)

Sub RozwijanieOdpowiedniejListy()
Dim szukaj As String, komorka As Range, arr As Variant, r As Long

'zapisujemy szukaną wartość do zmiennej
szukaj = Sheets("Checklist").Range("c3").Value

'jeżeli szukana wartość jest pusta, przerywamy makro
If szukaj = "" Then Exit Sub

'znajdujemy komórkę z szukaną wartością w matrycy
Set komorka = Sheets("Dane").Rows(2).Find(szukaj, LookIn:=xlValues, lookat:=xlWhole)

'przepisujemy wartości z matrycy do zmiennej tablicowej
arr = Application.Transpose(Range(komorka.Offset(1, 0), komorka.End(xlDown)))

'wyłączamy odświeżanie ekranu
Application.ScreenUpdating = False
'przechodzimy przez wszystkie elementy tablicy
For r = 1 To UBound(arr)
   'sprawdzamy, czy bieżąca wartość tablicy to jedynka
   'i odpowiednio ukrywamy/odkrywamy wiersz
   Sheets("Checklist").Rows(r + 5).Hidden = IIf(arr(r) = 1, False, True)
Next
'włączamy odświeżanie ekranu
Application.ScreenUpdating = True

End Sub

 

Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 01.03.2018
    • 1
    • 7
    • 1
  • 0

Dziękuję za szybką, wyczerpującą i przede wszystkim przydatną odpowiedź! :)

Co do punktu 1), to u mnie za każdym razem kiedy zmieniałem zwartość komórki C14 wyskakiwał:

'Compile error:

Argument not optional'

I już nie wiedziałem co z tym zrobić. Z resztą, po Twojej odpowiedzi spróbowałem jeszcze raz i było to samo.

Za to alternatywna linijka kodu zadziałała od razu bez problemu. Dzięki!

Co do reszty punktów, dzięki za przejście kodu. Mam nadzieję, że mi się uda wrzucić bardziej efektywne rozwiązania. :)

Jeszcze raz dzięki!

Pozdrawiam.
KR.

Krzysztof_Rutkowski_cack
  • Odpowiedział
  • @ Krzysztof_Rutkowski_cack | 02.03.2018
    • 0
    • 0
    • 0
  • 0

ad 1) Zwracam honor, chyba po odkomentowaniu odruchowo poprawiłem wiersz z warunkiem, bo faktycznie wyrzuca błąd, a to z tego powodu, że "arkuszowa" funkcja Text wymaga dwóch argumentów, a Ty podajesz jeden. W tym wypadku zupełnie nie ma jednak sensu tak kombinować, wystarczy proste:

If Range("C14") <> "" Then

 

Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 02.03.2018
    • 1
    • 7
    • 1