Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel VBA widoczność arkuszy dla określonych użytkowników

ayreq 23 Paź 2013 11:28 3537 10
  • #1 23 Paź 2013 11:28
    ayreq
    Poziom 6  

    Cześć,

    Chcę stworzyć procedurę, która ukrywałaby odpowiednie arkusze w zależności od nazwy użytkownika. Napisałem taki kod:

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Option Explicit

    Private Sub przyblokuj()
    Dim arkusz As Worksheet
    For Each arkusz In ThisWorkbook.Sheets
    If arkusz.Name <> "" And Application.UserName = "azun" _
    Then Sheets(arkusz).Visible = True _
    Else Sheets(arkusz).Visible = xlSheetVeryHidden
    Next
    End Sub
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Niestety nie działa - type mismatch.
    Czy składnia Sheets(arkusz) jest poprawna?
    Chciałbym, żeby makro działało po uruchomieniu arkusza, tzn. żeby nie było wywoływane żadnym przyciskiem, tylko żeby działało w tle. Czy konstrukcja Private Sub jest do tego odpowiednia? Kodu nie umieściłem w module, tylko w oknie kodu arkusza - też nie wiem, czy dobrze zrobiłem.
    Wiem, że oprócz nazwy użytkownika Excela (Application.UserName) można wywołać też nazwę użytkownika przy logowaniu do Windowsa. Jakim poleceniem mogę to zrobić?

    0 10
  • #2 23 Paź 2013 13:44
    Maciej Gonet
    Poziom 31  

    Dzień dobry,
    Składnia Sheets(arkusz) byłaby poprawna gdyby arkusz był tekstem oznaczającym nazwę arkusza lub liczbą, będącą jego numerem kolejnym.
    W tym przypadku wydaje mi się, że powinno być:
    arkusz.Visible
    Poza tym to powinno być w obsłudze zdarzenia Workbook_Open

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Pozdrowienia

    0
  • #3 23 Paź 2013 15:24
    ayreq
    Poziom 6  

    @Maciej Gonet, dziękuję za wskazówki. Trochę zmodyfikowałem ten kod i wygląda w tej chwili następująco:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    W sytuacji, gdy nazwa użytkownika="azun", kod działa bez zarzutu. Jednak przy innej nazwie pojawia się błąd - w końcu nie mogę (poprawcie mnie, jeśli się mylę) ukryć wszystkich arkuszy naraz, dlatego procedura zostawia arkusz3 i przedstawia błąd.
    Co chciałbym osiągnąć, to tak zmodyfikować kod, że gdy nazwa użytkownika będzie inna niż azun, ukryte zostały wszystkie arkusze z wyjątkiem arkusza 1, a także uniknąć pojawienia się komunikatu z błędem.

    0
  • #4 23 Paź 2013 23:01
    cbrman
    Poziom 27  

    ayreq napisał:
    można wywołać też nazwę użytkownika przy logowaniu do Windowsa. Jakim poleceniem mogę to zrobić?


    Użyj
    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Co do reszty problemu to przetestuj następujący kod (zakładam, że w skoroszycie istnieje arkusz o nazwie "Arkusz1")
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #5 24 Paź 2013 08:35
    ayreq
    Poziom 6  

    cbrman, Twój kod chyba (bo nie do końca jednak rozumiem co się dzieje w tym kodzie - o tym za chwilę) ukrywa wszystkie arkusze oprócz Arkusza1 niezależnie od nazwy użytkownika, ja z kolei chciałbym zdefiniować dla których użytkowników które arkusze będą widoczne.
    Chciałbym jeszcze w pełni zrozumieć Twój kod:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Tutaj ustawiasz na sztywno odwołanie do arkusza o nazwie takiej, jak nazwa użytkownika?
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    W tej części kod sprawdza, czy nazwy kolejnych arkuszy są takie same jak arkusz o nazwie takiej samej jak nazwa użytkownika? Wygląda to dla mnie, jakby się nie trzymało kupy, ale najpewniej nie zrozumiałem którejś instrukcji :)

    0
  • #6 24 Paź 2013 18:58
    cbrman
    Poziom 27  

    Mój kod sprawdza czy w skoroszycie istnieje arkusz o nazwie takiej jak nazwa użytkownika i jeśli ten warunek jest spełniony to zostaje odkryty taki arkusz a wszystkie pozostałe są ukrywane.
    Jeśli w skoroszycie nie ma arkusza o nazwie takiej jak nazwa użytkownika to zostaje odkryty jedynie arkusz o nazwie "Arkusz1".
    Innych warunków nie przedstawiłeś.

    0
  • #7 24 Paź 2013 21:00
    ayreq
    Poziom 6  

    No to chyba mnie nie zrozumiałeś. Napiszę inaczej: potrzebuję takiego makra, że gdy skoroszyt otworzy np. użytkownik Józek, to będzie widział tylko Arkusz1, to samo będzie, gdy skoroszyt otworzy Stefania. Z kolei użytkownik azun ma większe uprawnienia i po otwarciu tego samego skoroszytu widzi wszystkie arkusze.

    0
  • #8 24 Paź 2013 22:59
    cbrman
    Poziom 27  

    Przetestuj:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #9 24 Paź 2013 23:34
    marcinj12
    Poziom 40  

    Pomijając (bez)sens takiego "zabezpieczenia" pliku, najpewniej chodzi Ci o coś takiego (kod do umieszczenia w ThisWorkbook):

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #10 25 Paź 2013 10:20
    23844
    Użytkownik usunął konto  
  • #11 25 Paź 2013 11:02
    marcinj12
    Poziom 40  

    e-mega napisał:
    marcinj12 napisał:

    Kod Visual Basic - [rozwiń]
    Application.Quit

    Tak nie piszemy! Wystarczy otworzyć jeszcze jeden plik i dokonać w nim zmian. Po otrzymaniu komunikatu czy zapisać i kliknięciu anuluj nic nie zostanie zamknięte. Prędzej tak:

    Kod Visual Basic - [rozwiń]
    ThisWorkbook.Close
    Rzeczywiście, ThisWorkbook.Close będzie lepsze - rzadko zamykam plik makrem i wyleciało mi to z głowy, kod poprawiłem.

    0