Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Aktualisieren wenn Datei geöffnet

Aktualisieren wenn Datei geöffnet
05.04.2013 08:55:10
Gerwin
Hab hier schon sehr viel Hilfe durch das Archiv bekommen, da hab ich mich einfach mal Registriert um mitzumischen.
Ein freundliches Guten Morgen an alle,
ich habe eine Excel-Arbeitsmappe als Datenbank hinterlegt. Aus dieser ziehen sich Andere Dateien ihre Daten. Wenn die Datenbank geöffnet ist, zum Beispiel durch einen anderen Benutzer (wir arbeiten über einen Server), können die Daten nicht Aktualisiert werden.
Sub Aktualisieren()
' Aktualisieren Makro
ActiveSheet.Unprotect Password:=("1234")
ActiveWorkbook.Unprotect Password:=("1234")
ActiveWorkbook.UpdateLink Name:= _
"K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm", _
Type:=xlExcelLinks
ActiveWorkbook.Protect Password:=("1234")
ActiveSheet.Protect Password:=("1234")
End Sub

So sieht das Makro aus das die Daten aktualisieren soll, funktioniert auch.
Wenn die Datenbank geöffnet ist bekomme ich einen Laufzeitfehler. Wäre es möglich das mir eine MsgBox anzeigt durch welchen Benutzer sie geöffnet ist? Die MsgBox ist nicht das Problem, sondern nur die Anzeige durch welchen Benutzer.
Vielen Dank im Vorraus

Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Idee: AW: Aktualisieren wenn Datei geöffnet
05.04.2013 09:26:27
Klaus
Hi Gerwin,
ich habe keine Idee wie du "aus der Ferne" abfragst, wer eine Datei geöffnet hat. Darum andersrum:
Erstell in der Materialdatenbank eine neue Tabelle, die nennst du zB "GEHEIM". Ausserdem kommt in "ThisWorkbook" der Materialdatenbank der Code:
Private Sub Workbook_Open()
Sheets("GEHEIM").Range("A1").Value = Environ("Username")
End Sub
Jetzt fragst du "aus der Ferne" einfach den Inhalt von [Materialdatenbank.xlsm]Geheim!A1 ab!
An dieser Stelle muss der kleine Hinweis folgen: Ein über-enthusiastischer Betriebsrat KÖNNTE dir ein solches Makro als illegale Arbeitnehmer-Überwachung auslegen, sicher dich dahingehend ab.
Andererer Lösungsansatz:
Wenn du die Datei einfach "öffnest", kommt von Windows selbst die Nachricht welcher Benutzer die Datei zur Zeit in Beschlag hat. Bastel ein "on error" in dein Makro ein, dass dir bei misslungenem Update die Datei öffnet und schau auf die Windows-Nachricht.
Grüße,
Klaus M.vdT.

Anzeige
Idee: AW: Aktualisieren wenn Datei geöffnet
05.04.2013 11:01:27
Gerwin
Ich hab was die Antwort betrifft gerade einen neuen Thread aufgemacht weil ich nicht wusste wie man antwortet, jetzt hab ichs aber glaub ich. Entschuldigung.
Hallo Klaus,
danke für deine Antwort, scheint mir eine logische möglichkeit zu sein, bin aber glaub ich nicht clever genug sie umzusetzen.
Sub Aktualisieren()
' Aktualisieren Makro
ActiveSheet.Unprotect Password:=("1234")
ActiveWorkbook.Unprotect Password:=("1234")
On Error GoTo ErrMsg
ActiveWorkbook.UpdateLink Name:= _
"K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm", _
Type:=xlExcelLinks
ActiveWorkbook.Protect Password:=("1234")
ActiveSheet.Protect Password:=("1234")
ErrMsg:
Dim strText As String
strText = "(K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm[ _
Userabfrage].Range(A1)"
MsgBox "Die Materialdatenbank ist zurzeit geöffnet durch den Benutzer " & strText, 16, " _
Datenbank geöffnet"
End Sub

Ist klar, das er jetzt in der MsgBox mir den Pfad wiedergibt und nicht das was ich haben will, aber ich weiß nicht wie ich das verpacken kann...
Evtl. du oder jemand anders ne Idee?
VG
Gerwin

Anzeige
Rückfragen:
05.04.2013 11:28:38
Matze
Die Datei mit der Datenbank ist ebenfalls in Excel2007 erstellt?
Enthält diese Datei schon Makros?
Darf die Datei , in ein neues Format gebracht werden in dem du ein Makro einfügst?
Hast du die Berechtigung den UserNamen aus zu lesen?
Beantworte diese Fragen.
Matze

Anzeige
AW: Rückfragen:
05.04.2013 11:37:56
Gerwin

Die Datei mit der Datenbank ist ebenfalls in Excel2007 erstellt?
Jap
Enthält diese Datei schon Makros?
Jap
Darf die Datei , in ein neues Format gebracht werden in dem du ein Makro einfügst?
Muss sie ja nicht, da sie bereits im xlsm. Format ist. Es sei denn du meinst ein anderes Format.
Hast du die Berechtigung den UserNamen aus zu lesen?

Was das betrifft, stört des hier keinen. Für die meisten ist alles was über =SUMME() hinausgeht schon schwarze Magie. Es sei denn du meinst Systemberechtigung, da weiß ichs nicht.
VG
Gerwin

Anzeige
Auf ein neues,...
05.04.2013 11:51:54
Matze
...weis jetzt gar nicht warum hier Klaus nicht weitermacht,...er hat es aber eigentlich gut beschrieben.
Erstell in der Materialdatenbank eine neue Tabelle, die nennst du GEHEIM.
Nun im VBA editor unter "Diese Arbeitsmappe" der Materialdatenbank der Code:

Private Sub Workbook_Open()
Sheets("GEHEIM").Range("A1").Value = Environ("Username")
End Sub

Fertig.
In deiner Abfragedatei deinen Code anpassen.Wenn der bisher funktioniert hat:

Sub Aktualisieren()
ActiveSheet.Unprotect Password:=("1234")
ActiveWorkbook.Unprotect Password:=("1234")
On Error GoTo ErrMsg
ActiveWorkbook.UpdateLink Name:="K:\Material\Materialdatenbank_Bestellformular\ _
Materialdatenbank_2.0.xlsm", Type:=xlExcelLinks
ActiveWorkbook.Protect Password:=("1234")
ActiveSheet.Protect Password:=("1234")
ErrMsg:
Dim strText As String
strText = "(K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm[ _
Geheim].Range(A1)"
MsgBox "Die Materialdatenbank ist zurzeit geöffnet durch den Benutzer " & strText, 16, " _
Datenbank geöffnet"
End Sub
Matze
Du solltest Rudis Beitrag mal lesen!!

Anzeige
AW: Auf ein neues,...
08.04.2013 09:25:30
Klaus
..weis jetzt gar nicht warum hier Klaus nicht weitermacht,...er hat es aber eigentlich gut beschrieben.
Hallo Matze,
ich habe nicht weiter gemacht, weil ich zwischen Freitag 11:00 und Montag 08:00 (Zeitangaben UTC+1) nicht im herber.de Forum lese! Danke fürs Einspringen.
Hallo Gerwin,
Matze hat dir schon 98% der Lösung gegeben. Ein kleiner Haken ist, dass seine Lösung immer die MsgBox anzeigen wird. Korrektur geht aber fix:

Sub Aktualisieren()
ActiveSheet.Unprotect Password:=("1234")
ActiveWorkbook.Unprotect Password:=("1234")
On Error GoTo ErrMsg
ActiveWorkbook.UpdateLink Name:="K:\Material\Materialdatenbank_Bestellformular\ _
Materialdatenbank_2.0.xlsm", Type:=xlExcelLinks
ActiveWorkbook.Protect Password:=("1234")
ActiveSheet.Protect Password:=("1234")
goto heaven
ErrMsg:
Dim strText As String
strText = "(K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm[ _
Geheim].Range(A1)"
MsgBox "Die Materialdatenbank ist zurzeit geöffnet durch den Benutzer " & strText, 16, " _
Datenbank geöffnet"
heaven:
End Sub

Matze, beim drüberschauen glaube ich, dass in strText immer der komplette Link stehen wird (Anführungszeichen am Anfang). Hast du den getestet?
Grüße,
Klaus M.vdT.

Anzeige
AW: Aktualisieren wenn Datei geöffnet
05.04.2013 09:29:52
eres
Hallo Gerwin,
hatte das gleiche Problem ("UDF für LastUser unter Office2010") vor einiger Zeit auch mal ins Forum gestellt und leider keine Antwort bekommen. Im Netz findet man immer nur die bis Excel2003 noch funtionierende Lösung, aber keine Alternative für Excel 2007ff.
Lasse den Beitrag natürlich offen.
Gruß
erwin

