Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1608to1612
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datei in jedem fall Schreibgeschützt öffnen

Datei in jedem fall Schreibgeschützt öffnen
20.02.2018 08:59:41
Markus
Hallo an alle
Ich hab wiedermal ein kleines Problem: Hoffentlich kann mir da jemand weiterhelfen. Ich kopiere Daten von einem Tabellenblatt aus einer Mappe mit Daten (die auf einem Server liegt) unter einem bestimmten Filter Kriterium, das der Benutzer in der Ziel Mappe über ein Auswahl Feld auswählen kann in diese hineinkopiert. Das funktioniert auch im Grunde.
Aber: Im Moment verwende ich eine Funktion die ich von der Microsoft Seite hab die prüfen sollte ob die Mappe schon offen ist. Ich hatte die Funktion leider missverstanden, denn sie Prüft nicht nur ob ICH die Mappe offen habe. Sondern auch ob jemand grundsätzlich gerade über den Server darauf zugreift. Wenn das der fall ist dann kommt ein Fehler. Wenn ich selbst es bin dann nicht aber es wird die Mappe genutzt die ich grad offen habe und das will ich nicht.
Ich will aber das die Mappe mit den Daten in jedem fall schreibgeschützt geöffnet wird, mein Kopiercode ausgeführt wird und die Mappe dann wider geschlossen unabhängig ob sie jemand offen hat. Also auch wenn ich selbst sie offen hab soll sie in einer zweiten Instanz Schreibgeschützt geöffnet werden und dann wider geschlossen.
Hat Jemand zufälligerweise so eine Funktion an die man dann den Pfad der datrei übergeben kann?
Das ist die Funktion die ich derzeit verwende:

Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
On Error Resume Next   ' Schaltet die Fehlerprüfung aus.
filenum = FreeFile()   ' Erhalte eine freien Dateinummer.
' Versuchen Sie, die Datei zu öffnen und sie zu sperren.
Open filename For Input Lock Read As #filenum
Close filenum          ' Schließen Sie die Datei.
errnum = Err           ' Speichern Sie die aufgetretene Fehlernummer.
On Error GoTo 0        ' Schalten Sie die Fehlerprüfung erneut ein.
' Überprüfen Sie, welcher Fehler aufgetreten ist.
Select Case errnum
' Es ist kein Fehler aufgetreten.
' Datei ist NICHT bereits von einem anderen Benutzer geöffnet.
Case 0
IsFileOpen = False
' Fehlernummer für "Zugriff verweigert"
' Die Datei wurde bereits von einem anderen Benutzer geöffnet.
Case 70
IsFileOpen = True
' Ein weiterer Fehler ist aufgetreten.
Case Else
Error errnum
End Select
End Function

Vielen Dank für eure Hilfe
Beste Grüße
Markus

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei in jedem fall Schreibgeschützt öffnen
20.02.2018 09:08:35
Markus
PS: Das wäre noch der Code Teil den ich zum Kopieren verwende. in dem ich die Funktion dann Nutze

If IsFileOpen(Pfad) Then
Set wksVerzeichnis = WorkbooksWorkbooks("Daten.xlsm").Worksheets("Infos")
With wksVerzeichnis
.AutoFilter.ShowAllData
.UsedRange.AutoFilter Field:=strFilter, Criteria1:=strKriterium
.UsedRange.SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.ActiveSheet.Range(" _
A1")
'.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp              'Lö _
scht Kopierte zeilen aus Quelltabellenblatt
.AutoFilter.ShowAllData
End With
Else
Workbooks.Open filename:=Pfad, ReadOnly:=True
Set wksVerzeichnis = Workbooks("Daten.xlsm").Worksheets("Infos")
With wksVerzeichnis
.AutoFilter.ShowAllData
.UsedRange.AutoFilter Field:=strFilter, Criteria1:=strKriterium                  _
'Zuweisen der Filter Nr und des Kriteriums
.UsedRange.SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.ActiveSheet.Range(" _
A1")  'Kopieren der Daten
'.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp              'Lö _
scht Kopierte zeilen aus Quelltabellenblatt
ActiveWindow.Close SaveChanges:=False
End With
End If
Reicht da der teil damit es verständlicher wird oder soll ich den ganzen Code reinstellen? Wollt nicht das es unübersichtlich wird. Weis jemand vielleicht wie ich da noch ein zweites Optionales Filter Kriterium reinbekomme?
Grüße
Markus
Anzeige
AW: Datei in jedem fall Schreibgeschützt öffnen
20.02.2018 09:50:17
ChrisL
Hi Markus
Dann lass die Prüfung "If IsFileOpen" einfach weg und verwende nur den Teil nach "Else"
        Workbooks.Open filename:=Pfad, ReadOnly:=True
Set wksVerzeichnis = Workbooks("Daten.xlsm").Worksheets("Infos")
With wksVerzeichnis
.AutoFilter.ShowAllData
.UsedRange.AutoFilter Field:=strFilter, Criteria1:=strKriterium                  _
_
'Zuweisen der Filter Nr und des Kriteriums
.UsedRange.SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.ActiveSheet.Range(" _
_
A1")  'Kopieren der Daten
'.SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp              'Lö  _
_
scht Kopierte zeilen aus Quelltabellenblatt
ActiveWindow.Close SaveChanges:=False
End With

Zu Frage zwei, in etwa so...
If strKriterium2 = "" Then
.UsedRange.AutoFilter Field:=strFilter, Criteria1:=strKriterium
Else
.UsedRange.AutoFilter Field:=strFilter, Criteria1:=strKriterium, Criteria2:=strKriterium2
End If
cu
Chris
Anzeige
AW: Datei in jedem fall Schreibgeschützt öffnen
21.02.2018 05:33:44
Markus
Hallo
Danke für die Antwort. Ich war echt von Anfang an überzeugt das es ohne eine Prüfung, einen Fehler geben wird. Deswegen hatte ich es gar nicht erst so ausprobiert. Aber ich hab mich durchgetestet, und es geht.
Das einzige problematische ist jetzt noch, wenn die Quelldatei offen ist und ich in der Ziel Datei das Makro auslöse.
Dann bekomme ich die Meldung das die Quelldatei bereits geöffnet ist und ich hab zur Auswahl entweder nicht öffnen oder öffnen allerdings gehen dann die eingegebenen Daten verloren (wenn welche eingegeben wurden). Das heißt, ich müsste jedes Mal vorher Speichern und zumachen oder zumindest speichern und das neu öffnen der Datei bestätigen. Ich Weiß nicht ob das eine Standardeinstellung ist oder vom System Admin so festgelegt wurde, das eine Datei nicht in zwei Instanzen existieren kann. Hast du da vielleicht einen Vorschlag ich würde gern den zu diesem zeitpunkt bestehenden Speicherstand kopieren ohne die datei speichern7Schliesen zu müssen?
Frage 2 hat sich erledigt. Vielen Dank
Grüße
Markus
Anzeige
AW: Datei in jedem fall Schreibgeschützt öffnen
21.02.2018 11:24:51
ChrisL
Hi Markus
Ich dachte ReadOnly reicht, aber du hast recht. Die Datei muss in neuer Instanz geöffnet werden.
Sub Makro1()
With CreateObject("Excel.Application")
.Workbooks.Open Filename:="C:\Pfad\Mappe1.xlsm", ReadOnly:=True
.Visible = True
End With
End Sub
cu
Chris
AW: Datei in jedem fall Schreibgeschützt öffnen
24.02.2018 15:22:55
Markus
Hallo
ich hab leider einpaar Probleme bei der Umsetzung ich bekomm einen Fehler "Aktiv x Element konnte nicht kopiert werden" liegt das daran das ich die Variable "wksVerzeichnis" als Worksheet deklariert hab ? wenn ja wie muss ich sie deklarieren.
Mein zweites Problem ist (sobald der Fehler beseitigt ist): wenn die Quell Mappe bereits offen ist wenn der Code ausgeführt wird, wird sie ja schreibgeschütz in einer neuen Instanz geöffnet. Was ja auch so sein soll und es soll die Meldung das bereits eine Mappe mit dem selben Namen geöffnet ist, nicht kommen. Aber dann müsste auch nur diese zweite Instanz geschlossen werden und die erste Mappe die die ganze Zeit offen war davon unbehelligt und verändert weiter offen bleiben.
Sozusagen das der letzte Speicherstand übertragen wird aber sollte gerade in der Mappe gearbeitet werden dann wird das ungesicherte nicht übertragen. Ich würde je überhaupt gerne noch Daten aus einem anderen Tabellenblatt in der selben Quell Mappe auch nach einem Kriterium filtern und sagen wir drei Zeilen abstand noch dazu kopieren aber ich will es hier jetzt nicht übertreiben
Das ist der Ganze Code zwecks besseren Überblick
Private Sub Aktualisieren_Daten1()
'Aktualisieren von Daten eines Tabellenblattes durch Kopieren
Dim Pfad As String                      'Pfad (Datenquelle)
Dim wksVerzeichnis As Worksheet         'Arbeitsmappe (Datenquelle)
Dim strKriterium As String              'Filter Nr. (Tab1)
Dim strFilter As String                 'Filter Kriterium (Datenquelle)
Dim lngLetzteZeile As Integer           'Letzte Zeile
' Festlegen der Kriterien zum Filtern
On Error GoTo Fehler2
strFilter = "1"                                                     'Nummer des Filters in  _
der Spalte des Filterkriteriums
strKriterium = ThisWorkbook.Worksheets("Meldung").Range("L1").Value 'Auslesen des  _
Filterkriteriums aus Tab1
If strKriterium = "?" Then GoTo Fehler                             'Abbruch bei unzulä _
ssigem Filterkriterium
Pfad = "Z:\Pfad\Daten.xlsm" 'Pfad zu Quelldatei
' Vorarbeiten
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
With ThisWorkbook.Worksheets("Info")
lngLetzteZeile = .UsedRange.Row + .UsedRange.Rows.Count + 1 'Letzte benutzte Zeile  _
ermitteln
If lngLetzteZeile  0 Then
MsgBox Err.Description, vbCritical, Err.Number
MsgBox "Nicht Aktualisiert", vbExclamation
End If
End Sub

Danke für die Hilfe
Grüße Markus
Anzeige
AW: Datei in jedem fall Schreibgeschützt öffnen
25.02.2018 17:11:31
Markus
Hallo
Bitte ignoriert den vorhergehenden Beitrag, er war nicht verständlich genug.
Also nachdem ich mich heute den ganzen Tag in das Thema eingelesen hab befürchte ich das ich es alleine nicht hinbekommen werde.
Vielleicht hat jemand hier einen derartigen Code. Um nicht unnötig System Ressourcen zu verbrauchen müsste zuerst ermittelt werden ob die Datei schon offen ist wenn NEIN dann den Normalen Code ausführen:

Workbooks.Open filename:=Pfad, ReadOnly:=True
Set wksDatenQuelle = Workbooks("DatenQuelle.xlsm").Worksheets("Info")
With wksDatenQuelle
.AutoFilter.ShowAllData
.UsedRange.AutoFilter Field:="1", Criteria1:="2"
.UsedRange.SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.ActiveSheet.Range(" _
A1")
ActiveWindow.Close SaveChanges:=False
End With

Aber das Problem fängt an wenn die Mappe mit den zu Kopierenden Daten schon offen ist, denn dann müsste die Mappe mit der DatenQuelle in einer Neuen Excel Instanz geöffnet werden. Nur so kann ich gewährleisten das die Mappe vom Programm immer Schreibgeschützt geöffnet wird.
Dann hab ich allerdings 2 Excel Instanzen offen und in diesen sind dann verschiedene Mappen offen.
  • Instanz 1 hat dann mindestens: "QuellDaten.xslm" und "Zielmappe.xlsm" geöffnet.

  • Instanz 2 hat dann nochmal "QuellDaten.xslm" (Schreibgeschützt) geöffnet.

  • Jetzt müssten die Daten aus Excel Instanz 2 "QuellDaten.xslm" in Excel Instanz 1 "Zielmappe.xlsm" kopiert werden.
    Dann müsste Excel Instanz 2 "QuellDaten.xslm" geschlossen werden und die Instanz 2 beendet und excel Instanz 1 bleibt offen.
    Sollten zu diesem Zeitpunkt irgendwelche anderen Instanzen von excel offen sein dann bleiben die auch offen.
    Mein Hauptproblem ist wie stell ich am sichersten fest ob die Datei offen ist und wie viele Instanzen gerade offen sind und wie unterscheide ich die Instanzen von einander und wie spreche ich sie an bzw schließe die eine neu erstellte wider.
    Grüße
    Markus
    Anzeige
    AW: Datei in jedem fall Schreibgeschützt öffnen
    25.02.2018 18:34:39
    Markus
    Ich hab noch eine testdatei erstellte mit dem was ich bis jetzt zusammengebracht hab. Der Code Kopiert aber wenn die Datei bereits offen ist dann erzielt er je nach Excel Version entweder das die offene Datei durch eine schreibgestützte Version ersetzt und der umgespeicherte stand geht verloren oder es kommt vorher noch eine Meldung in der man drauf hingewiesen wird das bereits eine Instanz offen ist.
    https://www.herber.de/bbs/user/120049.xlsm
    https://www.herber.de/bbs/user/120050.xlsm
    Grüße Markus
    Anzeige

    155 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige