Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1224to1228
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

VBA Markierung in externe Awendung

VBA Markierung in externe Awendung
Nibio
Hallo Profis,
dank Martin, bin ich jetzt ein Schritt weiter gekommen (nochmals vielen Dank an Martin)
https://www.herber.de/forum/archiv/1216to1220/t1217045.htm#1217140
Ich wollte jetzt wissen wie ich per VBA anstatt ein Mausklick, ein Bereich markieren kann (in eine Externe Anwendung) z.B Bereich:
x 500 y 500
w 20 h 20
Eigentlich hatte ich vor diese Bereich dann als Screenshot in Ordner c:\ mit der Name "xxxx.jpg" zu speichern bzw. überschreiben (wie beim taste "DRUCK") und nach der Kopiervorgang gleich die exakte Große in bytes in Zelle A1 einzutragen. Ich würde mich auf eine evtl. Lösung sehr freuen.
Danke im Voraus an allen.
Gruß
Nibio
AW: VBA Markierung in externe Awendung
15.08.2011 12:36:36
Martin
Hallo Nibio,
ich bin es wieder. Ungetestet würde ich sagen, dass du den Mauszeiger per VBA an die linke Seite des zu markierenden Textes setzt und mit
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0&

die linke Maustaste drückst. Anschließend setzt du die Maus mit VBA an das Ende des Textfeldes und lässt die linke Maustaste wieder los:
mouse_event MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0&

Anschließend schickst du mit "Application.SendKeys" die Tastenkombination "Strg+C" als Kopierbefehl. Dann sollte es eigentlich klappen.
Noch eine kleine Ergänzung: Meistens reicht ein einfach Klick am Anfang des Textfeldes aus, danach könntest du mit der Tastenkobination "Strg+A" (oder auch "Strg+Umschalt+Ende" wäre möglich) den Text zum Kopieren markieren.
Viele Grüße
Martin
Anzeige
AW: VBA Markierung in externe Awendung
15.08.2011 15:35:44
Nibio
Hallo Martin,
Danke nochmal. Es handelt sich aber nicht um ein Textfeld, sondern um ein Bild, ich möchte praktisch ein Bildauschnitt per VBA speichern. Gibt es eine möglichkeit mir dir in Kontakt zu kommen? Wäre dies erlaubt?
Wenn nein, dann kann ich das auch verstehen.
Gruß
Nibio
AW: VBA Markierung in externe Awendung
15.08.2011 23:02:31
Martin
Hallo Nibio,
offen gesagt stelle ich es mir mit einem Bildausschnitt recht schwer vor. Meine Email lautet martin.springer[ät]web[Punkt]de.
Ich verstehe zwar nicht ganz was dein Ziel ist, möchte aber trotzdem ein Idee äußern:
1. Focus auf entsprechendes Programmfenster setzen (Vollbild)
2. Mit "Application.SendKeys" (Druckttaste) einen Screenshot machen
3. Grafik in Excel Sheet einfügen
4. Grafik mit PictureFormat.CropLeft/CropTop/CropRight/CropBottom beschneiden
(5. Grafik exportieren, falls gewünscht http://www.online-excel.de/excel/singsel_vba.php?f=14)
Viele Grüße
Martin
Anzeige
AW: VBA Markierung in externe Awendung
16.08.2011 11:29:48
Nibio
Danke vielmals Martin,
das Makro sollte jede sekunde ein Bild Bereich in die Zwischenablage automatisch kopieren und die Größe als Datei in bytes in Zelle A1 übermitteln. Ziel der Sache ist eine Grafische-Nummer zu erkennen (leider erscheint diese Nummer als Grafik nicht als text), anhang die Größe in byte lässt sich die Nummer dann erkennen. Ist das per VBA nicht möglich ein bereich zu markieren und kopieren?
Auf jeden Fall, herzlichen Dank.
Gruß
Nibio
AW: VBA Markierung in externe Awendung
16.08.2011 12:00:09
Martin
Hallo Nibio,
ich verstehe es leider noch immer nicht. Von welcher Größe sprichst du? Die Bildgröße vom Screenshoot entspricht immer deiner Bildschirmauslösung. Die Größe als Bilddatei ist vom Kompressionsverfahren abhängig. Ich habe nur verstanden, dass du gerne eine grafisch ausgegebene Zahl in eine (ich bezeichne es mal als) "Textzahl" umwandeln würdest. Das bekomme ich nicht hin. Aber wie ich gestern versucht habe zu erklären, kann ein Screenshot in Excel als Grafik zugeschnitten werden.
Ist das per VBA nicht möglich ein bereich zu markieren und kopieren?
In Excel kann fast alles markiert/kopiert werden.
Viele Grüße
Martin
Anzeige
AW: VBA Markierung in externe Awendung
16.08.2011 12:22:17
Nibio
Hallo Martin,
sorry daß ich nicht deutlich genug war (das liegt leider an mein deutsch, ich habe leider keine deutsche Schule besucht, Sorry). Ich meine die Grose in bytes, oder KB, Speicherplatz die das kopierte Bereich als Bild benötigt.
Nehmen wir an daß die Nummer die ich als text umawandeln möchte immer im Bereich x200 y200 w100 h100 erscheint, und nehmen wir an wir haben aktuell die Numemr 1 die als Grafik erscheint. Wenn ich jetzt diese Bereich als Bild speichere, dann muss ich nur die benötigte Speicherplatz notieren, nehmen wir an das wäre 1122 byte, jetzt weiß ich dass wenn das Bild 1122 byte an Speicherplatz belegt, daß es um die Nummer 1 handelt, ich habe somit
die Nummer 1 erkannt und kann von grafik als text umwandeln (deshalb wollte ich die Größe in bytes in Zelle A1). Die numemr 2 hat z.B Größe 1258 bytes, die 3 = 1854 bytes usw...
Das ist Sinn der Sache.
Und deshalb wollte ich über VBA ein Bereich Markieren, kopieren und die entsprechende Speicherplat in byte haben.
Gruß
Nibio
Anzeige
AW: VBA Markierung in externe Awendung
16.08.2011 12:48:19
Martin
Hallo Nibio,
okay, jetzt verstehe ich es (...glaube ich). Dann war aber beim beschriebener Ansatz schon richtig:
1. Focus auf entsprechendes Programmfenster setzen (Vollbild)
2. Mit "Application.SendKeys" (Druckttaste) einen Screenshot machen
3. Grafik in Excel Sheet einfügen
4. Grafik mit PictureFormat.CropLeft/CropTop/CropRight/CropBottom beschneiden
5. Grafik exportieren, falls gewünscht http://www.online-excel.de/excel/singsel_vba.php?f=14
fehlt nur noch
6. Dateigröße der exportierten Grafik abfragen (geht mit "FileLen(DateiPfad)")
Trotzdem kann ich noch keinen richtigen Sinn in deinem Vorgehen erkennen: Wenn es nur darum geht die Reihenfolge der Bilder nachvollziehen zu können, dann würde ich einfach als Dateinamen der Screenshoot-Grafik eine fortlaufende Nummer vergeben.
Viele Grüße
Martin
Anzeige
AW: VBA Markierung in externe Awendung
16.08.2011 14:00:54
Nibio
Hallo Martin,
Danke vielmals, das würde bestimmt funktionieren aber,
geht das nicht direkt mit VBA? Ich meine ohne das Bild über DRUCKTASTE in Excel einfügen zu müßen und exportieren usw...
Ich meine einfach bereich x200 y200 w100 h100 in Zwischenablage kopieren und belegte Speicherplatz aus Zwischenablage übermitteln. Das wäre einfacher denn, Script muss nicht nur die Nummer dezifrieren (von Grafik in Zahl umwandeln)
sondern auch wissen zu welche Zeitpunkt ausgefürt werden muß, das bedeutet daß eine zweite Scrip versuchen muss eine änderung zu erkennen (ein button, text oder sonst was) und erst dann die Dezifrierung starten (also jede sekunde ein Bild einfügen, schneiden und exportieren.....das wäre zu viel denke ich).
Deshalb meine Frage: "Geht das nicht direkt mit VBA"? Mit FSCapture kann ich z.B eine kleine Bereich wählen bzw. markieren und in Zwischenablage speichern bzw. kopieren, geht so was mit VBA nicht? Dann müßte ich nur noch die Größe der Zwischenablage auslesen ohne was speichern zu müßen.
Nochmals vielen Dank.
Gruß
Nibio
Anzeige
AW: VBA Markierung in externe Awendung
16.08.2011 15:35:12
Martin
Hallo Nibio,
mit API geht so einiges, da muss man im Forum und Internet etwas recherchieren. Der folgende API-Code zum Beispiel macht einen Screenshot vom aktiven Fenster. Du muss im Makro "Screenshot" nur den Fensternamen deiner Anwendung einsetzen.
Option Explicit
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" _
(ByVal wCode As Long, ByVal wMapType As Long) As Long
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _
(LpVersionInformation As OSVERSIONINFO) As Long
Public Const VK_MENU = &H12
Public Const KEYEVENTF_KEYUP = &H2
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Public Sub GetWindowSnapShot(Mode As Long)
Dim altscan%, NT As Boolean
NT = IsNT
If Not NT Then
If Mode = 0& Then Mode = 1& Else Mode = 0&
End If
If NT And Mode = 0 Then
keybd_event vbKeySnapshot, 0&, 0&, 0&
Else
altscan = MapVirtualKey(VK_MENU, 0)
keybd_event VK_MENU, altscan, 0, 0
DoEvents
keybd_event vbKeySnapshot, Mode, 0&, 0&
End If
DoEvents
keybd_event VK_MENU, altscan, KEYEVENTF_KEYUP, 0
End Sub
Public Function IsNT() As Boolean
Dim verinfo As OSVERSIONINFO
verinfo.dwOSVersionInfoSize = Len(verinfo)
If (GetVersionEx(verinfo)) = 0 Then Exit Function
If verinfo.dwPlatformId = 2 Then IsNT = True
End Function
Sub Screenshot()
AppActivate ("TT") 'setze in die Klammer den Fensternamen deines Programms
If Application.Wait(Now + TimeValue("0:00:01")) Then
GetWindowSnapShot 1
Sheets("Tabelle1").Paste
End If
End Sub
Viele Grüße
Martin
Anzeige
Wahrscheinlich die Lösung...
16.08.2011 16:13:46
Martin
Hallo Nibio,
ich hatte versehentlich an der falschen Stelle geantwortet:
https://www.herber.de/forum/messages/1226323.html
Viele Grüße
Martin
Anzeige
Das sollte die Lösung sein
16.08.2011 16:11:18
Martin
Hallo Nibio,
jetzt habe ich (glaub ich) doch eine Lösung gefunden:
http://ww3.cad.de/foren/ubb/Forum110/HTML/000609.shtml
Im folgenden Makro werden offensichtlich die Koordinaten (statt "udtRect.Left", "udtRect.Left", "udtRect.Right - udtRect.Left" und "udtRect.Bottom - udtRect.Top") für den Screenshot festgelegt:
Public Sub prcCreate_Picture_Active_Window()
Dim hWnd As Long
Dim udtRect As RECT
Sleep 3000 '3 sekunden pause um ein anderes Fenster zu aktivieren
hWnd = GetForegroundWindow
GetWindowRect hWnd, udtRect
stdole.SavePicture hDCToPicture(GetDC(0&), udtRect.Left, udtRect.Top, _
udtRect.Right - udtRect.Left, udtRect.Bottom - udtRect.Top), _
"D:\Eigene Dateien\Screenshot.bmp" 'anpassen !!!
End Sub
Das Makro scheint von Nepumuk zu sein, dieser Nutzer ist auch hier im Forum aktiv. Bei Fragen zu diesem Makro solltest du dich am besten an ihn wenden. Aber ich denke, dass du jetzt am Ziel sein solltest.
Trotzdem noch eine andere Idee: Beim suchen im Internet bin ich auf folgende Freeware gestoßen:
http://www.snapfiles.com/get/mwsnap.html
Laut Beschreibung kannst du damit mit Screenshots von Bildschirmbereichen machen. Vielleicht wäre auch das eine alternative Lösung (...ich habe es aber nicht installiert/getestet).
Viele Grüße
Martin
Anzeige
AW: Das sollte die Lösung sein
16.08.2011 21:49:25
Nibio
Hallo Martin,
Sorry die Störung schin wieder, ist das ein normaler Makro? Läuft bei mir nicht:
Debug bringt fehler in Zeile "

Public Sub prcCreate_Picture_Active_Window()"

Public Sub prcCreate_Picture_Active_Window()
Dim hWnd As Long
Dim udtRect As RECT
Sleep 3000 '3 sekunden pause um ein anderes Fenster zu aktivieren
hWnd = GetForegroundWindow
GetWindowRect hWnd, udtRect
stdole.SavePicture hDCToPicture(GetDC(0&), udtRect.Left, udtRect.Top, _
udtRect.Right - udtRect.Left, udtRect.Bottom - udtRect.Top), _
"D:\Eigene Dateien\Screenshot.bmp" 'anpassen !!!
End Sub
Gruß
Nibio
AW: Das sollte die Lösung sein
16.08.2011 23:14:04
Martin
Hallo Nibio,
du musst dir den Code aus folgendem Beitrag kopieren:
http://ww3.cad.de/foren/ubb/Forum110/HTML/000609.shtml
Ich habe dir lediglich das Makro herauskopiert, in dem du die Koordinaten für den Screenshot eintragen musst.
Viele Grüße
Martin
AW: Das sollte die Lösung sein
17.08.2011 12:40:30
Nibio
Hallo Martin,
Ist mir zu kompliziert, so ein lange script! Und ich weiß nicht was ich da anpassen soll, deshalb habe ich mich entschieden ein Tool zu verwenden (laut dein Vorschlag). Nur das Problem ist jetzt die Dateigröße aus zwischenablage auszulesen.
DANKE.
Gruß
Nibio
AW: Das sollte die Lösung sein
17.08.2011 12:17:43
Nibio
Hallo Martin,
dein Vorschlag ein Tool zu verwenden um ein Bildschirmbereich zu markieren und kopieren war klever. Danke sehr.
Ich benute jetzt ein Makro Programm, und das markieren und kopieren funktioniert sehr gut. Ich könnte jetzt via Excel per VBA das Programm starten und den Bereich markieren lassen, fehlt aber ein Details:
Wie kann ich per VBA die Größe (belegte Speicherplatz) von den Bild in die Zwischenablage erfaharen?
Sonst kann ich die Nummer nich dezifrieren, ich hoffe es geht ohne das Bild vorher speichern zu müßen, denn so würde das ganze schneller laufen. Die Datei-Größe sollte in Zelle A1 übertragen werden, danach die Zwischenablage wieder komplet löschen.
Wäre dies möglich?
Gruß
Nibio

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige