logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

VBA ukrywanie arkuszy kodem (standardowe 'ukryj' nie pozwala drukować)

psgraf 24 Paź 2022 14:39 681 17
REKLAMA
  • #1 20250841
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    Mam skoroszyt z kilkoma arkuszami.
    Arkusz 'Dane' służy do wprowadzania danych, pozostałe są drukowane przyciskiem z poziomu arkusza 'Dane'. Nie ma potrzeby by użytkownik tam zaglądał. Do tej pory chroniłem je hasłem. Teraz po modyfikacjach całego arkusza, zdarza się, że na tych pozostałych pojawiają się dodatkowe wiersze (w zależności od tego, co jest wprowadzane w arkuszu 'Dane'). W momencie, w którym chronię pozostałe arkusze hasłem i gdy mają się tam pojawić te dodatkowe wiersze wyrzuca mi błąd (Run-time error '1004': Ustawienie właściwości Hidden klasy Range nie jest możliwe).
    Rozumiem, że ta ochrona blokuje możliwość dodawania wierszy.
    Nie mogę tego tak zostawić, żeby nikt tam nic nie grzebał... więc jeśli nie ochrona, to może ukrycie ich?

    Może jakiś kod na ukrycie tych arkuszy, żeby ich po prostu nie było widać, a żeby się drukowały? (jak daję standardowe "ukryj", to nie działają wydruki - tak, jakby nie było tych arkuszy).
  • REKLAMA
  • #2 20250879
    michaelxxxl
    Poziom 15  
    Posty: 63
    Pomógł: 19
    Ocena: 56
    Proponuje zablokować arkusz i na czas wykonywania makra zdejmować blokadę.
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 20251026
    OJM
    Poziom 17  
    Posty: 133
    Pomógł: 29
    Ocena: 38
    A nie możesz na czas drukowania odkrywać, a później ukrywać arkusz.

    Worksheets("Arkusz1").Visible = xlSheetVisible

    i

    Worksheets("Arkusz1").Visible = xlSheetHidden
    lub
    Worksheets("Arkusz1").Visible = xlSheetVeryHidden


    przed drukowaniem dodać
    Application.ScreenUpdating = False

    po drukowaniu
    Application.ScreenUpdating = True
  • #4 20252056
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    Użyłem czegoś podobnego, jak powyżej. Choć przyznaję, że już mam tam mocno nagmatwane chyba. :-(
    Niemniej działa. Dziękuję.

    Dodano po 2 [minuty]:

    A jeszcze nieco z innej beczki. Ponieważ arkusz mi się rozrósł i doszło wiele wierszy, które też czasem się ukrywają - mam buttona do czyszczenia komórek. Wcześniej bez zarzutu działał. Teraz, przy dużej ilości wyskakuje błąd "Run-time error '1004'': Method 'Range' of object'_Worksheet' failed

    Mój kod to:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Czy istnieje jakieś ograniczenie co do ilości komórek?
  • REKLAMA
  • #5 20252119
    OJM
    Poziom 17  
    Posty: 133
    Pomógł: 29
    Ocena: 38
    Jeżeli to arkusz ukryty, to daj tym komórkom jakiś kolor wypełnienia, a później czyść wszystkie, które mają taki kolor.
    Jak w arkuszu widocznym to daj tło np: .Color = 16711422, myślę, że nie odróżnisz od białego ;)
  • REKLAMA
  • #6 20252127
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    OJM napisał:
    Jeżeli to arkusz ukryty, to daj tym komórkom jakiś kolor wypełnienia, a później czyść wszystkie, które mają taki kolor.
    Jak w arkuszu widocznym to daj tło np: .Color = 16711422, myślę, że nie odróżnisz od białego ;)


    To arkusz roboczy, aktywny, który częściowo ma ukryte wiersze, które też powinny się czyścić. Ale tak, ma czyścić pola, które może wypełnić użytkownik i one są żółte.
    A jakiś kod na to? :-(
  • #7 20252155
    OJM
    Poziom 17  
    Posty: 133
    Pomógł: 29
    Ocena: 38
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod

    zmień zakres na taki jaki jest Ci potrzebny, ja wstawiłem A1:Z300, kolor wypełnienia to najnormalniejszy żółty.
  • #8 20252167
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    "Nie można tego zrobić dla scalonej komórki"
    Taki błąd się pojawia. Odnosi się to do c.ClearContents
    Gdy Range oznaczę, jako niescaloną jakąś komórką to działa... ale niestety ja mam tam bardzo dużo komórek, w które wprowadzam dane, a które wcześniej zostały scalone. Tego już nie poprawię, bo to zdecydowanie za dużo pracy. :-(
  • #9 20252214
    OJM
    Poziom 17  
    Posty: 133
    Pomógł: 29
    Ocena: 38
    Nie znam sposobu na scalone komórki.
    Można rozłączyć te komórki, a później ponownie scalić, ale to może spowodować dziwne rzeczy, generalnie jest możliwe.
  • #10 20252218
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    A pomijając kolor... ten kod czemu może nie działać? Działa, jak wybiorę ok 1/3 liczby komórek. Więcej zaczyna się wysypywać. :-(
  • #11 20252289
    OJM
    Poziom 17  
    Posty: 133
    Pomógł: 29
    Ocena: 38
    To podziel na trzy 😀
  • #12 20252295
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    Dzieliłem wcześniej, ale tak jakby raz działało, a raz nie. Dziwnie to brzmi, ale jakieś to problemowe było.
    Ostatecznie zrobiłem to teraz tak, że zrobiłem większy zakres od:do. Niestety w tym zakresie też znajdują się zablokowane komórki, więc dodałem opcję ich automatycznego odblokowywania przed czyszczeniem i blokowania po wyczyszczeniu.
    Kurcze, działa. Tfu, tfu.
    Zobaczę jak to będzie funkcjonowało po udostępnieniu sieciowym (zwłaszcza sub z hasłem).
  • Pomocny post
    #13 20252596
    Maciej Gonet
    Specjalista - VBA, Excel
    Posty: 2207
    Pomógł: 824
    Ocena: 481
    Długość tekstu argumentu Range jest ograniczona, chyba do 255 znaków.
    Możesz jeszcze spróbować utworzyć unię zakresów. Jest to też na ogół zakres złożony z tym, że jeśli są komórki przylegające, to one są łączone w obszary np. B30:B35.
    Jeśli są komórki scalone, to unia to uwzględnia.
    Przeanalizuj sobie przykład i kody z załącznika i wykorzystaj.
    Załączniki:
    • Unia.xls (32 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #15 20254299
    michaelxxxl
    Poziom 15  
    Posty: 63
    Pomógł: 19
    Ocena: 56
    Proponuję prostą pętle:
    Kod: VBScript
    Zaloguj się, aby zobaczyć kod
  • #16 20266049
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    A co z tymi scalonymi komórkami? One blokują pewne operacje na danych. Należy usunąć scalenie, żeby to wykonać. Ale, ale: co one robią wogóle w obszarze danych? Pewnie mają poprawiać prezentację? To podstawowy błąd w przypadku prostych aplikacji w VBA, ale nie tylko, niestety. Dane powinny być łatwe do przetwarzania (np bez scalonych komórek, bez udziwnień i ozdobników). Od prostoty projektu naprawdę dużo zależy, a że dane będą mało czytelne dla człowieka to się nie martwimy. Dla człowieka jest wersja specjalna "ludzka" z bajerami, kolorami, itp. :)
  • #17 20267066
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Do autora:
    Proszę nie cytować całego wątku w każdym poście (zbędne usunąłem). Nie ma w tym sensu i powoduje problemy z formatowaniem strony.

    Dziękuję
  • #18 20267090
    psgraf
    Poziom 7  
    Posty: 34
    Ocena: 1
    kinggustav napisał:
    A co z tymi scalonymi komórkami?


    Taaaaak. Nie inaczej, miały poprawić to wizualnie. Jak wspominałem, zaczynając tworzyć plik nigdy nie przypuszczałem, że tak się rozrośnie. W trakcie stwierdziłem, że trudno, nie zacznę od nowa, bo zrobił się zbyt skomplikowany. ;-)
    Ale pomyślę na przyszłość o tym i już zupełnie inaczej do tematu podejdę.

Podsumowanie tematu

✨ Użytkownik poszukuje sposobu na ukrycie arkuszy w skoroszycie Excel, aby nie były widoczne dla użytkowników, ale jednocześnie mogły być drukowane. Standardowe ukrywanie arkuszy nie działa, ponieważ uniemożliwia drukowanie. Proponowane rozwiązania obejmują tymczasowe odkrywanie arkuszy przed drukowaniem oraz użycie kodu VBA do ukrywania arkuszy. Użytkownik napotkał również problemy z błędami związanymi z zakresami komórek, w tym z błędem "Run-time error '1004'" przy próbie czyszczenia komórek, które są scalone. Wskazówki dotyczące unikania scalonych komórek oraz podziału zakresów na mniejsze części zostały zaproponowane jako rozwiązania problemów z wydajnością i błędami.
REKLAMA