02. maj 2003 - 14:20Der er
48 kommentarer og 2 løsninger
Excel 97: Log-fil VBA
I en Excel bog har jeg brug for at logge 2 ting: 1) Tidspunkt når en bruger åbner filen 2) Hvor lang tid han/hun er på
Jeg skal såmænd bare bruge lidt kode til Workbook_Open til at samle et tidspunkt op.
I Workbook_BeforeClose skal der så hentes et nyt tidspunkt, hvorfra starttidspunktet så skal trækkes fra for at få beregnet hvor lang tid brugeren er på.
De 2 variable skal så sammenflettes og afleveres i én streng, adskilt med et enkelt mellemrum.
Håber ovenstående er forståeligt.
Resten af koden under Workbook_BeforeClose, som danner/opdaterer log-filen har jeg på plads.
Kan du ikke blot erklære en global variabel, og så lægge starttidspunktet ind i denne ved opstart. Da den er global, kan din beforeclose-procedure jo også læse hvad der står i den.
Tak for hjælpen. Det var den globale variabel jeg havde glemt.
Lige en lille ting: Der var en lille fejl i jkrons, så koden skal se sådan ud:
Public Start As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean) Slut = Time() Periode = Slut - Start msg = Start & " " & Periode End Sub
Private Sub Workbook_Open() Start = Time() End Sub
Imidlertid giver resultatet: 00:00:00 0,622858796296296 så det kunne se ud som om Start ikke virker rigtigt. Derudover mangler der også lige lidt formatering.
Ok. Det virker godt nok hos mig. Bortset fra formateringen. Jeg troede det var de to tidspunkter du ville have vist. Derfor havde jeg ikke trukket dem fra hinanden.
nn er et fra mine Access erfaringer, hvor mm er måned og nn minutter. Jeg kan dog godt se, at Excel faktisk godt kan skelne - hvilket jo egentligt er lidt underligt :-)
Jeg har lige testet, og nedenstående virker på mit "apparat". Som kontrol har jeg blot indlagt nogen msgbokse. Det ser ud til at virke efter hensigten.
Public Start As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Slut = Now() Periode = Slut - Start msg = Start & " " & Periode MsgBox (Format(Start, "dd-mm-yyyy hh:nn:ss") & " / " & Format(Periode, "hh:nn:ss"))
Trode måske Start var en "lukket" variabel, men det er heller ikke til tilfældet. Har prøvet at udskifte den med OpenTime.
I får lige hele koden:
Public OpenTime As Date
Private Sub Workbook_BeforeClose(Cancel As Boolean) ' Skriver log-data til en tekstfil. ' Nye logs bliver tilføjet i bundet af filen. ' Hvis filen ikke eksisterer vil den blive oprettet. Dim iFileNumber As Integer Dim msg As String Dim strFileName As String Dim OpenTime As Date Dim Slut As Date Dim Period As Date
iFileNumber = FreeFile Slut = Now() Periode = Slut - OpenTime msg = Format(OpenTime, "dd-mm-yyyy hh:mm:ss") & " " & Format(Periode, "hh:mm:ss") strFileName = "C:\test.log" Open strFileName For Append Shared As #iFileNumber Print #iFileNumber, msg Close #iFileNumber End Sub
Private Sub Workbook_Open() OpenTime = Now() End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) ' Skriver log-data til en tekstfil. ' Nye logs bliver tilføjet i bundet af filen. ' Hvis filen ikke eksisterer vil den blive oprettet. Dim iFileNumber As Integer Dim msg As String Dim strFileName As String Dim Slut As Date Dim Period As Date
iFileNumber = FreeFile Slut = Now() Periode = Slut - OpenTime msg = Format(OpenTime, "dd-mm-yyyy hh:mm:ss") & " " & Format(Periode, "hh:mm:ss") strFileName = "C:\test.log" Open strFileName For Append Shared As #iFileNumber Print #iFileNumber, msg Close #iFileNumber End Sub
Private Sub Workbook_Open() OpenTime = Now() End Sub
Fsv angår brugernavn har Dev Ashis denne kode på sin Access hjemmeside. Den virker også glimrende i Excel.
' This code was originally written by Dev Ashish. ' It is not to be altered or distributed, ' except as part of an application. ' You are free to use it in any application, ' provided the copyright notice is left unchanged. ' ' Code Courtesy of ' Dev Ashish ' 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
Har også selv denne liggende: Det er nok nogenlunde samme kode, som den du viser.
Public Declare Function GetUserName Lib "advapi32.dll" _ Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
'####################################################### '### '### Indtast funktionen =ReturnUserName() i en celle '### '####################################################### Function ReturnUserName() As String ' returns the NT Domain User Name
Dim rString As String * 255, sLen As Long, tString As String
tString = ""
On Error Resume Next sLen = GetUserName(rString, 255) sLen = InStr(1, rString, Chr(0))
If sLen > 0 Then tString = Left(rString, sLen - 1) Else: tString = rString End If
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.