Anzeige
AW: Aktualisieren wenn Datei geöffnet
05.04.2013 11:39:50
Rudi
Hallo,
vielleicht so:
Sub Aktualisieren()
Dim strFile As String
strFile = "K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm"
Pruefen strFile
ActiveSheet.Protect Password:=("1234")
ActiveWorkbook.Protect Password:=("1234")
ActiveWorkbook.UpdateLink Name:=strFile, Type:=xlExcelLinks
ActiveSheet.Protect Password:=("1234")
ActiveWorkbook.Protect Password:=("1234")
End Sub
Private Sub Pruefen(strFileToOpen As String)
Do While IsFileOpen(strFileToOpen)
If MsgBox(strFileToOpen & " ist von " & LastUser(strFileToOpen) & " geöffnet." _
& vbLf & "Bitte schließen lassen.", _
vbOKCancel + vbInformation, "Datei geöffnet") = vbCancel Then End
Loop
End Sub
Function IsFileOpen(strFullPathFileName As String) As Boolean
'// VBA version to check if File is Open
'// We can use this for ANY FILE not just Excel!
'// Ivan F Moala
'// http://www.xcelfiles.com
Dim hdlFile As Long
'// Error is generated if you try
'// opening a File for ReadWrite lock >> MUST BE OPEN!
On Error GoTo FileIsOpen:
hdlFile = FreeFile
Open strFullPathFileName For Random Access Read Write Lock Read Write As hdlFile
IsFileOpen = False
Close hdlFile
Exit Function
FileIsOpen:
'// Someone has it open!
IsFileOpen = True
Close hdlFile
End Function
Function LastUser(strPath As String) As String
'// Code by Helen from http://www.
_
visualbasicforum.com/index.php?s=
'// This routine gets the Username of the File In Use
'// Credit goes to Helen for code & Mark for the idea
'// Insomniac for xl97 inStrRev
'// Amendment 25th June 2004 by IFM
'// : Name changes will show old setting
'// : you need to get the Len of the Name stored just before
'// : the double Padded Nullstrings
Dim strXl As String
Dim strFlag1 As String, strflag2 As String
Dim i As Integer, j As Integer
Dim hdlFile As Long
Dim lNameLen As Byte
strFlag1 = Chr(0) & Chr(0)
strflag2 = Chr(32) & Chr(32)
hdlFile = FreeFile
Open strPath For Binary As #hdlFile
strXl = Space(LOF(hdlFile))
Get 1, , strXl
Close #hdlFile
j = InStr(1, strXl, strflag2)
#If Not VBA6 Then
'// Xl97
For i = j - 1 To 1 Step -1
If Mid(strXl, i, 1) = Chr(0) Then Exit For
Next
i = i + 1
#Else
'// Xl2000+
i = InStrRev(strXl, strFlag1, j) + Len(strFlag1)
#End If
'// IFM
lNameLen = Asc(Mid(strXl, i - 3, 1))
LastUser = Mid(strXl, i, lNameLen)
End Function

Gruß
Rudi

Anzeige
@Rudi
05.04.2013 12:01:51
eres
Hallo Rudi,
die von Dir angegebene Funktion "LastUser" aus dem visualbasicforum läuft meiner Meinung nach nur bis Excel2003. Ab Excel2007 werden hier keine vernünftigen Ergebnisse angezeigt.
Vielleicht habe ich aber auch hier ein Brett vorm Kopf und bei Dir läuft die Funktion auch in Excel 2007 oder 2010 ?
Danke & Gruß
erwin

Anzeige
AW: @Rudi
05.04.2013 12:33:48
Rudi
Hallo,
wenn ich eine Datei geöffnet habe, sagt mir die Routine, dass sie von mir benutzt wird.
XL2007/ WIN7
Gruß
Rudi

AW: @Rudi
05.04.2013 12:39:27
eres
Merkwürdig, bei mir werden in der Messagebox als LastUser einer von mir geöffneten Datei folgendes angezeigt:
Dc°Y¥T{u
uä¸ñ¹× BwSëÕ*zícݑ\â‘`£›È¢]Iz~ý¾¨•ÁȱÀ ¤L¨a‚¿2沦
àOÓ¨˜Îù]¦ŽèPë¼ç½k§è*‘.”sÞ¹ìფ±¿.ƒ„³¬¨u`Û@1"Ð/°ãÊØf\x°˜A¡
‘ïip#Å×öÈ·ÔTj­µ«i½òõ½:¼ÿ ¶(ŠÕ2›åDzbZÀ·/§ÓéDO&“éèNXHŒ¸9ö,´CPÓ ¤Q3D!W ˜^Aœ(іKjVÖftE©§‰.Æ à
Ich arbeite mit Excel2010 und Win7.
Anmerkung: Die Datei ist natürlich nicht verschlüsselt oder ähnliches. Es ist eine normale ungeschützte xlsx.
Bin hier ratlos ...
Trotzdem Danke für die Info Rudi.
Gruß
erwin

Anzeige
AW: Aktualisieren wenn Datei geöffnet
05.04.2013 13:25:00
Gerwin
Hallo Rudi,
danke für deine Hilfe, ist ja ein ziemliches Datenmonster.
Ich blick da auch nicht durch was das machen soll (mangels Kentnisse) und ich bekomme auch die Meldung wie erwin.
Dc°Y¥T{u
uä¸ñ¹× BwSëÕ*zícݑ\â‘`£›È¢]Iz~ý¾¨•ÁȱÀ ¤L¨a‚¿2沦
àOÓ¨˜Îù]¦ŽèPë¼ç½k§è*‘.”sÞ¹ìფ±¿.ƒ„³¬¨u`Û@1"Ð/°ãÊØf\x°˜A¡
‘ïip#Å×öÈ·ÔTj­µ«i½òõ½:¼ÿ ¶(ŠÕ2›åDzbZÀ·/§ÓéDO&“éèNXHŒ¸9ö,´CPÓ ¤Q3D!W ˜^Aœ(іKjVÖftE©§‰.Æ à
Arbeite auch mit Win7 und Excel 2007.
und @Matze Hat leider immer noch nicht funktioniert.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Excel-Datei beim Öffnen automatisch aktualisieren


Schritt-für-Schritt-Anleitung

Um eine Excel-Datei beim Öffnen automatisch zu aktualisieren, kannst du ein VBA-Makro verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsm)", wähle Einfügen und dann Modul.

  3. Füge den folgenden Code ein:

    Sub Aktualisieren()
        ActiveSheet.Unprotect Password:="1234"
        ActiveWorkbook.Unprotect Password:="1234"
        On Error GoTo ErrMsg
        ActiveWorkbook.UpdateLink Name:="K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm", Type:=xlExcelLinks
        ActiveWorkbook.Protect Password:="1234"
        ActiveSheet.Protect Password:="1234"
        Exit Sub
    ErrMsg:
        MsgBox "Die Datei konnte nicht aktualisiert werden, da sie derzeit von einem anderen Benutzer geöffnet ist."
    End Sub
  4. Schließe den VBA-Editor und speichere die Datei.

  5. Teste das Makro: Öffne die Datei, um zu sehen, ob die Aktualisierung funktioniert.


Häufige Fehler und Lösungen

  • Laufzeitfehler: Wenn die Datenbank geöffnet ist, kann es zu einem Laufzeitfehler kommen. Stelle sicher, dass die Datei nicht von einem anderen Benutzer bearbeitet wird.
  • MsgBox zeigt falschen Benutzer an: Wenn du den Benutzernamen des aktuellen Nutzers ermitteln möchtest, kannst du den Environ("Username") Befehl in eine versteckte Tabelle einfügen, wie von Klaus vorgeschlagen.

Alternative Methoden

Eine andere Methode zur Aktualisierung könnte die Verwendung eines Timer-Events sein, um die Datei in bestimmten Intervallen zu aktualisieren. Hier ist ein Beispiel:

Private Sub Workbook_Open()
    Application.OnTime Now + TimeValue("00:05:00"), "Aktualisieren"
End Sub

Das oben genannte Makro aktualisiert die Datei alle fünf Minuten, solange sie geöffnet ist.


Praktische Beispiele

Ein Beispiel für ein effektives Makro sieht so aus:

Sub Aktualisieren()
    Dim strFile As String
    strFile = "K:\Material\Materialdatenbank_Bestellformular\Materialdatenbank_2.0.xlsm"

    If IsFileOpen(strFile) Then
        MsgBox strFile & " ist von einem anderen Benutzer geöffnet."
    Else
        ActiveWorkbook.UpdateLink Name:=strFile, Type:=xlExcelLinks
    End If
End Sub

Dieses Beispiel überprüft, ob die Datei geöffnet ist und aktualisiert sie nur, wenn sie nicht in Benutzung ist.


Tipps für Profis

  • Sichere deine Makros: Verwende das ActiveWorkbook.Unprotect und ActiveSheet.Unprotect, um deine Arbeitsmappe vor unbefugtem Zugriff zu schützen.
  • Verwende Fehlerbehandlung: Implementiere On Error GoTo, um sicherzustellen, dass dein Makro bei Fehlern nicht abstürzt, sondern eine benutzerfreundliche Fehlermeldung anzeigt.
  • Testen in verschiedenen Excel-Versionen: Achte darauf, dass dein Code in verschiedenen Excel-Versionen (z. B. Excel 2007, Excel 2010) funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass mein Makro bei jedem Öffnen automatisch ausgeführt wird? Um sicherzustellen, dass dein Makro bei jedem Öffnen der Datei ausgeführt wird, kannst du den Code in das Workbook_Open Event einfügen.

2. Was tun, wenn ich die Meldung "Die Datei ist geöffnet" bekomme? Wenn du die Meldung erhältst, dass die Datei bereits geöffnet ist, kannst du entweder warten, bis der Benutzer die Datei schließt, oder alternative Methoden zur Abfrage des Benutzernamens verwenden, wie in den vorherigen Abschnitten beschrieben.

3. Funktioniert das Makro auch in Excel 2010 und höher? Ja, die meisten der vorgestellten Makros sollten in Excel 2010 und höheren Versionen funktionieren. Achte jedoch darauf, dass du die richtige Sicherheitsstufe für Makros in Excel eingestellt hast.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige