Avatar billede janvogt Praktikant
02. maj 2003 - 14:20 Der 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.
Avatar billede jkrons Professor
02. maj 2003 - 14:27 #1
Smid dette ind i workbook'en

Public a As Date

Private Sub Workbook_BeforeClose(Cancel As Boolean)
b = Time()
c = a & " " & b
End Sub

Private Sub Workbook_Open()
a = Time()
End Sub
Avatar billede sjap Praktikant
02. maj 2003 - 14:27 #2
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.
Avatar billede sjap Praktikant
02. maj 2003 - 14:29 #3
jkrons
Det klarede du kun lidt hurtigere end jeg :-)  (men meget mere elegant)
Avatar billede janvogt Praktikant
02. maj 2003 - 14:57 #4
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.
Avatar billede jkrons Professor
02. maj 2003 - 14:59 #5
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.
Avatar billede janvogt Praktikant
02. maj 2003 - 15:04 #6
Hvordan får jeg formateret Start til dd-mm-åååå tt:mm:ss og Periode til tt:mm:ss?
Avatar billede sjap Praktikant
02. maj 2003 - 15:07 #7
Med noget i retning af

Nystreng = Format(Start,"dd-mm-yyyy hh:nn:ss") & " " & Format(Periode,"hh:nn:ss")

eller hvad mener du?
Avatar billede sjap Praktikant
02. maj 2003 - 15:10 #8
Nu tror jeg, at jeg fangede den. Der skulle selvfølgelig have stået:

msg = Format(Start,"dd-mm-yyyy hh:nn:ss") & " " & Format(Periode,"hh:nn:ss")
Avatar billede janvogt Praktikant
02. maj 2003 - 15:10 #9
Ja, det ser rigtigt ud, bortset fra nn = mm :-)
Men Time() må så skulle udskiftes med Now() for at få datoformatet ....
Avatar billede jkrons Professor
02. maj 2003 - 15:11 #10
Ja, hvis du vil have dato med skal du bruge Now i stedet for Time.
Avatar billede sjap Praktikant
02. maj 2003 - 15:14 #11
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 :-)
Avatar billede sjap Praktikant
02. maj 2003 - 15:15 #12
Skal måske lige tilføje at nn faktisk også virker (men nn opfattes dog som minutter uanset hvor du skriver det).
Avatar billede jkrons Professor
02. maj 2003 - 15:15 #13
superjap-> Det har også altid undret mig :-)
Avatar billede sjap Praktikant
02. maj 2003 - 15:17 #14
Ind imellem laver de åbenbart noget fornuftigt hos MS (der er måske lidt langt imellem, men de skal da have ros, når de fortjener det).
Avatar billede janvogt Praktikant
02. maj 2003 - 15:26 #15
Fatter det ikke. Start sættes stadig til "0" så jeg får:
30-12-1899 00:00:00 15:28:01
Avatar billede sjap Praktikant
02. maj 2003 - 15:30 #16
Har du prøvet at skrive

Dim Start As Date

i stedet for Public
Avatar billede sjap Praktikant
02. maj 2003 - 15:32 #17
Njah - Public burde være rigtigt nok.
Avatar billede janvogt Praktikant
02. maj 2003 - 15:37 #18
Kan man godt dimensionere et tidspunkt "Date"?
Avatar billede janvogt Praktikant
02. maj 2003 - 15:37 #19
Ser ikke ud til, at der er noget som hedder "Time".
Avatar billede jkrons Professor
02. maj 2003 - 15:38 #20
Det lyder spændende. Det findes hos mig. Har du prøvet med Now i stedet.
Avatar billede sjap Praktikant
02. maj 2003 - 15:40 #21
Begge findes hos mig, men det også bedst at bruge Now() - for det tifælde at du kommer over midnat.
Avatar billede jkrons Professor
02. maj 2003 - 15:40 #22
Pladder! Jeg tror jeg misforstod. Time findes ikke ved dimensionering. Derfor bruge jeg Date.
Avatar billede sjap Praktikant
02. maj 2003 - 15:41 #23
:0)
Avatar billede janvogt Praktikant
02. maj 2003 - 15:42 #24
Det var Time under Dim jeg mente - altså
Public Start As Time .....
Avatar billede janvogt Praktikant
02. maj 2003 - 15:42 #25
:-)
Avatar billede sjap Praktikant
02. maj 2003 - 15:43 #26
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"))

End Sub

Private Sub Workbook_Open()

Start = Now()
MsgBox (Format(Start, "dd-mm-yyyy hh:nn:ss"))

End Sub
Avatar billede jkrons Professor
02. maj 2003 - 15:44 #27
Den kender ikke en Time datatype. Men date kan indeholde både dato og tid.
Avatar billede janvogt Praktikant
02. maj 2003 - 15:45 #28
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


Kan I få den til at virke?
Avatar billede jkrons Professor
02. maj 2003 - 15:45 #29
Virker også hos mig.
Avatar billede janvogt Praktikant
02. maj 2003 - 15:48 #30
Hmm, kører i Excel 97?
Avatar billede jkrons Professor
02. maj 2003 - 15:48 #31
janvogt-> Nej, når jeg bruger din kode får jeg samme problem som dig. Mystisk?
Avatar billede sjap Praktikant
02. maj 2003 - 15:49 #32
Virker IKKE hos mig!
Avatar billede sjap Praktikant
02. maj 2003 - 15:50 #33
PROBLEM LØST ?

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
Avatar billede sjap Praktikant
02. maj 2003 - 15:52 #34
Problemet var at du erklærede OpenTime inde i beforeclose-sub'en og så bliver den jo nulstillet.  HOV-HOV!
Avatar billede jkrons Professor
02. maj 2003 - 15:53 #35
Du erklærer din variabel to gange
Avatar billede jkrons Professor
02. maj 2003 - 15:54 #36
superjap-> OK Der vsr du hurtigst og mest detaljeret. Man skal ikke skrive mens man arbejder med noget andet. Det nedsætter svartiden :-)
Avatar billede sjap Praktikant
02. maj 2003 - 15:55 #37
jkrons-> Nu snakker du ikke i telefon igen - vel!  :-)
Avatar billede jkrons Professor
02. maj 2003 - 15:57 #38
Nope! Jeg skrive bare på en mindre afhandling ;-)
Avatar billede janvogt Praktikant
02. maj 2003 - 15:59 #39
Pyha, så er den der :-)
Superjap, der var en lille fejl i din kode:
Dim Period As Date skal være Dim Periode As Date

Tak for hjælpen begge 2.
Hvis det er ok med jer deler I pointene for det fine samarbejde :-)
Avatar billede sjap Praktikant
02. maj 2003 - 16:01 #40
Det er da ok med mig. Tak for kampen!
Avatar billede janvogt Praktikant
02. maj 2003 - 16:06 #41
Nu mangler jeg bare på én eller anden måde at hente brugernavnet fra netværket, og så logge den sammen med, men det er en helt anden sag .....
Avatar billede jkrons Professor
02. maj 2003 - 16:08 #42
Helt i orden med mig. Godt det lykkedes til sidst :-)
Avatar billede jkrons Professor
02. maj 2003 - 16:11 #43
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
Avatar billede janvogt Praktikant
02. maj 2003 - 16:15 #44
Tester jeg lige, hvor mon den brugernavnet?

Måske kan Application.UserName også bruges .......
Avatar billede janvogt Praktikant
02. maj 2003 - 16:18 #45
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
                     
                      On Error GoTo 0
                     
                      ReturnUserName = UCase(Trim(tString))

End Function
Avatar billede jkrons Professor
02. maj 2003 - 16:18 #46
Den laver en Function hvor burgernavner returnes i selve Fucntion navnet. Det kan forholdsvis nemt ændres til en Sub, hvor det lagres i en variabel.
Avatar billede jkrons Professor
02. maj 2003 - 16:18 #47
Ligner meget.
Avatar billede janvogt Praktikant
02. maj 2003 - 16:19 #48
De 2 forfattere har vist kigget hinanden over skulderen .....
Avatar billede jkrons Professor
02. maj 2003 - 16:21 #49
Mon ikke :-) Håber i hvert fald at du kan brugen noget af det. Jeg må smutte nu - fredagsindkøbene kalder.
Avatar billede janvogt Praktikant
02. maj 2003 - 16:24 #50
Ok, god weekend ....
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester