Hallo Klaus,
mir ist gerade aufgefallen, das wenn das programm minimiert ist( in der Taskbar liegt), dann der Laufzeitfehler 5 auftritt was sehr unschön ist 
Ist das Programm nicht minimiert so geht es.
Wenn du diesen Effekt umgehen willst, so bedarf es einer menge Schreibarbeit.
Du musst es wissen, ob dieser Fall eintreten kann.
Hier eine andere Lösung für das Problem
'API Declaration
Private Declare Function FindWindowA Lib „user32“ (ByVal lpClassName As String,ByVal lpWindowName As String) As Long
Private Declare Function GetParent Lib „user32“ (ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib „user32“ (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowTextA Lib „user32“ (ByVal hwnd As Long, ByVal lpString As String,ByVal cch As Long) As Long
Private Declare Function IsIconic Lib „user32“ (ByVal hwnd As Long) As Long
Private Declare Sub SetForegroundWindow Lib „user32“ (ByVal hwnd As Long)
Private Declare Sub ShowWindow Lib „user32“ (ByVal hwnd As Long, ByVal nCmdShow As Long)
Public Sub Main()
If App.PrevInstance Then
PrevActivate
Else
'Eigentliche Anwendung, etwa:
Form1.Show vbModal
End If
End Sub
Public Sub PrevActivate(Optional ByVal Title As String)
'Checken, ob Aktivierung notwendig:
If Not App.PrevInstance Then Exit Sub
'Caption merken und maskieren:
If Len(Title) = 0 Then _
Title = Screen.ActiveForm.Caption
If Not Screen.ActiveForm Is Nothing Then _
Screen.ActiveForm.Caption = CStr(Rnd)
'Andere Instanz aktivieren:
ApplActivate Title
End Sub
Sub ApplActivate(ByVal Appl As Variant)
Const SW_RESTORE = 9
'Ggf. Handle zu Caption suchen:
If Not IsNumeric(Appl) Then Appl = ApplHandle(Appl)
'Ggf. „Wiederherstellen“:
If IsIconic(Appl) Then ShowWindow Appl, SW_RESTORE
'Anwendung in den Vordergrund bringen:
SetForegroundWindow Appl
End Sub
Function ApplHandle(ByVal Caption As String) As Long
Dim vClass As Variant
'VB-Applikationen/Klassen bevorzugen:
For Each vClass In Array(„ThunderRT5MDIForm“,„ThunderRT6MDIForm“, „ThunderRT5Form“, „ThunderRT6Form“, vbNullString)
'Applikation/Klasse checken:
ApplHandle = GetHandle(vClass, Caption)
If ApplHandle Then Exit Function
Next vClass
End Function
Function GetHandle(ByVal Class As String,ByVal Caption As String) As Long
Const GW_HWNDNEXT = 2
Dim Buffer As String
Dim Length As Long
'Auf exakten Treffer checken:
GetHandle = FindWindowA(Class, Caption)
If GetHandle Then Exit Function
'Alle Klassen-Windows durchlaufen:
Caption = UCase$(Trim$(Caption))
GetHandle = FindWindowA(Class, vbNullString)
Do While GetHandle
'Nur Top-Windows berücksichtigen:
If GetParent(GetHandle) = 0 Then
'Caption holen:
Buffer = Space$(255)
Length = GetWindowTextA(GetHandle, Buffer, 255)
Buffer = UCase$(Left$(Buffer, Length))
'Exakter Vergleich:
If Buffer = Caption Then Exit Do
'MDI-Form berücksichtigen:
If Buffer Like Caption & " - *" Then Exit Do
End If
GetHandle = GetWindow(GetHandle, GW_HWNDNEXT)
Loop
End Function
Wie du nun siehst, macht sich ein Modul doch besser als den ganzen Text in die Form zu tipseln.
Auf deine Frage, warum du dies in der Sub Main schreiben sollst.
Ich bin davon ausgegangen das du deine Programme immer in der Sub Main startest. Ich persoenlich mache das immer, da ich zum Programmstart meistens noch aufgaben zu erledigen habe, bevor das erste Fenster angezeigt wird. Bsp. Überprüfen welches OS, Werte einlesen / Initialisieren, Prüfen ob der Rechner im abgesicherten Modus etc gestartet ist. Desweiteren schreibe ich in das Modul meine ganzen allgemeinen Functionen / Prozeduren. So ist es meiner Meinung nach ein wenig übersichtlicher. Aber das ist alles geschmackssache 
Du kannst natuerlich auch meine Variante in die Form_Load() Prozedure in der Form1 schreiben. Sollte eigentlich auch gehen 
VLG Alex
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]