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

Workbooks.Count > 1

Forumthread: Workbooks.Count > 1

Workbooks.Count > 1
08.04.2016 18:47:52
Hugo
Hallo
Habe folgendes Problem:
Ich verhindere, dass auf meiner Excel-Datei eine 2. Excel-Datei geöffnet wird.
Private Sub Workbook_Deactivate()
If Workbooks.Count > 1 Then
"entsprechender Code zum wieder schliessen"
end if
End Sub
Das funktioniert auch prima.
Wenn ich nun eine Excel-Datei aus einem Email-Anhang öffne, erfolgt die Meldung Geschütze Ansicht "Diese Datei stammt aus einer Email-Anhang......... "
Diese Datei erkennt mein Code nicht. Sie ist anscheinend noch nicht geöffnet.
Wenn ich sie, mit oder ohne -Bearbeitung aktivieren- öffne, ist mein Code ja schon durchgelaufen und ich habe das Problem mit 2 gleichzeitig geöffneten Dateien.
Gibt es eine Lösung für mein Problem ? Hoffe doch schon.
Besten ank für euer Bemühung und Gruss
Hugo

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Workbooks.Count > 1
08.04.2016 19:28:57
Hugo
Hoi Chris
Danke für deine Bemühung.
Aber ich denke nicht, dass die Warnung beim öffnen eines Anhang ein Fehler ist.
Das ist doch eine Sicherheitsmassnahme.
Mein Problem ist, dass zum Zeitpunkt des Durchlauf des Codes
Private Sub Workbook_Deactivate()
If Workbooks.Count > 1 Then
"entsprechender Code zum wieder schliessen"
end if
End Sub
der Email-Anhang noch nicht als geöffnete erkannt wird.
Und wenn der Anhang dann tatsächlich offen ist, ist der Code schon durchgelaufen
und ich habe gleichzeitig zwei offene Dateien.
Das möchte ich verhindern
Hoffe es gibt dafür eine Lösung
Gruss Hugo

Anzeige
AW: Workbooks.Count > 1
08.04.2016 19:31:15
ChrisL
Hi Hugo
Macht Sinn...
Ausser einer Zeitverzögerung mit OnTime fällt mir nix ein.
cu
Chris

AW: Workbooks.Count > 1
08.04.2016 20:18:59
ransi
Hallo,
Warum darf denn keine 2 te Datei offen sein ?
ransi

AW: Workbooks.Count > 1
09.04.2016 11:09:58
Hugo
Hoi Ransi
Wenn eine zweite Datei geöffnet wird, kann es passieren das die Anwendung nicht
mehr Ordnungsgemäss geschlossen werden kann. Das heisst nur noch über den Taskmanger.
Das verhindern, dass eine zweite Excel-Datei geöffnet wird, habe ich nur mit Dateien die aus
einem Mail(Outlook) Anhang geöffnet werden. Die Sicherheitsabfrage verhindert, dass der Code greift.
Der Vorschlag von Chris mit OnTime hilft leider nicht weiter. Aber besten Dank für den Tipp.
Hoffe es gibt eine besser Lösung als dem Anwender zu sagen "Du darfst ja nicht ..."
Gruss Hugo

Anzeige
AW: Workbooks.Count > 1
09.04.2016 11:57:24
Arthur
Hallo Hugo.
Meiner Ansicht nach ist der Event Workbook_Deactivate() der falsche Ort. Vlt. klappt es mit einer 'zentralen' WorkbookOpen besser.
Hier ein kleines Kochbuch:
Erstelle ein Klassenmodul 'Klasse1', füge diesen Code hinzu
Public WithEvents EsKannNurEineGeben As Application
Private Sub EsKannNurEineGeben_WorkbookOpen(ByVal Wb As Workbook)
If Workbooks.Count > 1 Then
Debug.Print "eins zuviel -> schließen"
End If
End Sub
Vergiss im Modul 'DieseArbeitmappe' folgendes nicht:
Dim MyClass As New Klasse1
Private Sub Workbook_Open()
Set MyClass.EsKannNurEineGeben = Application
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set MyClass.EsKannNurEineGeben = Nothing
End Sub
Hab's zwar nicht mit OL getestet, gebe dem Ansatz aber eine gute Chance.
Gruß, Arthur.

Anzeige
AW: Workbooks.Count > 1
09.04.2016 12:47:21
Hugo
Hoi Arthur
Besten Dank für deinen Lösungsansatz.
Leider besteht mit dieser Variante das gleiche Problem.
Wenn der Anhang aus dem Outlook geöffnet wird und ich dann "Bearbeiten aktivieren" drücke läuft alles wie es sollte Bei deiner wie bei meiner Variante.
Wenn aber das Kreuz oben rechts gedrückt wird läuft kein Code ab.
Scheint ein schwieriger Fall zu sein aber vielleicht gibt es doch noch eine Lösung.
Gruss Hugo

