• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

'Laatst bewerkt door' toevoegen in cel Excel 2003

Status
Niet open voor verdere reacties.

Maniac

Gebruiker
Lid geworden
9 apr 2004
Berichten
40
De afgelopen paar dagen ben ik aan het zoeken op internet naar een manier om in een cel van een werkblad de naam te plaatsen van degene die het document het laatst bewerkt en opgeslagen heeft (laatste auteur). Ik maak gebruik van Excel 2003.

Ik heb inmiddels al de datum en tijd wanneer het document het laatst is bewerkt en opgeslagen. Hiervoor heb ik de volgende code gebruikt:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("Blad1").Range("b2").Value = Now()
ActiveWorkbook.Save
End Sub

Nu heb ik allerlei andere codes geprobeerd, zoals onderstaande:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Sheets("Blad1").Range("A1").Value = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")

Sheets("Blad1").Range("A2").Value = ThisWorkbook.BuiltinDocumentProperties("Last Author")

End Sub

Alleen wat ik ook doe, het lukt niet. Heeft iemand misschien een idee hoe ik de laatste auteur kan integreren in de eerste code, zodat die verschijnt in cel B3 of eventueel een andere manier waarmee ik beide onder elkaar kan tonen? Alvast bedankt.
 
Laatst bewerkt:
Maniac,

Als ik onderstaande code achter het blad zet en dan ergens in het werkblad klikt komt mijn naam te staan in Cel A2.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
End Sub
 
Dat werkt. Ik heb het nu aangepast zodat ik ook de datum en tijd kan weergeven. Nu luidt de code als volgt:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
End Sub

Dit werkt voor mij op zich prima, alleen er ontstaan wel twee problemen:
1) Als ik het bestand heb bewerkt en opgeslagen en vervolgens heropen verschijnt de nieuwe datum en tijd op het moment dat ik in het document ga staan. Als ik vervolgens zonder enige bewerking het document wil sluiten, dan wordt er gevraagd of ik de wijzigingen wil opslaan, refererend naar de datum en tijdwijziging. Is er ook een manier waarmee de laatste datum en tijd automatisch getoond wordt, direct bij het openen van het bestand waardoor het bestand niet opnieuw opgeslagen hoeft worden als het alleen bekeken is? Het gaat er namelijk om dat bijgehouden wordt wanneer wijzigingen plaatsvinden en niet wanneer het bekeken is.

2) Als het bestand door iemand anders (op een andere pc) wordt bewerkt, opgeslagen en vervolgens heropend, dan veranderd zowel de auteur als de datum en tijd niet. Op deze manier gaat de bedoeling van het document enigszins verloren. Hoe kan ik dit veranderen?

Ik hoop dat het duidelijk is en anders graag even een seintje en dan geef ik extra tekst en uitleg. Alvast bedankt.
 
Maniac,

Ik heb dit in ThisWorkbook gezet en het werkt, als je het al een keer heb opgeslagen. (zonder de code)

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  [Blad1!B2] = Now()
  [Blad1!A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
  [Blad1!A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  ActiveWorkbook.Save
End Sub

Je moet de volgende keer de code die je plaatst, selecteren en dan boven in het menu op # klikken, dan komt de code netjes in een vak te staan.
 
Laatst bewerkt:
Top, het werkt bijna perfect. Ik zal even een schets geven van de gewenste eindsituatie:

Het uiteindelijke bestand bestaat uit een kleine 20 werkbladen met ieder zijn eigen titel (bijv. totaal). Op ieder tabblad dient in cel C2 de datum en tijd te verschijnen van de laatste wijziging/opslaanmoment en in cel C3 de naam van de laatste auteur met wijzigingen van die betreffende tabblad.
De laatste datum en tijd dienen automatisch getoond te worden bij opening bestand en hoeft niet te veranderen als er niks gewijzigd wordt (bijv. alleen bekijken). Indien er een wijziging wordt aangebracht en het document gesloten wenst te worden, dient Excel te vragen of de wijzigingen opgeslagen moeten worden en zo ja, dan dienen de datum/tijd en auteur aangepast te worden op de achtergrond. Als het bestand dan weer geopend wordt, is te zien wie en wanneer het document gewijzigd is.

Op zich heeft de eerdergenoemde code het merendeel van bovenstaande gerealiseerd, alleen ik kan niet de namen van de werkbladen wijzigen zonder een foutmelding met als resultaat dat de functie niet meer werkt. Verder vraagt Excel niet meer of ik de aangebrachte wijzigingen wil opslaan, maar slaat het bestand automatisch op. Weet iemand een aanpassing in de code, waarmee ik het plaatje compleet krijg?

Sowieso bedankt voor de eerdere hulp.
 
Gebruik de codenaam v/d werkbladen
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Blad1
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
End Sub
 
Het probleem met de namen is nu opgelost, waarvoor dank.

Alleen twee problemen blijven bestaan: (1) als ik op één tabblad iets wijzig, dan veranderd de datum voor alle tabbladen en (2) als ik het bestand open en direct weer sluit, zonder enkele aanpassing, wordt er toch gevraagd of wijzigingen opgeslagen moeten worden en wanneer met ja geantwoord wordt, veranderd de datum laatste wijziging in feite onterecht.

Daarnaaast was ik benieuwd wat het nut/verschil is van zowel .[B2] = Now() en .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")?

Ik heb het nu als volgt in This Workbook opgenomen:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Test
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test2
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test3
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
End Sub

Is er een manier waarmee per tabblad de datum/tijd+auteur bijgehouden kan worden en ten tweede alleen daadwerkelijke wijzigingen leiden tot een opslaanvraag bij afsluiten? Alvast bedankt.
 
Je zou dan ahw op een apart tabblad een soort logboek moeten gaan bijhouden met alle doorgevoerde wijzigingen en aan de hand daarvan controleren op welk tabblad er iets gewijzigd is en alzo de BeforeClose-macro aanpassen zodat deze enkel de juiste gegevens aanpast voor de bladen die vermeld worden in je logboek. Niet simpel denk ik :confused:
 
Dan ben ik wellicht wat te veeleisend en hou ik het bij één datum en tijd voor alle werkbladen, die ook op alle werkbladen wordt getoond. Is onderstaande code dan de juiste manier:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Test
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test2
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test3
        .[B2] = Now()
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
End Sub

Weet je daarnaast misschien het antwoord op de vragen:
- Wat is het nut/verschil van zowel .[B2] = Now() en .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")?
- Als ik het bestand open en direct weer sluit, zonder enkele aanpassing, wordt er toch gevraagd of wijzigingen opgeslagen moeten worden en wanneer met ja geantwoord wordt, veranderd de datum laatste wijziging in feite onterecht. Heb je hier misschien een oplossing voor?

Alvast bedankt.
 
Maniac,

Je zou ook dit kunnen gebruiken omdat hij de tijd ook al apart noteerd.
Code:
.[B2] = Date

Ik denk dat hij nu niet meer vraag om op te slaan.
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With Test
        .[B2] = Date
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test2
        .[B2] = Date
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
   With Test3
        .[B2] = Date       
        .[A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
        .[A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  End With
        ActiveWorkbook.Save
End Sub
 
Laatst bewerkt:
Maniac,

Dan ben ik wellicht wat te veeleisend en hou ik het bij één datum en tijd voor alle werkbladen

Dan is volgens mij deze code genoeg.

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  For Each ws In ThisWorkbook.Worksheets
    ws.Select
    [B2] = Date
    [A1] = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
    [A2] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
  Next
    ActiveWorkbook.Save
End Sub
 
Met ActiveWorkbook.Save ontbreekt nu weer de melding "Wilt u wijzigingen opslaan?" terwijl ik wel wijzigingen heb aangebracht. Is er wellicht eentje die werkt als een normaal Excel-bestand. Bij wjizigingen wel de vraag en bij alleen bekijken geen vraag? Alvast bedankt.
 
Ik denk een oplossing gevonden te hebben:D
Er staat een woordje uitleg in het bestand. Test het eens en laat maar iets weten
 
:thumb: Super! Het werkt op de losse werkbladen en het kostte ook geen enkele moeite om het te laten functioneren bij nieuwe tabbladen. Op zich kan ik hier meer dan voldoende mee uit de voeten :D, alleen een drietal kanttekeningen, waarvan de eerste het meest van belang is:

1) Volgens mij pakt hij niet de juiste tijd. Als ik het bestand bijvoorbeeld afsluit om 12.00 uur en vervolgens om 12.10 uur heropen en iets wijzig dan veranderd de tijd naar 12.00 en niet naar 12.10 uur. Hoe kan dit? Ik gebruik 'Last Save Time', is dit dan wel de juiste code?

2) Als ik een cel vul/wijzig in een werkblad en vervolgens opsla, dan wordt de tijd aangepast (zoals het moet). Nadat ik het bestand afgesloten en vervolgens heropend heb en uitsluitend de eerdergevulde cel weer leeg haal, dan voer ik in feite wel een wijziging uit, alleen de tijd wordt niet aangepast.
3) In je aantekeningen zeg je "Daarna wordt het bestand opgeslagen met de wijzigingen (zonder vraag)". In principe is de bedoeling dat er wel een vraag komt, aangezien er wijzigingen zijn aangebracht.

Mocht je nog een oplossing hebben voor één van de drie of allen, dan hoor ik die graag en anders gebruik ik gewoon het huidige bestand. In ieder geval alvast hartstikke bedankt voor de hulp.
 
Tijdherkenningsprobleem blijft bestaan. Als ik om 12.00 uur iets wijzig en opsla, veranderd de tijd niet. De tijd veranderd pas als ik het bestand afsluit. Heb je hier misschien nog een oplossing voor?

Ik krijg nu in ieder geval wel de vraag of ik wijzigingen wil opslaan als ik het bestand wens af te sluiten. Als ik het bestand alleen open en direct weer sluit, krijg ik de vraag niet. Dus dat werkt prima, waarvoor bedankt.

Verder heb ik, om de datum en tijd in één cel te krijgen, de code enigszins aangepast:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    For Each ws In ThisWorkbook.Worksheets
        If ws.[C4] = "Bestand gewijzigd" Then
            ws.[A4] = Date
            ws.[C2] = Format(Date & " " & Time)
            ws.[C3] = ThisWorkbook.BuiltinDocumentProperties("Last Author")
            ws.[C4] = ""
        End If
    Next
End Sub
 
Je had niet vermeld dat de wijzigingmelding onmiddelijk moest doorgevoerd :o
In elke bladmodule de macro verwijderd en in ThisWorkbook een nieuwe geplaatst
 
en met de volgende code in een module kun je ook de computer of username toevoegen (last author kan afwijken van username)

Code:
Private Declare Function GetComputerName Lib "kernel32" _
  Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) _
  As Long
  
  Private Declare Function GetUserName Lib "advapi32.dll" _
Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) _
  As Long
  
Public Function NameOfComputer()
'   Returns the name of the computer
    Dim ComputerName As String
    Dim ComputerNameLen As Long
    Dim Result As Long
    ComputerNameLen = 256
    ComputerName = Space(ComputerNameLen)
    Result = GetComputerName(ComputerName, ComputerNameLen)
    If Result <> 0 Then
        NameOfComputer = Left(ComputerName, ComputerNameLen)
    Else
        NameOfComputer = "Unknown"
    End If
End Function
Function username() As String
'   Returns the name of the logged-in user
    Dim a
    Dim Buffer As String * 100
    Dim BuffLen As Long
    BuffLen = 100
    GetUserName Buffer, BuffLen
    username = Left(Buffer, BuffLen - 1)
    a = Buffer
End Function

gr wim
 
Bedoelde eigenlijk dat hij het moment van wijzigen als tijd moest onthouden en niet het moment van opslaan, maar excuses als dat niet duidelijk was. Belangrijkste is echter dat het allemaal werkt en de directe aanpassing maakt het allemaal nog duidelijker. Ik beschouw zodoende het 'probleem' als afgerond en nogmaals bedankt voor alle steun.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan