VBA Excel: Userform und ShellExecute

Hallo,

ich habe folgendes Problem:
Ich habe ein Makro erstellt, mit dessen Hilfe die (manuelle) Verarbeitung von Informationen aus Fotos erleichtert werden soll.

Ohne jetzt genauer darauf einzugehen was das Makro macht, gleich zu meinem Problem: Ich öffne über ShellExectue ein Foto (.jpg) und danach ein UserForm. Beim öffnen des Fotos verliert Excel den Fokus (das sehe ich noch ein) und erhält diesen aber nie mehr zurüch, obwohl dann noch Code folgt und das Userform geöffnet wird. Und von nun an schaffe ich es nicht mehr, den Fokus per VBA auf das Userform zu lenken! Ich muss also jedes mal zuerst auf das Userform klicken, bevor ich dort die aus dem Bild ausgelesenen Werte eingeben kann.

Hat von euch jemand eine Idee wie ich es schaffe, dass das Userform automatisch aktiviert wird und ich nur noch die Werte eingeben muss?

Ich habe ein Makro erstellt, mit dessen Hilfe die (manuelle)
Verarbeitung von Informationen aus Fotos erleichtert werden
soll.
Ohne jetzt genauer darauf einzugehen was das Makro macht,
gleich zu meinem Problem:

Hallo Flonibi,

solange ich den Code nicht sehe vermute ich da das Problem.
Zeige mal den relevanten Code.

Gruß
Reinhard

Hallo.

hier ist der Code:

Sub filesOeffnenUndDatenEinlesen()
pfad = Cells(1, 9).Value

i = 2
Do While (Cells(i, 1).Value „“)

bild = pfad & „“ & Cells(i, 1).Value

wert = ShellExecute(0, „open“, bild, „“, „c:“, 3)

aktivieren (ActiveWorkbook.Name
) '–> hier habe ich schon alles mögliche versucht, um Excel wieder zu aktivieren! (siehe unten)

Cells(i, 2).Select
userform3.Show 1

schliessen merk '–> schließt das Bild nachdem Userform geschlossen wird
i = i + 1
Loop
End Sub

Die aktuelle Version des „Aktivieren“-Codes, der allerdings nicht funktionier:

Sub aktivieren(merk)
Dim hwnd As Long

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & Left(merk, Len(merk) - 4))

If hwnd 0 Then
SetForegroundWindow hwnd
End If
End Sub

Vielleicht fällt dir ja ein Weg ein…

lg

Hallo Flonibi,

mache da bitt etwas lauffähiges daraus und benutze Option Explicit.

Gruß
Reinhard

hier eine vereinfachte Version:

Private Declare Function PostMessage Lib „user32“ Alias „PostMessageA“ (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function OpenProcess Lib „kernel32“ _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib „user32“ _
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function ShellExecute Lib „shell32.dll“ Alias „ShellExecuteA“ ( _
ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function SetForegroundWindow Lib „user32“ (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib „user32“ Alias „FindWindowA“ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib „user32“ (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Option Explicit

Sub ausgangsfilesLaden()

Dim pfad
Dim i

Range(„A2:Z10000“).Clear
Cells(1, 9).Clear

Verzeichniswahl
pfad = Cells(1, 9).Value

Dim MyFile As String
i = 2
MyFile = Dir$(pfad & „*.jpg“)
Do
Cells(i, 1).Value = MyFile
i = i + 1
MyFile = Dir
Loop Until MyFile = „“

End Sub

Sub filesOeffnenUndDatenEinlesen()
Dim pfad
Dim name
Dim bild
Dim wert
Dim merk
Dim i

pfad = Cells(1, 9).Value
name = ActiveWorkbook.name
i = 2
Do While (Cells(i, 1).Value „“)
Cells(i, 1).Select

merk = Selection.Value

bild = pfad & „“ & merk
wert = ShellExecute(0, „open“, bild, „“, „c:“, 3)

aktivieren (name)

Cells(i, 2).Select

UserForm1.Show 1

schliessen merk

i = i + 1
Loop

End Sub

Function schliessen(merk)
Dim hWindow As Long
Dim hThread As Long
Dim hProcess As Long
Dim lProcessId As Long
Dim lngReturnValue As Long

hWindow = FindWindow(vbNullString, „Microsoft Office Picture Manager“)
hThread = GetWindowThreadProcessId(hWindow, lProcessId)
hProcess = OpenProcess(&H100000, 0&, lProcessId)
lngReturnValue = PostMessage(hWindow, &H10, 0&, 0&amp:wink:
End Function

Function aktivieren(merk)
Dim hwnd As Long

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

If hwnd 0 Then
SetForegroundWindow hwnd
End If
End Function

Function Verzeichniswahl()
Dim objShell
Dim objFolder
Dim pfad

Const WINDOW_HANDLE = 0
Const NO_OPTIONS = 0
Set objShell = CreateObject(„Shell.Application“)
Set objFolder = objShell.BrowseForFolder(WINDOW_HANDLE, „Select a folder:“, NO_OPTIONS, „“)
On Error Resume Next
pfad = objFolder.self.Path

If IsEmpty(pfad) Then
End
Else
Cells(1, 9).Value = pfad
End If
End Function

Zusätzlich brauchst du ein UserForm1 mit einem Button zum schließen. Der Code:

Private Sub CommandButton1_Click()
UserForm1.Hide
End Sub

Mit „ausgangsfilesLaden“ kannst du nach einem Ordner suchen, in dem die Fotos sind --> Die Pfade werden in die erste Spalte geschrieben

Mit „filesOeffnenUndDatenEinlesen“ werden diese dann wie beschrieben geöffnet und das UserForm 1 wird geladen. In einem anderen Modul wird bei mir auch noch die Fensteranordnung so gestaltet, dass Excel die eine Hälfte des Monitors und das Foto die andere einnimmt.

Vielen Dank im Vorraus,
lg

Mit „ausgangsfilesLaden“ kannst du nach einem Ordner suchen,
in dem die Fotos sind --> Die Pfade werden in die erste Spalte
geschrieben
Mit „filesOeffnenUndDatenEinlesen“ werden diese dann wie
beschrieben geöffnet und das UserForm 1 wird geladen. In einem
anderen Modul wird bei mir auch noch die Fensteranordnung so
gestaltet, dass Excel die eine Hälfte des Monitors und das
Foto die andere einnimmt.

Hallo Flonibi,

danke für die weitergehenden Infos, sind immer gut, desto schneller hat man den Sinn eines Fremdcodes erkannt.

Und, wenn ich drum bitte auch die API-Deklarationen mitzuliefern, so hat das Gründe. Zum einen sah ich schon unterschiedliche Deklarationen für die gleiche API, wer weiß ob da nicht schon eine potentielle Fehlerquelle liegen KÖNNTE? Ergo, wenn jeder der dir helfen will die gleiche hat wie du ist da das ausgeschöossen.

Dazu kommt, dich kostet das 1-3 min um da Option Explicit und die API-Dekller. einzubauen. Wenn dir 10 Leute helfen wollen und dabei den Code testen wollen, sind das 10-30 min , also max. 29 min völlig verschentkte „Zeit“ für nix, also fehlt diese Zeit quasi wieder jmd. anderenem, z.B. dir um dem zu helfen…

Jetzt, mit meinem winzigen Anschupps haste alles okay gemacht, naja, den Einsatz des Pre-Tags müßte noch kommen hier bei w-w-w :smile:

So, ich schaue jetzt mal nach deinem Problem aber langsam, ich schiele noch ein wenig zu Rainer, bei hwnd und überhaupt API ist er viel besser :smile:)

Gruß
Reinhard

Hallo Reinhard,

ich schiele noch ein wenig zu Rainer, bei hwnd und überhaupt
API ist er viel besser :smile:)

aber nicht, wenn es um Excel-VBA geht. :smile:

Ich habe natürlich mitgelesen, sehe aber ohne zu testen auch keinen Fehler.

Warum wird die Userform modal geöffnet? Teste mal, ob das mit dem Problem zu tun hat. Wenn die Userform modal geöffnet ist, kann/darf Excel nicht Vordergrundfenster werden.

Das Einzige, was mir aufgefallen ist, mit dem Problem aber vermutlich nichts zu tun hat:

Dim name
...
name = ActiveWorkbook.name

Name ist eine Anweisung, die würde ich nicht als Variablennamen verwenden. VB6 würde das so auch nicht zulassen.

Gruß Rainer

Hallo,

und gleich einmal danke an alle, die sich mit meinem Problem beschäftigen!

Warum wird die Userform modal geöffnet? Teste mal, ob das mit
dem Problem zu tun hat. Wenn die Userform modal geöffnet ist,
kann/darf Excel nicht Vordergrundfenster werden.

Ich weiß nicht ob das was hilft, aber dazu kann ich nur sagen, dass nicht Excel an sich sondern das Userform in den Vordergrund soll!

lg,
Flo

Hallo,

Ich weiß nicht ob das was hilft, aber dazu kann ich nur
sagen, dass nicht Excel an sich sondern das Userform in den
Vordergrund soll!

hat die UserForm in Excel denn ein Handle?
Steuerelemente haben in Excel kein Handle. Bei der Userform weiß ich das nicht.

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

habe ich wohl falsch interpretiert und für die Suche nach dem Excel-Fenster gehalten. Wird das Handle Deiner Userform gefunden?

Gruß Rainer

hat die UserForm in Excel denn ein Handle?

Handles übersteigen leider meinen VB-Horizont. Daher habe ich keine Ahnung.

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

habe ich wohl falsch interpretiert und für die Suche nach dem
Excel-Fenster gehalten.

derzeit wird mit dieser Zeile nach dem Excel-Fenster gesucht, da ich die UserForm nicht ansprechen konnte. Und mit dem Ansprechen des Excel-Fensters habe ich mir erhofft, dass damit eventuell die UserForm aktiviert wird… Funktioniert aber nicht!

Hi,

derzeit wird mit dieser Zeile nach dem Excel-Fenster gesucht,
da ich die UserForm nicht ansprechen konnte. Und mit dem
Ansprechen des Excel-Fensters habe ich mir erhofft, dass damit
eventuell die UserForm aktiviert wird… Funktioniert aber
nicht!

ich habe nachgesehen, die UF hat zumindest keine Eigenschft .hwnd

Setzte nach FindWindow doch mal einen Stoppunkt und sieh nach, ob ein Handle gefunden wird. Ich fürchte, nein.
Dann musst Du Excel ansprechen, nicht die UF.

Gruß Rainer

Hallo Rainer,

Ich weiß nicht ob das was hilft, aber dazu kann ich nur
sagen, dass nicht Excel an sich sondern das Userform in den
Vordergrund soll!

hat die UserForm in Excel denn ein Handle?

definitiv ja. Denn gelegentlich will man die UF ohne Titelzeile haben oder auch nur das Wegklickkreuzchen oben rechts (hat das auch einen sprechenderen Namen?) weg haben, das geht mit API und über die hwnd.

Aber der Anfrage drängt mich über meine Wissensgrenze hinaus, das läuft möglicherweise in childfenster oder wie das heißt hinaus.
M.W. kann man z.B. über das Handle Excel an sich minimieren, maximieren usw, aber die UF hängt an Excel dran, also nur die UF zu zeigen und Excel ist minimiert, weia, da bin ich dermaßen überfragt :frowning:

Steuerelemente haben in Excel kein Handle. Bei der Userform
weiß ich das nicht.

Jetzt weißte es :smile:

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

habe ich wohl falsch interpretiert und für die Suche nach dem
Excel-Fenster gehalten.

Wieso falsch, ist doch richtig.
So sieht der Titel eines Excelfensters aus:
Microsoft Excel - Dateiname ohne .xls

Andererseits habe ich sehr im Hinterkopf ohne das jetzt richtig einsortieren zu können, ich weiß genau, bei der Suche nach dem Excelfenster wird nach „XLMain“ gesucht. Bin auch da grad am Schwimmen :frowning:

Abgesehen davon, jeder Statistiker kann dir locker berechnen daß der Gesamtcode mit allen APIdeklarationen nahezu NUll Anteil Excel hat, alles andere ist pures API-VB *lächel*

Gruß
Reinhard

Userform ansprechen
Hallo Rainer,

ich habe nachgesehen, die UF hat zumindest keine Eigenschft
.hwnd

okay, okay, dann hat sie vielleicht doch kein Handle, sorry,

Aber sie ist wie gesagt findbar und beeinflußbar über Api, ich hab mal gekramt, nachstehend der Code einer UF ohne Kopf.

Vielleicht kannst du da draus was basteln für den Anfrager, bei würd sowas lange dauern wenn überhaupt.

Gruß
Reinhard

Option Explicit
' Userform mit einem CommandButton (CoEnde), um die Userform
' zu schließen. Mit rechtsklick auf die Maus in der Userform
' wird diese ebenfalls geschlossen. Abschnitt:
' "Unload UserForm1 ' Zum schließen, beim ausprobieren."
' von GraFri
'
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" \_
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, \_
ByVal wCmd As Long) As Long
'
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As \_
Long, lpRect As RECT) As Long
'
Private Declare Function ReleaseCapture Lib "user32" () As Long
'
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" \_
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
'
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, \_
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
'
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, \_
ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
'
Private FensterRegion&, Region&
Private Hauptfensternummer&, Clientfensternummer&
Private dummy As Long
'
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'
Private Const GW\_CHILD = 5
Private Const WM\_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
'
Private Sub UserForm\_Initialize()
 Call FensterOhneKopf
End Sub
'
Sub FensterOhneKopf()
Dim Abmessung As RECT
Dim Abmessung1 As RECT
Dim Pos1x&, Pos1y&, Pos2x&, Pos2y&
If FensterRegion 0 Then Exit Sub
UserForm1.BorderStyle = fmBorderStyleSingle
Call Fensternummer(UserForm1, Abmessung, Abmessung1)
Pos1x = 0
Pos1y = (Abmessung1.Top - Abmessung.Top)
Pos2x = Abmessung.Right - Abmessung.Left
Pos2y = Abmessung.Bottom - Abmessung.Top
Region = CreateRectRgn(Pos1x, Pos1y, Pos2x, Pos2y)
FensterRegion = SetWindowRgn(Hauptfensternummer, Region, True)
End Sub
'
'Fensterhandles und Infos über Fenster holen
Private Sub Fensternummer(Form As Object, Abmessung As RECT, Abmessung1 As RECT)
 Dim Fenstername$, Suchstring$
 Suchstring = "UserForm ohne Titelzeile"
 Fenstername = Form.Caption
 Form.Caption = Suchstring
 Hauptfensternummer = FindWindow(vbNullString, Suchstring)
 Form.Caption = Fenstername
 Clientfensternummer = GetWindow(Hauptfensternummer, GW\_CHILD)
 dummy = GetWindowRect(Hauptfensternummer, Abmessung)
 dummy = GetWindowRect(Clientfensternummer, Abmessung1)
End Sub

'Folgendes ist notwendig, um die Form ohne Titelleiste zu verschieben
'

Private Sub UserForm\_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, \_
ByVal X As Single, ByVal Y As Single)
 If Button = 1 Then
 If Hauptfensternummer 0 Then
 dummy = ReleaseCapture()
 dummy = SendMessage(Hauptfensternummer, WM\_NCLBUTTONDOWN, HTCAPTION, 0)
 End If
 Else
 Unload UserForm1 ' Zum schließen, beim ausprobieren.
 End If
End Sub

Private Sub CommandButton1\_Click()
 Unload Me
End Sub

Setzte nach FindWindow doch mal einen Stoppunkt und sieh
nach, ob ein Handle gefunden wird. Ich fürchte, nein.

Dann musst Du Excel ansprechen, nicht die UF.

das mache ich mit meinem derzeitigen Code ja, nur bewirkt das nichts, wenn ich dem Excel-Fenster den SetForegroundWindow-Befehl gebe!

Hallo Reinhard,

definitiv ja.

OK. Ich habe nur gesehen, daß die UF keine Eigenschaft .hwnd hat, das hat mich zweifeln lassen.

Denn gelegentlich will man die UF ohne
Titelzeile haben oder auch nur das Wegklickkreuzchen oben
rechts (hat das auch einen sprechenderen Namen?)

‚ControlBox‘

weg haben,
das geht mit API und über die hwnd.

OK.

Aber der Anfrage drängt mich über meine Wissensgrenze hinaus,
das läuft möglicherweise in childfenster oder wie das heißt
hinaus.

Auch OK, dann muss das Excelfenster angesprochen werden, steht in API-Guide.

M.W. kann man z.B. über das Handle Excel an sich minimieren,
maximieren usw, aber die UF hängt an Excel dran, also nur die
UF zu zeigen und Excel ist minimiert, weia, da bin ich
dermaßen überfragt :frowning:

Ich auch. :smile:

Steuerelemente haben in Excel kein Handle. Bei der Userform
weiß ich das nicht.

Jetzt weißte es :smile:

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

habe ich wohl falsch interpretiert und für die Suche nach dem
Excel-Fenster gehalten.

Wieso falsch, ist doch richtig.

So sieht der Titel eines Excelfensters aus:

Microsoft Excel - Dateiname ohne .xls

Andererseits habe ich sehr im Hinterkopf ohne das jetzt
richtig einsortieren zu können, ich weiß genau, bei der Suche
nach dem Excelfenster wird nach „XLMain“ gesucht. Bin auch da
grad am Schwimmen :frowning:

Abgesehen davon, jeder Statistiker kann dir locker berechnen
daß der Gesamtcode mit allen APIdeklarationen nahezu NUll
Anteil Excel hat, alles andere ist pures API-VB *lächel*

*gg* Ja, das habe ich inzwischen auch gesehen. Aber Handle und Excel ist nicht das Selbe, wie Handle ind VB6. :smile: Bei Excel weiß ich nie, was ein Handle hat und was nicht, weil es diese Eigenschaft in Excel-VBA nicht gibt.

Außerdem … Wenn Fragen kommen, die es nötig machen ein wenig Code zu schreiben und zu testen, kann ich zu Hause nichts tun. Da habe ich kein Office auf dem Rechner. :smile:

