Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1616to1620
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

xlsx - Dateisicherheitswarnung und Funktionsaufruf

xlsx - Dateisicherheitswarnung und Funktionsaufruf
03.04.2018 11:43:18
Markus
Hallo Community,
Folgendes Problem liegt bei mir vor:
Ich habe eine Funktion gefunden, diese hier, die prüft ob eine Arbeitsmappe Makros
oder nicht, diese hatte ich unter Module geschrieben und Public gesetzt:
Public Function HasMakros(wkb As Workbook) As Boolean
'prüft, ob Standardmodule vorhanden sind
'benötigt Verweis auf
'Microsoft Visual Basic for Applications Extensibility 5.3
'Visual Basic for Applications
Dim VB As VBComponents, VBC As VBComponent
Set VB = wkb.VBProject.VBComponents
For Each VBC In VB
If VBC.Type = 1 Then
HasMakros = True
Exit Function
End If
Next VBC
HasMakros = False
End Function

Diese Funktion möchte ich unter „Diese Arbeitsmappe“ aufrufen und zwar so in der Art:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
On Error Resume Next
If HasMakros() = True  Then
Application.OnTime EarliestTime:=DaEt, Procedure:="Zeitmakro", Schedule:=False
Application.DisplayAlerts = True
End If
Else
MsgBox "Keine Makros vorhanden"
End Sub

Das Problem ist das er meint die Argumente seien nicht Optional bei dieser Zeile, wo ich die Funktion aufrufen möchte, da fehlt irgendetwas glaube ich nur was?
If HasMakros() = True Then
Es war so gedacht, das er prüft ob eine Arbeitsmappe Makros enthält oder nicht.
Wenn ja soll er das Application.OnTime ausführen, wenn nicht also eine xlsx-Datei, dann soll er nichts ausführen.
Dabei kommt aber mein zweites Problem zu Stande, denn wenn es eine xlsx-Datei ist, kommt immer noch diese Meldung hier:
„Datensicherheitswarnung: Dieses Dokument enthält Makros, Active-X- Steuerelemente, XML – Erweiterungspaketinformationen oder Webkomponenten. Diese enthalten möglicherweise persönliche Informationen, die durch den Dokumenteninspektor nicht entfernt werden können.“
Mir ist klar das er diese Meldung bringt, weil er versucht eine xlsx-Datei mit Makros zu speichern, was er aber gar nicht soll, er soll sie einfach so speichern, das reicht mir schon. Von daher gibt es eine Möglichkeit das diese Meldung nicht mehr erscheint, also das man diese wegbekommt? Ich mein er macht ja da was er soll, nur diese Meldung davor müßte noch weg, da die jedesmal kommt.
Zusammenfassend: Hintergrund des ganzen war halt, das er erkennen soll ob Datei Makros enthält , wenn ja das Application on Time noch ausführt und dann speichert und wenn nein, diese Datei einfach als xlsx-Datei abspeichert ohne diese Dateisicherheitswarnung, die einfach weg sollte.
Kann jemand bitte helfen?
Beste Grüße
Marcus

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
wo ist der Sinn?
03.04.2018 12:58:29
Rudi
Hallo,
1. z.B. If HasMakros(ActiveWorkbook) = True Then
2. Die Function prüft nur ob Standardmodule vorhanden sind.
Gruß
Rudi
AW: wo ist der Sinn?
03.04.2018 13:59:49
Markus
Hallo Rudi,
danke erstmal für Deine Hilfe, also das mit dem AcriveWorkbook hat funktioniert, somit meckert er nicht mehr über die Argumente die nicht optional sein sollen. Ist schon merkwürdig das er das braucht.
Zu der Funktion, die sollte halt nur prüfen ob es eine xlsx Arbeitsmappe ist die geschlossen wird oder eine xlsm Arbeitsmappe, aber diese kann ich so eh nicht verwenden, näheres weiter unten.
Zum Sinn:
Ist es eine xlsm Arbeitsmappe, dann sollte das Application On Time ausgeführt werden, dort kommt kein Fehler und auch keine Dateisicherheitswarnung, weil ja mit Makros gespeichert wird.
Handelt es sich hingegen um eine xlsx Arbeitsmappe kommt da eine Fehlermeldung hinzu, weil diese ja mit Makros nicht umgehen kann und somit dieses Application On Time einen Fehler verursacht, daher ja die Prüfung ob es eine xlsm-Mappe ist oder eine xlsx-Mappe.
Doch diese Funktion kann ich gar nicht nehmen da ich in einer xlsx-Mappe diesen Verweis "Microsoft Visual Basic for Applications Extensibility 5.3" den es braucht nicht abspeichern kann. Daher bräuchte ich eine Funktion die erkennt ob es sich um eine Mappe mit oder ohne Makros handelt und wo keine Extra Verweise noch gesetzt werden müssten.
Das zweite Problem ist halt diese Datensicherheitswarnungsmeldung beim schließen der xlsx-Datei, die einfach nicht erscheinen soll, wie bekommt man diese weg? Den Makroinhalt soll er ja gar nicht speichern in dem Fall, dafür wäre ja dann die xlsm-Datei da, er soll die Datei xlsx nur schließen, aber ohne das dieses Datensicherheitswarnungsfenster erscheint.
Beste Grüße
Markus
Anzeige
AW: wo ist der Sinn?
03.04.2018 17:47:19
Markus
Jetzt verstehe ich, das was in Klammern steht bei der Funktion braucht er im Aufruf mit, das war mir so nicht klar, daher der Argumentefehler.
Danke onur.
Bei meinem Problem hilft mir das aber nicht weiter, weil ich die Funktion ja nicht verwenden kann wie ich schrieb und diese Sicherheitsmeldung beim schließen der xlsx-Datei noch immer da ist.
Beste Grüße
Markus
AW: wo ist der Sinn?
03.04.2018 18:00:31
onur
Was ICH aber nicht verstehe ist Folgendes:
Wenn du diese Datei mit deinem gewünschten Makro als .xlsx speicherst, löschst du damit auch das Makro - und dann?
AW: wo ist der Sinn?
03.04.2018 18:13:52
onur
Versuche es so:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
SaveAsUI = True
Application.DisplayAlerts = False
End Sub

Wie gesagt, dann löschst du das Makro jedesmal und musst es neu schreiben oder du hast ständig von der datei eine .xlsm- und eine .xlsx-Version auf der Platte (?).
Anzeige
AW: wo ist der Sinn?
03.04.2018 18:21:31
onur
Ebensowenig verstehe ich, warum eine Datei MIT Makro überprüfen muß, ob sie ein Makro hat?
AW: wo ist der Sinn?
04.04.2018 10:18:12
Markus
Hallo onur,
ja das hast Du richtig erkannt, in dem Fall brauche ich die Makros in der xlsx Datei nicht mehr nur die angelegten Tabellen.
Ich versuchs mal ausführlicher zu erklären:
Zuerst wird eine xlsx Datei geöffnet, diese wird in eine xlsm Datei umgewandelt gespeichert. Beim Export funktioniert alles bestens für die xlsm Datei. Da also keine Probleme.
Es ist dann aber so, wenn eine leere Mappe als xlsx Datei erkannt wird beim öffnen oder eine xlsx Datei wo ein bestimmtes Sheet fehlt, wird dieses angelegt und dann als xlsx Datei gespeichert. Diese wird dann mit den neuen Sheets die geadded wurden per hand gefüllt mit verschiedensten Daten und kann dann wieder ganz normal aufgerufen und als xlsm Datei Export und gespeichert werden.
Das Problem was nun besteht ist diese „Application.OnTime“ was wenn die Datei mit den neu hinzugefügten Sheets als xlsx gespeichert wird einen Fehler 1004 verursacht, weil es halt keine Makrodatei ist, vermute ich mal. Diese Makros brauche ich ja auch nicht in der xlsx Datei, die werden später dann beim neu einlesen wieder eingefügt, sondern ich brauche nur das Speichern der neuen Tabellenblätter das soll erfolgen, damit diese modifizierte xlsx Datei dann neu eingelesen werden kann und als xlsm Datei gespeichert wird, wo sie wieder alle Makroinhalte dann erhält.
Es geht mir darum diesen Fehler bei der xlsx Datei nicht auftreten zu lassen, der aber auftritt, wenn er die Prozedure in der „Diese Arbeitsmappe“ Before Close, ausführt, also das er erkennt ob es sich um eine xlsm Datei oder eine xlsx Datei handelt. Würde er das erkennen (die Funktion fehlt halt noch) das es sich um eine xlsm Datei handelt, dann erkennt er das Application On Time und es kommen keine Fehlermeldungen. Ich wollte aber das er das unterscheiden kann, also das er erkennt wenn eine xlsx Datei erkannt wird, das diese dann nur gespeichert wird mit den Tabellenblättern die angelegt wurden, ohne aber sämtliche Makroinhalte, nur da kommen halt die zwei Fehler immer, bei dem Dateityp: einmal dieser Laufzeitfehler 1004: „Die Methode OnTime für das Objekt Application ist fehlgeschlagen und dann halt diese Dateisicherheitswarnung (beides halt bei der xlsx Datei).
Zusammenfassend: Ich benötige eine Prozedure oder Funktion die ohne Verweise auskommt (kann ich bei der xlsx Datei nicht setzen, wenn er eine leere Mappe aufruft), für die Erkennung ob eine xlsm Datei oder xlsx Datei und eine Möglichkeit wie er nach dem Export speichert ohne das diese Dateisicherheitswarnung bei der xlsx Datei auftritt. Das dann in dem Fall der Makroinhalt verloren geht stört mich nicht, nur er soll halt bloß die angefügten Tabellenblätter speichern.
Diese Unterscheidungsfunktion ist halt wichtig damit er erkennt um was für eine Art Typ von Datei (mit oder ohne Makros es sich handelt). Handelt es sich um eine xlsx Datei (ohne Makros), dann lasse ich beim export diese Application On Time Prozedure weg (if und else) und ist es eine xlsm Datei, dann möchte ich das er sie ausführt, was er ja bei der xlsm Datei macht. Es geht mal halt darum das er erkennt ob mit oder ohne Makro und wenn ohne Makro, das er nur die Tabellenblätter speichert, aber ohne das jedesmal noch diese Dateisicherheitswarnung auftritt, da nach dem Export ja noch die Module da sind, die er aber in dem Fall ruhig verlieren kann für die xlsx Datei, nur die neu hinzugefügten Tabellenblätter halt nicht.
Deine Before Save Prozedure habe ich mit in diese Arbeitsmappe eingebaut, doch beim schließen der xlsx Datei hat er immer noch diese zwei Meldungen 1004 und Dateisicherheitswarnung.
Hoffe kannst es jetzt besser nachvollziehen.
Beste Grüße
Markus
Anzeige
AW: wo ist der Sinn?
04.04.2018 10:20:25
Markus
Anmerkung: Hatte den Hacken vergessen, das der Thread weiter bei den offenen Fragen erscheint, daher nochmal gesendet.
Hallo onur,
ja das hast Du richtig erkannt, in dem Fall brauche ich die Makros in der xlsx Datei nicht mehr nur die angelegten Tabellen.
Ich versuchs mal ausführlicher zu erklären:
Zuerst wird eine xlsx Datei geöffnet, diese wird in eine xlsm Datei umgewandelt gespeichert. Beim Export funktioniert alles bestens für die xlsm Datei. Da also keine Probleme.
Es ist dann aber so, wenn eine leere Mappe als xlsx Datei erkannt wird beim öffnen oder eine xlsx Datei wo ein bestimmtes Sheet fehlt, wird dieses angelegt und dann als xlsx Datei gespeichert. Diese wird dann mit den neuen Sheets die geadded wurden per hand gefüllt mit verschiedensten Daten und kann dann wieder ganz normal aufgerufen und als xlsm Datei Export und gespeichert werden.
Das Problem was nun besteht ist diese „Application.OnTime“ was wenn die Datei mit den neu hinzugefügten Sheets als xlsx gespeichert wird einen Fehler 1004 verursacht, weil es halt keine Makrodatei ist, vermute ich mal. Diese Makros brauche ich ja auch nicht in der xlsx Datei, die werden später dann beim neu einlesen wieder eingefügt, sondern ich brauche nur das Speichern der neuen Tabellenblätter das soll erfolgen, damit diese modifizierte xlsx Datei dann neu eingelesen werden kann und als xlsm Datei gespeichert wird, wo sie wieder alle Makroinhalte dann erhält.
Es geht mir darum diesen Fehler bei der xlsx Datei nicht auftreten zu lassen, der aber auftritt, wenn er die Prozedure in der „Diese Arbeitsmappe“ Before Close, ausführt, also das er erkennt ob es sich um eine xlsm Datei oder eine xlsx Datei handelt. Würde er das erkennen (die Funktion fehlt halt noch) das es sich um eine xlsm Datei handelt, dann erkennt er das Application On Time und es kommen keine Fehlermeldungen. Ich wollte aber das er das unterscheiden kann, also das er erkennt wenn eine xlsx Datei erkannt wird, das diese dann nur gespeichert wird mit den Tabellenblättern die angelegt wurden, ohne aber sämtliche Makroinhalte, nur da kommen halt die zwei Fehler immer, bei dem Dateityp: einmal dieser Laufzeitfehler 1004: „Die Methode OnTime für das Objekt Application ist fehlgeschlagen und dann halt diese Dateisicherheitswarnung (beides halt bei der xlsx Datei).
Zusammenfassend: Ich benötige eine Prozedure oder Funktion die ohne Verweise auskommt (kann ich bei der xlsx Datei nicht setzen, wenn er eine leere Mappe aufruft), für die Erkennung ob eine xlsm Datei oder xlsx Datei und eine Möglichkeit wie er nach dem Export speichert ohne das diese Dateisicherheitswarnung bei der xlsx Datei auftritt. Das dann in dem Fall der Makroinhalt verloren geht stört mich nicht, nur er soll halt bloß die angefügten Tabellenblätter speichern.
Diese Unterscheidungsfunktion ist halt wichtig damit er erkennt um was für eine Art Typ von Datei (mit oder ohne Makros es sich handelt). Handelt es sich um eine xlsx Datei (ohne Makros), dann lasse ich beim export diese Application On Time Prozedure weg (if und else) und ist es eine xlsm Datei, dann möchte ich das er sie ausführt, was er ja bei der xlsm Datei macht. Es geht mal halt darum das er erkennt ob mit oder ohne Makro und wenn ohne Makro, das er nur die Tabellenblätter speichert, aber ohne das jedesmal noch diese Dateisicherheitswarnung auftritt, da nach dem Export ja noch die Module da sind, die er aber in dem Fall ruhig verlieren kann für die xlsx Datei, nur die neu hinzugefügten Tabellenblätter halt nicht.
Deine Before Save Prozedure habe ich mit in diese Arbeitsmappe eingebaut, doch beim schließen der xlsx Datei hat er immer noch diese zwei Meldungen 1004 und Dateisicherheitswarnung.
Hoffe kannst es jetzt besser nachvollziehen.
Beste Grüße
Markus
Anzeige
AW: wo ist der Sinn?
04.04.2018 12:20:07
Zwenn
Hallo Markus,
  • Wie kommen denn die Makros in eine XLSX Datei?

  • Wenn Du wissen willst, ob es eine XLSM oder XLSX Datei ist, prüf die Dateiendung und lass das ganze andere Brimborium weg.

  • Ich finde Dein ganzes Problem nicht nachvollziehbar. Denn in einer XLSX Datei sind 'von Natur aus' keine Makros, ausser man fügt welche ein, nachdem die Datei geöffnet wurde. Aber welchen Sinn soll das haben? Wenn Du die Datei als XLSM abspeichern willst, dann füge die Makros doch nach diesem Schritt ein.
    Ohne böse klingen zu wollen, aber nachdem Du nicht verstanden hast, was ein Funktionsparameter ist, der nicht optional sein darf, obwohl Du selber den Quelltext der Funktion gepostet hast, aus dem das sofort ersichtlich ist, habe ich den Eindruck, Du weißt eigentlich gar nicht so genau, was Du da machst. Ich denke, Du hast einen Lösungsweg im Sinn, der um einen grundsätzlichen Fehler in Deinem Vorhgehen rum arbeitet.
    Ergo: Überdenke Deinen Lösungsweg. Was sind Deine Startbedingungen und was willst Du eigentlich erreichen?
    Viele Grüße,
    Zwenn
    Anzeige
    AW: wo ist der Sinn?
    04.04.2018 16:35:49
    Markus
    Hallo Zwenn,
    danke erstmal für Deine Antwort. :)
    zu Deiner Frage: Die Makros kommen durch den Export in die xlsx Datei. Normalerweise wird von xlsx in xlsm gespeichert und dann exportiert, aber wenn eine leere Mappe gewählt wird oder eine Datei wo ein wichtiges Arbeitsblatt fehlt, moechte ich nach dem Export die Datei als xlsx Datei belassen. Es werden nur Tabellenblätter eingefügt und danach kann die xlsx Datei händisch bearbeitet werden bis sie schließlich dann erneut eingelesen werden kann und dann auch richtig als xlsm Datei gespeichert wird.
    Genauso eine Dateiendungsprüfung ob es sich um xlsm oder xlsx handelt bräuchte ich, kannst Du mir da eine basteln bitte?
    Soweit funktioniert ja alles nur um den Fehler 1004 wegzubekommen, bräuchte ich halt so eine Dateiendungsunterscheidung, das er bei xlsx Dateien gar nicht diese Application OnTime Prozedure nehmen soll, sondern nur bei xlsm Dateien, wo es ja schon funktioniert.
    Zum anderen soll halt diese Dateisicherheitshinweiswarnung gar nicht erscheinen, wenn die xlsx Datei geschlossen wird, die Makros darin verworfen, sondern nur die hinzugefügten Tabellenblätter sollen noch abgespeichert werden.
    Zusammengefaßt:
    Bräuchte eine Funktion bzw. Prozedure die auf die Dateiendung *.xlsx oder xlsm prüft, wo man aber keine Verweise noch auf Libarys setzen muss, das bevor er die Datei schließt er erkennt, wann er die Application On Time Funktion benutzen soll und wann nicht anhand der Erkennung ob Datei Makros enthält oder halt nicht. Ich wollte das wenn die Funktion bzw. Prozedure dazu vorhanden ist über if und else machen. (siehe mein erster Post hierzu ganz oben)
    Zum zweiten soll die Dateisicherheitswarnung beim schließen der xlsx - Datei verschwinden.
    Diese lautet immer: Dieses Dokument enthaelt Makros, Active-X- Steuerelemente, XML- Erweiterungspaketinformationen oder Webkomponenten. Diese enthalten moeglicherweise persoenliche Informationen, die durch den Dokumenteninspektor nicht entfernt werden koennen. Er schließt und speichert richtig, aber immer kommt erst diese Warnung, die wollte ich wegbekommen
    Hoffe jemand kann helfen.
    Beste Grüße
    Markus
    Anzeige
    AW: xlsx - Dateisicherheitswarnung und Funktionsaufruf
    03.04.2018 17:34:08
    onur
    "somit meckert er nicht mehr über die Argumente die nicht optional sein sollen. Ist schon merkwürdig das er das braucht." Hast du dir die Funktion mal angesehen?
    Public Function HasMakros(wkb As Workbook) As Boolean
    

    AW: xlsx - Dateisicherheitswarnung und Funktionsaufruf
    06.04.2018 09:44:23
    Markus
    Weiß keiner mehr Rat wie man diese Dateisicherheitsmeldung ausblenden kann und die Dateien nach ihren Endungen (xlsm und xlsx) identifiziert?
    Hänge immernoch an diesem Problem.
    Beste Grüße
    Markus
    AW: xlsx - Dateisicherheitswarnung und Funktionsaufruf
    06.04.2018 09:45:00
    Markus
    Weiß keiner mehr Rat wie man diese Dateisicherheitsmeldung ausblenden kann und die Dateien nach ihren Endungen (xlsm und xlsx) identifiziert?
    Hänge immernoch an diesem Problem.
    Beste Grüße
    Markus
    Anzeige
    AW: xlsx - Dateisicherheitswarnung und Funktionsaufruf
    06.04.2018 22:07:24
    Zwenn
    Hallo Markus,
    wieder ohne böse klingen zu wollen, aber Du bekommst hier vermutlich keine Hilfe, weil jeder sicher ist, das wird eine "Never Ending Story". Wenn Du nun erfährst, wie Du die Dateiendung von einem Dateinamen abtrennst, wird mit ziemlicher Sicherheit die nächste Frage kommen, weil Du nicht weißt, wie Du das einbauen sollst.
    Das folgende Makro zeigt Dir die Dateiendung der Datei an, in der Du das Makro startest. Wurde die Datei noch nicht gespeichert, gibt es keine Dateiendung und dann wird dieser Hinweis statt einer Dateiendung ausgegeben.
    
    Sub dateiEndungHolen()
    Dim dateiName As String
    Dim dateiEndung As String
    dateiName = ActiveWorkbook.Name
    If InStr(1, dateiName, ".") > 0 Then
    dateiEndung = Mid(dateiName, InStrRev(dateiName, ".", -1) + 1)
    MsgBox dateiEndung
    Else
    MsgBox "Datei wurde noch nicht gespeichert. Keine Dateiendung vorhanden"
    End If
    End Sub
    

    Viele Grüße,
    Zwenn
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige