Kategorie szkoleń | Egzaminy | Kontakt
  • 4
  • 1
  • 3.3K

Witam.

Chciałbym stworzyć arkusz kalkulacyjny (musi to być Excel), który będzie odnotowywał kto dodał, zmodyfikował lub usunął dane z mojego arkusza. Chciałbym, aby powyższe dane (login w domenie, a w przypadku braku domeny nazwa użytkownika lokalnego) były odnotowywane w oddzielnym arkuszu.

Czy mogliby Państwo mi pomóc i podpowiedzieć jaki kod w VBA uzyska te dane?

Pozdrawiam. 

Paweł_Ziemiecki
  • Zapytał
  • @ Paweł_Ziemiecki | 26.05.2014
    • 4
    • 0
    • 0

Odpowiedzi (4)

  • 4

Najlepiej skorzystać ze zmiennych środowiskowych, do których dostęp mamy poprzez funkcję Environ. Tak więc:

Environ("UserDomain") - domena (jeśli istnieje) sprzed Windows 2000

Environ("UserDNSDomain") - domena AD

Environ("Username") - nazwa użytkownika (domenowego lub lokalnego)

Można utworzyć funkcję:

Function Uzytkownik() as String

   Uzytkownik = IIf(Environ("UserDNSDomain")="","",Environ("UserDNSDomain") & "\") & Environ("Username")

End Function

 

  • Odpowiedział
  • @ | 26.05.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Szybka i celna odpowiedź
Skomentował : @ TRENER ALTKOM AKADEMII ,26.05.2014
  • 0

Bardzo dziękuję za odpowiedź!

Paweł_Ziemiecki
  • Odpowiedział
  • @ Paweł_Ziemiecki | 27.05.2014
    • 4
    • 0
    • 0
  • 0

Chciałem odkopać temat.

Czy istnieje możliwość (wzorując się na powyższym), żeby wyciągnąć dane osoby, która włącza dany arkusz? Taka jakby historia logowania.

Łukasz_Franczak
  • Odpowiedział
  • @ Łukasz_Franczak | 10.09.2015
    • 2
    • 0
    • 4
  • 0

To zależy od środowiska, w którym wykorzystywany jest dany arkusz. Proszę pamiętać, że przed przystąpieniem do pracy należy określić założenia (m.in. do czego arkusz będzie wykorzystywany, przez kogo i w jakim miejscu bądź sieci).

Przyjęcie założenia, że arkusz jest wykorzystywany w sieci wewnętrznej firmy, gdzie wszystkie komputery są w domenie (system operacyjny Windows), a dostęp do sieci możliwy jest tylko i wyłącznie po zalogowaniu się do stacji roboczej, daje nam ciekawe możliwości (ja przyjąłem jeszcze, że loginy w firmie to imie_nazwisko). Arkusz Excel umieszczany na dysku sieciowym i jest on otwierany przez pracowników ze swoich stacji roboczych.

W tym wypadku zastosowanie kodu:

Private Sub Workbook_Open()
     MsgBox "Witaj " & Environ("Username") & "!" _
           & vbNewLine & vbNewLine & "tekst powiadomienia" _
           & vbNewLine & vbNewLine & "Miłego dnia!"
End Sub

Umożliwia personalne powitania każdego użytkownika. Zmienną Environ("Username") oczywiście można wykorzystać również do tworzenia logów. Proponuję utworzyć ukryty arkusz, do którego przy każdym uruchomieniu skoroszytu będzie dodawany następny wiersz, który będzie zawierał dokładną datę i czas oraz login użytkownika.

Minusy:

- Należy pamiętać, że w jednej chwili arkusz może być otwarty przez jedną osobę (oczywiście z uprawnieniami do zapisu). Co oznacza, że jeśli zależy nam na odłożeniu w logach informacji, kto korzystał z arkusza (tzn nawet jeśli go otworzył), to nie mamy takiej możliwości. Druga osoba, która otworzy plik w tym samym czasie, nie odłoży się w logach (to nie MS Access).

- Kolejna sprawa to, że aby kod zadziałał, należy na komputerach dodać go do zaufanych plików w MS Excel, inaczej będzie on blokowany przez bezpieczeństwo makr (nie polecam ustawiania tej opcji na minimum).

Podpowiedź:

Możemy zastosować taką funkcję, która w zmiennej Użytkownik będzie przechowywała login osoby.

Function Uzytkownik() As String
   Uzytkownik = IIf(Environ("UserDomain") = "", "", Environ("UserDomain") & "\") & Environ("Username")
End Function

Następnie wystarczy przy jakimś działaniu wywołać tą funkcję (np po naciśnięciu jakiegoś przycisku) i wstawić informacje ze zmiennej w odpowiednią komórkę w arkuszu z logami.

Aby sprawdzić, który wiersz jest wolny proponuję użyć:

wolny = .Range("A1").CurrentRegion.Rows.Count + 1

I wstawić wartość w kolejny wolny wiersz i np w czwartą kolumnę:

Cells(wolny, 4) = Uzytkownik()

Powodzenia.

 

Paweł_Ziemiecki
  • Odpowiedział
  • @ Paweł_Ziemiecki | 14.09.2015
    • 4
    • 0
    • 0