Gruß Rainer

das mache ich mit meinem derzeitigen Code ja, nur bewirkt das
nichts, wenn ich dem Excel-Fenster den
SetForegroundWindow-Befehl gebe!

Ist die UF denn zu dem Zeitpunkt modal geöffnet?
Wenn ja, lass das ‚,1‘ hinter UF.Show mal zu Test weg …

Hi Reinhard,

Vielleicht kannst du da draus was basteln für den Anfrager,
bei würd sowas lange dauern wenn überhaupt.

heute keine Chance. Ich bin jetzt off, ich bastel gerade an einer Datenbankanwendung … :smile:

Gruß Rainer

Hi,

ich habe den Code den Du gepostet hast jetzt mal in Excel eingefügt, und so weit ergänzt, daß etwas passiert.

Option Explicit

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, \_
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" \_
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, \_
ByVal dwProcessId As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" \_
(ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( \_
ByVal hwnd As Long, ByVal lpOperation As String, \_
ByVal lpFile As String, ByVal lpParameters As String, \_
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Sub ausgangsfilesLaden()

Dim pfad
Dim i

Range("A2:Z10000").Clear
Cells(1, 9).Clear

Verzeichniswahl
pfad = Cells(1, 9).Value

Dim MyFile As String
i = 2
MyFile = Dir$(pfad & "\*.jpg")
Do
Cells(i, 1).Value = MyFile
i = i + 1
MyFile = Dir
Loop Until MyFile = ""

End Sub

Sub filesOeffnenUndDatenEinlesen()
Dim pfad
Dim name
Dim bild
Dim wert
Dim merk
Dim i

pfad = Cells(1, 9).Value
name = ActiveWorkbook.name
i = 2
Do While (Cells(i, 1).Value "")
Cells(i, 1).Select

merk = Selection.Value

bild = pfad & "\" & merk
wert = ShellExecute(0, "open", bild, "", "c:\", 3)

aktivieren (name)

Cells(i, 2).Select

UserForm1.Show 1

schliessen merk

i = i + 1
Loop

End Sub


Function schliessen(merk)
Dim hWindow As Long
Dim hThread As Long
Dim hProcess As Long
Dim lProcessId As Long
Dim lngReturnValue As Long

hWindow = FindWindow(vbNullString, "Microsoft Office Picture Manager")
hThread = GetWindowThreadProcessId(hWindow, lProcessId)
hProcess = OpenProcess(&H100000, 0&, lProcessId)
lngReturnValue = PostMessage(hWindow, &H10, 0&, 0&amp:wink:
End Function

Function aktivieren(merk)
Dim hwnd As Long

hwnd = FindWindow(vbNullString, "Microsoft Excel - " & merk)

If hwnd 0 Then
SetForegroundWindow hwnd
End If
End Function

Function Verzeichniswahl()
Dim objShell
Dim objFolder
Dim pfad

Const WINDOW\_HANDLE = 0
Const NO\_OPTIONS = 0
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(WINDOW\_HANDLE, "Select a folder:", NO\_OPTIONS, "")
On Error Resume Next
pfad = objFolder.self.Path

If IsEmpty(pfad) Then
End
Else
Cells(1, 9).Value = pfad
End If
End Function

'Zusätzlich brauchst du ein UserForm1 mit einem Button zum schließen. Der Code:

Private Sub CommandButton1\_Click()
UserForm1.Hide
End Sub

Private Sub UserForm\_Initialize()
 ausgangsfilesLaden
 filesOeffnenUndDatenEinlesen
End Sub

und …

Option Explicit

Private Sub Workbook\_Open()
 UserForm1.Show 1
End Sub

Nur verstehe ich jetzt das Problem nicht mehr.

Das Verzeichnis mit Bildern wird gelesen und in die Excel-Tabelle übertragen.
Die Userform geht auf.
Ich klicke ‚schließen‘ und das erste Bild wird geladen und angezeigt.
Ich schließe das Fenster und sehe wieder Excel, im Vordergrund die Userform, die ist aktiv und ich kann wieder auf ‚schließen‘ klicken. das so lang, bis ich alle Bilder durch habe.

Inaktv sehe ich die Userform nicht.

Gruß Rainer

Nur verstehe ich jetzt das Problem nicht mehr.

Das Verzeichnis mit Bildern wird gelesen und in die
Excel-Tabelle übertragen.

Die Userform geht auf.

Ich klicke ‚schließen‘ und das erste Bild wird geladen und
angezeigt.

Ich schließe das Fenster und sehe wieder Excel, im
Vordergrund die Userform, die ist aktiv und ich kann wieder
auf ‚schließen‘ klicken. das so lang, bis ich alle Bilder
durch habe.

Inaktv sehe ich die Userform nicht.

Das Problem war aber, dass ich die Userform genau dann als aktiv benötige, wenn das Bild geöffnet ist!

Ich habe das Problem inzwischen aber schon gefunden! Das öffnen des Bildes hat so lange gedauert, dass das Userform und der restliche Code inzwischen schon fertig waren. (auch das Aktivieren von Excel per Function) Da das Bild jetzt das zuletzt geöffnete Fenster war, war es auch das aktive!! --> Ich habe als Lösung einfach einen kurzen Timer eingebaut, und schon funktioniert alles so wie gedacht.

Trotzdem vielen Dank für eure Hilfe!

lg Flo

Ich habe das Problem inzwischen aber schon gefunden! Das
öffnen des Bildes hat so lange gedauert, dass das Userform und
der restliche Code inzwischen schon fertig waren. (auch das
Aktivieren von Excel per Function) Da das Bild jetzt das
zuletzt geöffnete Fenster war, war es auch das aktive!! -->
Ich habe als Lösung einfach einen kurzen Timer eingebaut, und
schon funktioniert alles so wie gedacht.

Hallo Flo,

„dass das Userform und der restliche Code inzwischen schon fertig waren.“

restlicher Code nach dem UF Aufruf? das geht aber nur bei .Show 0
Du hattest aber Show 1 im Code. Da läuft nix mit restlichem Code, erst dann wenn die UF zerstört wird.

Egal, mit sehr unterschiedlichem Arbeitseinsatz ist das Problem gelöst *Schweißabwisch* :smile:

Gruß
Reinhard