VBA, um die Tastatureingabe zu verhindern, während ein Paketobjekt (XML) in ADODB Stream eingelesen wird?

8

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:

XML_Test.pptm .

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:

  1. Entweder eine Methode, um zu verhindern, dass der Benutzer versehentlich (über Tastatur / Maus / etc) während dieser Operation Eingaben vornimmt. Vorzugsweise etwas, das nicht die Kontrolle über die Maschine des Benutzers wie MouseKeyboardTest Subroutine, unten übernimmt. Oder,
  2. Eine bessere Methode zum Extrahieren der XML-Daten in eine String-Variable.

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

    
David Zemens 02.05.2013, 21:41
quelle

4 Antworten

1

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:

  1. Aktivieren Sie ein eingebettetes Objekt. Sie haben OLEFormat.DoVerb 1 dafür verwendet. Ein besserer Weg wäre, OLEFormat.Activate aufzurufen, aber das ist für Ihr spezielles Problem irrelevant.
  2. Verwenden Sie das Programmiermodell des eingebetteten Objekts, um nützliche Funktionen wie das Abrufen von Inhalten, Speichern oder was auch immer verfügbar ist, auszuführen. 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:

  1. Der, den Sie in der Frage identifiziert haben (Aktivierung von notepad.exe , was zu einer möglichen Benutzerinterferenz führt).
  2. Wenn ein Benutzer ein Standardprogramm zum Öffnen von .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.

    
Ilya Kurnosov 07.05.2013, 22:29
quelle
2

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%     
Siddharth Rout 07.05.2013 21:59
quelle
0

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.

    
Uri Goren 07.05.2013 01:45
quelle
0

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:

%Vor%     
David Zemens 07.05.2013 22:00
quelle

Tags und Links