Anzeige
AW: Workbooks.Count > 1
09.04.2016 16:58:44
Mullit
Hallo,
das Problem ist, daß Du die Application wechselst (Excel >>> Mailprogramm), da wird Dein Deactivate-Event gar nicht erst gefeuert, das wird wohl nur mit dem Api-Timer hinhauen, dazu die Mappe mit dem Code einmal abspeichern, schließen und wieder neu öffnen:
' ********************************************************************** 
' Modul: DieseArbeitsmappe  Typ: Klassenmodul der Arbeitsmappe 
' ********************************************************************** 

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call prcStopTimer
End Sub

Private Sub Workbook_Open()
Call prcStartTimer
End Sub

' ********************************************************************** 
' Modul: Modul1  Typ: Standardmodul 
' ********************************************************************** 

Option Explicit
Option Private Module

Private Declare Function SetTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long, _
     ByVal uElapse As Long, _
     ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long) As Long

Public Sub prcStartTimer()
  Call SetTimer(Application.hwnd, 0&, 100&, AddressOf TimerProc)
End Sub

Public Sub prcStopTimer()
  Call KillTimer(Application.hwnd, 0&)
End Sub

Private Sub TimerProc(ByVal pvlngHwnd As Long, ByVal pvlngnIDEvent As Long, _
     ByVal pvlnguElapse As Long, ByVal pvlnglpTimerFunc As Long)
   Dim wbkBook As Workbook
   If Workbooks.Count > 1 Then
     For Each wbkBook In Workbooks
        If Not wbkBook Is ThisWorkbook Then _
           Call wbkBook.Close(SaveChanges:=False)
     Next
   End If
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit

Anzeige
AW: Workbooks.Count > 1
09.04.2016 20:35:13
Hugo
Hallo Mullit
Besten Dank für deine Hilfe
Aber leider bleibt auch mit diesem Code alles beim Alten.
Wenn ich meine Anwendung offen habe und dann einen Email-Anhang öffne, müsste der Anhang wieder geschlossen werden.
Das passiert aber nur, wenn ich die Sicherheitsmeldung des Anhangs mit Button "Bearbeiten aktivieren" bestätige. Mit dem kann man leben.
Wenn ich im Anhang das Kreuz oben rechts drücke bleibt der Anhang offen (als Ansicht).
Wäre soweit kein Problem, kann ja nochmals das Kreuz für schliessen drücken und ich stehe wieder auf meiner Anwendung
Ich habe aber in meiner Anwendung
die 3 Funktionen oben rechts im Fenster „Standby – Fenstergrösse wechseln – Excel beenden“. Ausgeschaltet (Hat so seine Gründe). Wenn ich nun im offenen Anhang das Kreuz drücke sind die 3 Funktionen auch nicht aktiv und ich kann den Anhang nicht mehr schliessen.
Zur Not muss ich auf das ausblenden der 3 Funktionen verzichten.
Hat aber leider auch so seine Dücken
Darum hoffe ich das es vielleicht doch was Passendes gibt?
Gruss Hugo

Anzeige
AW: Workbooks.Count > 1
09.04.2016 19:02:00
Mullit
Hallo,
oh und da liegt Arthur allerdings doch richtig, das geht auch mit einem Application-Event, dazu ein Klassenmodul einfügen und in clsApplication umbenennen:
' ********************************************************************** 
' Modul: DieseArbeitsmappe  Typ: Klassenmodul der Arbeitsmappe 
' ********************************************************************** 

Private mobjApplicationClass As clsApplication

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set mobjApplicationClass = Nothing
End Sub

Private Sub Workbook_Open()
Set mobjApplicationClass = New clsApplication
End Sub

' ********************************************************************** 
' Modul: clsApplication  Typ: Klassenmodul 
' ********************************************************************** 

Option Explicit

Private WithEvents mobjApplication As Application

Private Sub Class_Initialize()
Set mobjApplication = Application
End Sub

Private Sub Class_Terminate()
Set mobjApplication = Nothing
End Sub

Private Sub mobjApplication_WorkbookOpen(ByVal Wb As Workbook)
If Not Wb Is ThisWorkbook Then _
  Call Wb.Close(SaveChanges:=False)
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit
Anzeige
;
Anzeige

Infobox / Tutorial

Verhindern, dass mehrere Excel-Arbeitsmappen geöffnet werden


Schritt-für-Schritt-Anleitung

Um zu verhindern, dass mehrere Excel-Arbeitsmappen gleichzeitig geöffnet werden, kannst du den folgenden VBA-Code verwenden. Dieser prüft, wie viele Arbeitsmappen aktuell geöffnet sind, und schließt gegebenenfalls zusätzliche Arbeitsmappen.

  1. Öffne die Excel-Arbeitsmappe, in der du den Code einfügen möchtest.

  2. Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Füge den folgenden Code in das Modul DieseArbeitsmappe ein:

    Private Sub Workbook_Open()
       Set MyClass = New Klasse1
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Set MyClass = Nothing
    End Sub
  4. Erstelle ein neues Klassenmodul und benenne es in Klasse1 um. Füge den folgenden Code ein:

    Public WithEvents EsKannNurEineGeben As Application
    
    Private Sub EsKannNurEineGeben_WorkbookOpen(ByVal Wb As Workbook)
       If Workbooks.Count > 1 Then
           Debug.Print "Eine zusätzliche Arbeitsmappe ist geöffnet. Schließe sie."
           Wb.Close SaveChanges:=False
       End If
    End Sub
  5. Speichere deine Arbeitsmappe und schließe den VBA-Editor.


Häufige Fehler und Lösungen

Problem: Der Code funktioniert nicht, wenn eine Datei aus einem E-Mail-Anhang geöffnet wird.

Lösung: Das Öffnen einer Datei aus einem E-Mail-Anhang kann zu einem neuen Instanzproblem führen. Stelle sicher, dass der Code in der richtigen Ereignisprozedur platziert ist, um die Workbook_Open-Ereignisse zu erfassen.

Problem: Der Code wird nicht ausgeführt, wenn die Arbeitsmappe minimiert oder geschlossen wird.

Lösung: Verwende Application.OnTime, um den Timer zu setzen, der regelmäßig den Status der geöffneten Arbeitsmappen überprüft.


Alternative Methoden

Eine alternative Methode ist die Verwendung von API-Funktionen, um das Verhalten von Excel zu steuern. Hier ist ein Beispiel, wie du die Windows-API verwenden kannst:

  1. Füge den folgenden Code in ein Standardmodul ein:

    Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
    
    Public Sub StartTimer()
       SetTimer Application.hwnd, 0, 100, AddressOf TimerProc
    End Sub
    
    Public Sub StopTimer()
       KillTimer Application.hwnd, 0
    End Sub
  2. Implementiere die Timer-Prozedur, um die Arbeitsmappen zu überwachen.


Praktische Beispiele

Hier ist ein einfaches Beispiel für die Implementierung des workbooks.count-Befehls:

Private Sub Workbook_Open()
    If Workbooks.Count > 1 Then
        MsgBox "Bitte schließe alle anderen Arbeitsmappen.", vbExclamation
        Workbooks(2).Close SaveChanges:=False
    End If
End Sub

Mit diesem Code wird beim Öffnen der Arbeitsmappe überprüft, ob mehr als eine Arbeitsmappe geöffnet ist. Falls ja, wird eine Warnmeldung angezeigt und die zweite Arbeitsmappe wird geschlossen.


Tipps für Profis

  • Verwende vba workbooks.count in Kombination mit If...Then-Anweisungen, um präzise Steuerungen zu implementieren.
  • Denke daran, dass workbooks.count eine einfache und effektive Methode ist, um die Anzahl der geöffneten Arbeitsmappen zu ermitteln.
  • Du kannst auch benutzerdefinierte Funktionen erstellen, um spezifische Anforderungen zu erfüllen, beispielsweise das Zählen bestimmter Arbeitsblätter in einer Arbeitsmappe.

FAQ: Häufige Fragen

1. Frage: Warum funktioniert mein workbooks.count-Code nicht bei einem E-Mail-Anhang?
Antwort: Der Code wird nicht ausgeführt, wenn die Datei aus einem E-Mail-Anhang geöffnet wird, da dies als neue Instanz betrachtet wird. Überprüfe, ob dein Code im richtigen Ereignis platziert ist.

2. Frage: Wie kann ich sicherstellen, dass alle Arbeitsmappen außer der aktuellen geschlossen werden?
Antwort: Implementiere eine Schleife in deinem Code, die alle geöffneten Arbeitsmappen durchläuft und nur die aktuelle Arbeitsmappe offen lässt.

3. Frage: Welche Excel-Version benötige ich für diese VBA-Codes?
Antwort: Der Code wurde in Excel 2010 getestet, sollte aber auch in neueren Versionen funktionieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige