SaveAs über VBA macht bei BeforeSave Probleme
norman
ich habe ein wirklich kniffeliges Problem, das bereits hier mal angegangen wurde (https://www.herber.de/forum/archiv/1144to1148/t1147360.htm und https://www.herber.de/forum/archiv/1144to1148/t1145651.htm, vielen Dank an dieser Stelle an Tino, entschuldige bitte, dass ich damals da nicht weiter gemacht hatte, ich war an einem anderen Projekt, aber vielleicht kommen wir da ja jetzt weiter :)).
Folgendes will ich schaffen: Ich habe eine XLA die über startup geladen wird. Jede Datei die gespeichert wird soll in einer zentralen Datenbank als Datensatz eingetragen werden. Den Dateinamen habe ich natürlich erst nach dem Speichern. Das habe ich bereits alles hinbekommen. Erschwerend kommt hinzu, dass jede Datei mit der Datensatz-ID versehen werden muss (lege ich in der ExcelDatei ab). Ich habe also in BeforeSave das komplette "Datei-speichern-unter-Handling" eingebaut. Damit wird der Dateiname ermittelt, damit ich diesen im Datensatz speichern kann. Dann wird die ID in der ExcelDatei gesetzt und die Datei gespeichert. Dadurch erkenne ich auch bei einer verschobenen oder umbenannten Datei, wo sie ursprünglich her kommt. Wie gesagt, das klappt alles.
Jetzt aber mein Problem: Es gibt ExcelDateien, die nutzen im VBA-Code SaveAs. Damit ist der Dateiname ja beim Speichern für Excel bekannt, leider ist er aber nicht ermittelbar in BeforeSave, da BeforeSave ja nicht weiß, ob der User per Menü gespeichert hat oder VBA den Aufruf tätigt. Ihr könnt Euch vorstellen was passiert? Richtig, ich frage den User in meiner Routine nach dem Dateinamen, was natürlich zu Verwirrung führt, denn der wurde ja im VBA-Code mit angegeben!
Tino hat hier schon einen timerbasierten Ansatz vorgeschlagen, in dem eine Klasse einfach wartet, bis die Datei .Saved ist. Das ist ne klasse Idee, da ich selbst dann nicht mehr die Dateinamen ermitteln müsste und das ganze würde dann auch mit VBA funktionieren. Aaaaber: Bei dieser Methode kann ich die ID nicht mehr in der ExcelDatei setzen, da diese erst ermittelt werden kann, wenn der Dateiname feststeht. (Hintergrund: Wird die eine bereits im Datenbanksystem vorhandene Datei an einen neuen Platz gespeichert wird ggf. auch eine neue ID vergeben, die dann auch in der ExcelDatei gesetzt werden muss. Diese ist dann aber schon gespeichert!).
Irgendwie kommt mir das verdammt nach Henne/Ei Problem vor, und aktuell kriege ich das Ei nicht kaputt. Zwei Fragen also:
1. Wie könnte ich mitkriegen, ob der Aufruf von VBA oder über den User kommt (SaveAsUI hilft da nicht). Nepumuk hatte glaube ich schon mal geantwortet, dass das nicht geht, vielleicht hat aber einer eine Idee. Habe schon überlegt das ExcelMenü umzugestalten und meinen eigenen Aufruf an die Stelle von "Datei speichern unter" zu setzen, das ist aber einen mords Aufwand auch für spätere Versionen von Excel (2007, da weiß ich gar nicht ob das geht). Wenn meine eigenen Funktion im Menü eingebunden wäre könnte ich dort ein Flag setzen, das mir anzeigt, dass die Eingabe vom User kam. Je länger ich darüber nachdenke um so eher ist das wohl die Lösung. Weiß jemand wie ich "Datei speichern unter" und "Datei speichern" als auch STRG+S "überladen" kann?
2. (Alternative) Wie könnte ich die ID in die Datei bekommen und nach dem Speichern erst den Dateinamen ermitteln? Wenn die Datei an die gleiche Stelle wie vorher gespeichert wird muss die ID gleich bleiben, bei einer Speicherung an eine andere Stelle erhält sie eine neue ID. Theoretisch könnte ich die Datei, wenn sie gespeichert wurde und der Name klar ist einfach noch mal speichern, dann mit ID. Das würde die Zeiten zwar verlängern, wäre aber eine Möglichkeit. Schief gehts natürlich, wenn der User "Datei schließen" drückt und dabei speichert...
Bin echt verzweifelt und für Hilfe dankbar...
Gruß
Norman