07. oktober 2003 - 19:03Der er
15 kommentarer og 1 løsning
Registrerings log i Excel
Problemstilling: Er det muligt at lave en log fil til et Excel ark således at man kan følge med i hvem der har været inde i et bestemt regneark og hvornår. Loggen skal genereres automatisk. Det skal fungerer i en koncern hvor alle brugere er kendt ved login.
Hvis det er muligt kan man da programmerer Excel arket således at man ikke kan komme ud af arket uden at opdaterer/udfylde bestemte felter i arket.
Denne kode skriver bruger navn og tidspunkt for åbning ned i en logfil. Denne skal nok ligge på serveren,på et share, som alle har adgang til og skriverettigheder til.
Private Sub Workbook_Open() Bruger = Environ("username") Open "c:\log.txt" For Append As #1 Write #1, bruger; Now() Close #1 End Sub
Hej jkrons jeg har problemer med at få din løsning til at virke, kan du eventuelt give et lille hint om hvad der går galt. Jeg har lavet en fil som hedder log.txt vha. notepad men brugernavnet bliver kun overført som "" men resten af de data jeg ønsker bliver overført.
Private Sub Workbook_Open() Dim wshNetwork Set wshNetwork = CreateObject("WScript.Network") Bruger = = wshNetwork.UserName Open "c:\log.txt" For Append As #1 Write #1, bruger; Now() Close #1 End Sub
uden at skulle blande mig ret meget :-) Kabbak's version tager brugernavnet til netværkslogin, hvor jkrons tager excels brugernavn. excels brugernavn findes i "Funktioner-Indstillinger-Standard(generel)-Brugernavn Hos os står der desværre tit firmanavn eller det er bare blank og så kan det desværre ikke bruges.
bak-> Nwej det er selvfølgelig nødvendigt, at man har et userid specificeret.
Men Environ("username") burde virke. Lige bortset fra, at jeg ikke kan hukse hvilken versinm der kom med i. Før den blev introduceret, brugte jeg denne funktion til at henter brugernavnet, og den virker stadig, men er noget mere besværlig :-)
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Function fOSUserName() As String ' Returns the network login name Dim lngLen As Long, lngX As Long Dim strUserName As String strUserName = String$(254, 0) lngLen = 255 lngX = apiGetUserName(strUserName, lngLen) If (lngX > 0) Then fOSUserName = Left$(strUserName, lngLen - 1) Else fOSUserName = vbNullString End If End Function
Hej Så er jeg tilbage. Der er ikke fordi jeg ikke vil svare men er afhængig af om det kan godkendes. Det virker fint som jeg ønsker det lige nu. Er ved at undersøge om vi skal have mulighed for at checke på hvem det er som kommer ind i arket for så at kunne logge i en bestemt logfil for den enkelte bruger samt hvilken fil han besøgte. Sagt med andre ord, skal det være muligt hvis jeg kommer ind i en fil at logge informationerne i min egen logfil med username, dato, tid, samt hvilken fil jeg besøgte. Dette skal gælde for alle brugere. Hvis jeg besøger en anden fil skal disse informationer logges i den samme logfil. således kan jeg ved audit se en komplet log over en bestemt person i et kvalitetssystem.
Sidstnævnte er er ikke noget problem. Så skal koden bare lægges i alle de pågældende ark. For at give hver bruger sin egen log-fil, kan du ændre koden som følger. Jeg har taget udgangspunkt i kabbak's, da din version tilsyneladende ikke genkender Environ() funktionen:
Private Sub Workbook_Open() Dim wshNetwork Dim Bruger As String Dim Filnavn As String
Set wshNetwork = CreateObject("WScript.Network") Bruger = wshNetwork.UserName Filnavn = "c:\" & Bruger & ".txt" Open Filnavn For Append As #1 Write #1, Bruger; Now() Close #1 Set wshNetwork = Nothing End Sub
Sorry, det var den forkerte version, her er den rigtige - der også skriver navnet på den åbnede fil ned i loggen.
Private Sub Workbook_Open() Dim wshNetwork Dim Bruger As String Dim Filnavn As String Dim Brugtnavn As String
Brugtnavn = ActiveWorkbook.FullName
Set wshNetwork = CreateObject("WScript.Network") Bruger = wshNetwork.UserName Filnavn = "c:\" & Bruger & ".txt" Open Filnavn For Append As #1 Write #1, Bruger; Brugtnavn; Now(); Close #1 Set wshNetwork = Nothing End Sub
Og så glemte jeg helt dit sidste spørgsmål i det første indlæg.
Du kan godt styre, at en fil ikke kan lukkes, før bestemte felter er ændret/udfyldt.
I eksemplet testes på, om indholdet af A1 har ændrer sig mellem åbning og lukning, hvis ikke anulleres lukningen, og der vises en meddelelsesboks.
Det kræver at du definerer en Private Variabel (i mit tilfælde CellAd), som kan rumme celleindholdet. Den skla erklæres i den generelle sektion. I WorkBook_Open tildeler du den så en værdi, der svarer til indholdet af den celle, der skal testet på. Jeg har erklæret den som Variant, da jeg jo ikke kendet indholdet af den celle, du vil teste på, men du bør selv erklære den med en relevant datatype.
I Workbook_BeforeClose, tester du så, om den pågældende celle stadig har samme værdi, som variablen. Hvis det er tilfældet, annulleres luukningen og der vises en meddelelsesboks.
Hvis der er flere celler, du vil teste på, skal du erklære ebn variabel til hver af dem, tildele alle variabler en værdi i WorkBook_Open, og teste på den alle i Workbook_BeforeClose.
Denm samlede kode for log, og ændringskontrol ser så sådan ud. Den første erklæring står i den generelle sektion.
Private CellAd As Variant
Private Sub Workbook_BeforeClose(Cancel As Boolean) If CellAd = Range("a1").Value Then MsgBox "Du har ikke opdateret værdien i celle A1" & vbCrLf & _ "og kan derfor ikke lukke", _ vbOKOnly + vbExclamation, "Opdateringsfejl"
Cancel = True End If End Sub
Private Sub Workbook_Open() Dim wshNetwork Dim Bruger As String Dim Filnavn As String Dim Brugtnavn As String
CellAd = Range("a1").Value
Brugtnavn = ActiveWorkbook.FullName
Set wshNetwork = CreateObject("WScript.Network") Bruger = wshNetwork.UserName Filnavn = "c:\" & Bruger & ".txt" Open Filnavn For Append As #1 Write #1, Bruger; Brugtnavn; Now(); Close #1 Set wshNetwork = Nothing End Sub
Min fejl. I Mine sidste forsalg har jeg fået et semikolon for meget med i Write sætningen. Den skal hedde:
Write #1, Bruger; Brugtnavn; Now()
ikke
Write #1, Bruger; Brugtnavn; Now();
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.