Ich entwickle eine Anwendung, die ein XML-Dokument öffnet und liest, das zuvor in eine PowerPoint-Präsentation oder ein Word-Dokument eingebettet war. Um dieses Objekt ( xmlFile as Object
) zu lesen, muss ich folgendes tun:
xmlFile.OLEFormat.DoVerb 1
Dadurch wird das Paketobjekt geöffnet, und ich habe eine weitere Unterroutine, die die geöffnete Instanz von Notepad.exe ruft und ihren Inhalt in den ADODB-Stream liest.
Ein Beispiel für dieses Verfahren ist in Google Text & Tabellen verfügbar:
Während dieses Prozesses gibt es ein paar Sekunden Fenster, in dem die Notepad.exe den Fokus erhält, und ein versehentlicher Tastendruck kann zu unerwünschten Ergebnissen oder einem Fehler beim Lesen der XML-Daten führen.
Ich suche nach einem von zwei Dingen:
MouseKeyboardTest
Subroutine, unten übernimmt. Oder, Für # 1: ist das die Funktion, die ich gefunden habe und die ich nicht gerne verwende. Ich bin vorsichtig, diese Art der Kontrolle über das System der Benutzer zu nehmen. ## Gibt es noch andere Methoden, die ich verwenden könnte? ##
%Vor% Für # 2: Irgendein Hintergrund, aber das Problem scheint die Unfähigkeit zu sein, das eingebettete Objekt mit einer anderen Methode als DoVerb 1
zuverlässig zu extrahieren. Da es sich um ein nicht gespeichertes Dokument in einer Anwendung (Notepad) handelt, das immun gegen meine VBA-Fähigkeiten ist, scheint dies der einzige Weg zu sein, dies zu tun. Hintergrund dazu, hier:
Extrahieren eines OLEObject (XML-Dokument) aus PowerPoint VBA
Nach meinem Verständnis haben Sie die Kontrolle darüber, wie die XML-Datei in die PowerPoint-Präsentation eingebettet wird. Hier verstehe ich nicht ganz, warum Sie sich dafür entschieden haben, die Daten, die Sie benötigen, als Inhalte eines eingebetteten Objekts zu behalten.
Sicher ist die Aufgabe, diese Inhalte zurückzubekommen, kein Kinderspiel. Solange es keinen (einfachen oder sogar mittelschweren) Weg gibt, QueryInterface
aufzurufen und IPersist*
interfaces von VBA zu verwenden, gibt es nur einen Weg, um zum Inhalt des eingebetteten Objekts zu gelangen. Der Weg beinhaltet folgende Schritte:
OLEFormat.DoVerb 1
dafür verwendet. Ein besserer Weg wäre, OLEFormat.Activate
aufzurufen, aber das ist für Ihr spezielles Problem irrelevant. Notepad.exe
macht kein solches Programmiermodell verfügbar, und Sie haben auf WinAPI
zurückgegriffen, was die beste verfügbare Wahl ist. Leider hat Ihr aktueller Ansatz mindestens zwei Fehler:
notepad.exe
, was zu einer möglichen Benutzerinterferenz führt). .txt
-Dateien außer notepad.exe
hat, ist Ihr Ansatz zum Scheitern verurteilt. Wenn Sie steuern können, wie ein eingebettetes Objekt erstellt wird, wäre eine bessere Vorgehensweise, Ihre XML-Daten in einer Eigenschaft von Shape
object zu speichern. Ich würde Shape.AlternativeText
verwenden (sehr einfach zu verwenden; sollte nicht verwendet werden, wenn Sie exportieren Ihre .pptm
nach HTML oder haben ein anderes Szenario, in dem AlternativeText
wichtig ist) oder Shape.Tags
(dies ist wahrscheinlich die semantisch richtigste für die Aufgabe) dafür.
Wie Sie im obigen Kommentar richtig geraten haben, wird das Problem durch die Entfernung des Fokus vom Notizblock gelöst. Der folgende Code tut genau das.
LOGIK :
A . Schleife durch die Form und erhalte den Namen. In Ihrem Szenario wäre es so etwas wie Chart Meta XML_fbc9775a-19ea-.txt
B . Verwenden Sie APIs wie FindWindow
, GetWindowTextLength
, GetWindow
usw., um das Handle des Notizblockfensters mit Teiltitel zu erhalten.
C . Verwenden Sie die ShowWindow
API, um das Fenster zu minimieren
Code (getestet in VBA-Powerpoint)
Fügen Sie diesen Code in ein Modul im obigen PPTM
ein %Vor%Ich denke nicht, dass das Blockieren des Benutzers der richtige Ansatz ist,
Wenn Sie einen Inhalt eines Notizblockfensters verwenden müssen, würde ich vorschlagen, die SendKeys-Methode zu verwenden, um diese Kombination zu senden:
SendKeys("^A^C")
Dies entspricht "Alles auswählen" und "Kopieren",
Und dann könntest du weiter "offline" in der Zwischenablage arbeiten, ohne Angst vor Interferenzen durch Tastenanschläge.
Mein Ansatz, nach Sids Vorschlag, bestand darin, einen Weg zu finden, die Notepad.exe zu minimieren. Da ich das Objekt schon gefunden und geschlossen habe, dachte ich, das sollte nicht so schwer sein.
Ich füge diese hinzu:
%Vor% Und dann, in der Funktion FindNotepad
, direkt vor Exit Function
(also, nachdem der Editor gefunden wurde) minimiere ich das Fenster mit:
Tags und Links vba ole powerpoint-vba adodb