Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1108to1112
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

MSGBox in Vordergrund von Excel unabhängig

MSGBox in Vordergrund von Excel unabhängig
Excel
Halllo VBA (Outlook)-Freaks,
ich erstelle Mails mit Adressen aus einem Excelsheet heraus.
Ich öffne das Mailfenster zur Prüfung und frage per MsgBox ab, ob die Mail so wirklich versendet werden soll.
Frage: Wie erreiche ich es, dass immer zuerst das Fenster mit der Mail sichtbar wird und genau davor die MsgBox, sie also unabhängig vom Excel wird
Im Moment muss ich immer erst in der Taskleiste auf Excel klicken, damit ich die MsgBox zu sehen bekomme.
(Das Erstellen der Mails aktiviere ich aus einer Userform, in der außer Mail verschicken noch mehrere andere Abläufe aktiviert werden können. Diese Userform steht natürlich weiter im Hintergrund)
Wäre schon, wen mir einer von euch einen Tipp geben könnte.
Mit Dank und Gruß
Rüdiger
AW: MSGBox in Vordergrund von Excel unabhängig
22.10.2009 14:12:53
Excel
Hi.
Würde mal sagen, dass das überhaupt nicht geht. Sobald die Messagebox im Vordergrund ist, ist das Excel ebenfalls und dann siehst Du die Mail nicht mehr.
Das müßtest Du wohl eher über ein Makro in Outlook lösen, wobei mir da für einen vernünftigen Ansatz die Erfahrung fehlt.
Gruss, Jogy
AW: MSGBox in Vordergrund von Excel unabhängig
22.10.2009 14:30:03
Excel
Hi JogyB,
hab ich mir schon gedacht, kann ja eigentlich rein logisch nicht gehen.
Dachte auch schon an ein kleines Programm unter Outlook (fehlt auch bei mir die Erfahrung), aber dann taucht das Problem auf: Wie rufe ich aus meiner Modulsteuerung in Excel genau dann, wenn ich das Mailfenster aktiviert habe, das Outlook-VBA auf und wie gebe ich nach gegebener "Antwort" die Steuerung wieder an Excel zurück, dann hört's bei mir wirklich auf.
Gruß
Rüdiger
Anzeige
AW: MSGBox in Vordergrund von Excel unabhängig
22.10.2009 22:59:56
Excel
Hallo Rüdiger,
geht schon, ist aber etwas aufwändiger.
' **********************************************************************
' Modul: basA_Mail Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub SendWith_OutLook()
  Dim OLApp As Object, OMail As Object
  Dim hWnd As Long
  
  Set OLApp = CreateObject("Outlook.Application")
  
  hWnd = FindWindowHandle("*Outlook*")
  
  Set OMail = OLApp.CreateItem(0)
  
  With OMail
    .To = "try.to@guess.it"
    .CC = ""
    .BCC = ""
    .Subject = "Test"
    .Body = "Hallo!"
    
    .Display
    
    If CoolBox(hWnd, "Soll diese Mail versendet werden", _
      "Frage", "Mail absenden", "Abbrechen", "", _
      CoolBoxIcon.Question) = 1 Then
      .Send
    End If
  End With
  
  Set OMail = Nothing
  Set OLApp = Nothing
End Sub

' **********************************************************************
' Modul: basC_MsgBox Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

'src:= http://www.vbarchiv.net/tipps/tipp_687-komfortable-msgbox-mit-frei-editierbaren-buttons.html

' Benötigte API's für die Timer-Steuerung
Private Declare Function SetTimer Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal nIDEvent As Long, _
  ByVal uElapse As Long, _
  ByVal lpTimer As Long) As Long

Private Declare Function KillTimer Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal nIDEvent As Long) As Long

Private Const MY_NID = 88
Private Const MY_ELAPSE = 25 ' Wartezeit: 25 MSek.

' Benötigte API's für das Manipulieren der MsgBox
Private Declare Function MessageBox Lib "user32" _
  Alias "MessageBoxA" ( _
  ByVal hWnd As Long, _
  ByVal lpText As String, _
  ByVal lpCaption As String, _
  ByVal wType As Long) As Long

Private Declare Function GetActiveWindow Lib "user32" () As Long

Private Declare Function SendDlgItemMessage Lib "USER32.DLL" _
  Alias "SendDlgItemMessageA" ( _
  ByVal hDlg As Long, _
  ByVal nIDDlgItem As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As String) As Long

' Benötigte Konstanten
Private Const WM_SETTEXT = &HC

' MsgBox-Bildsymbole
Public Enum CoolBoxIcon
  Critical = 16
  Question = 32
  Exclamation = 48
  Information = 64
End Enum

' Variablen zur Speicherung der gewünschten
' Buttonbeschriftung
Private m_Caption1 As String
Private m_Caption2 As String
Private m_Caption3 As String

' WindowHandle
Private m_hWnd As Long

' MsgBox anzeigen
Public Function CoolBox(ByVal hWnd As Long, _
    ByVal Text As String, _
    ByVal Title As String, _
    ByVal Button1 As String, _
    Optional ByVal Button2 As String, _
    Optional ByVal Button3 As String, _
    Optional ByVal Symbol As CoolBoxIcon) As Long

  
  Dim nResult As Long
  
  ' Fensterhandle
  m_hWnd = hWnd
  
  ' Beschriftung der Buttons
  m_Caption1 = Button1
  m_Caption2 = Button2
  m_Caption3 = Button3
  
  ' API-Timer starten
  nResult = SetTimer(m_hWnd, MY_NID, MY_ELAPSE, _
    AddressOf Coolbox_TimerEvent)
  
  ' API Message-Box mit gewünschter Buttonalzahl aufrufen
  If Button2 = "" And Button3 = "" Then
    ' Ein Button
    nResult = MessageBox(m_hWnd, Text, Title, _
      Symbol Or vbOKOnly)
    
  ElseIf Button2 <> "" And Button3 = "" Then
    ' Zwei Buttons
    nResult = MessageBox(m_hWnd, Text, Title, _
      Symbol Or vbYesNo)
    
  Else
    ' Drei Buttons
    nResult = MessageBox(m_hWnd, Text, Title, _
      Symbol Or vbAbortRetryIgnore)
  End If
  
  ' Antwort auswerten und Rückgabewert festlegen
  If nResult = 1 Or nResult = 3 Or nResult = 6 Then
    ' erster Button wurde gedrückt
    CoolBox = 1
    
  ElseIf nResult = 4 Or nResult = 7 Then
    ' zweiter Button wurde gedrückt
    CoolBox = 2
    
  Else
    ' dritter Button wurde gedrückt
    CoolBox = 3
  End If
End Function

' Timer-Event!
Sub Coolbox_TimerEvent()
  Dim nWnd As Long
  
  ' API-Timer wieder deaktivieren
  KillTimer m_hWnd, MY_NID
  
  ' Fensterhandle der MsgBox
  nWnd = GetActiveWindow()
  
  ' Buttons neu beschriften
  If m_Caption2 = "" And m_Caption3 = "" Then
    ' nur ein Button
    SendDlgItemMessage nWnd, vbCancel, WM_SETTEXT, 0, m_Caption1
    
  ElseIf m_Caption2 <> "" And m_Caption3 = "" Then
    ' Zwei Buttons
    SendDlgItemMessage nWnd, vbYes, WM_SETTEXT, 0, m_Caption1
    SendDlgItemMessage nWnd, vbNo, WM_SETTEXT, 0, m_Caption2
    
  Else
    ' Drei Buttons
    SendDlgItemMessage nWnd, vbAbort, WM_SETTEXT, 0, m_Caption1
    SendDlgItemMessage nWnd, vbRetry, WM_SETTEXT, 0, m_Caption2
    SendDlgItemMessage nWnd, vbIgnore, WM_SETTEXT, 0, m_Caption3
  End If
End Sub

' **********************************************************************
' Modul: basB_Handle Typ: Allgemeines Modul
' **********************************************************************

Option Explicit
'src:= http://www.vbarchiv.net/tipps/tipp_2012.html

' benötigte API-Deklarationen
Private Declare Function FindWindow Lib "user32" _
  Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long

Private Declare Function GetWindowTextLength Lib "user32" _
  Alias "GetWindowTextLengthA" ( _
  ByVal hWnd As Long) As Long

Private Declare Function GetWindowText Lib "user32" _
  Alias "GetWindowTextA" ( _
  ByVal hWnd As Long, _
  ByVal lpString As String, _
  ByVal cch As Long) As Long

Private Declare Function GetWindow Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal wCmd As Long) As Long

Private Const GW_HWNDNEXT = 2

' Ermittelt das Handle eines Fensters anhand dessen Fenstertitel
'
' sTitel: muss nicht der exakte Fenstertitel sein
' hier kann bspw. auch nur der Anfang des Fenstertitel
' angegeben werden, z.B.: Fenstertitel*
'
Public Function FindWindowHandle(ByVal sTitle As String) As Long
  Dim lngHWnd As Long
  Dim sText As String
  
  ' alle Fenster durchlaufen
  lngHWnd = FindWindow(vbNullString, vbNullString)
  Do While lngHWnd <> 0
    
    ' Fensterttitel ermitteln
    sText = GetWindowTitle(lngHWnd)
    If Len(sText) > 0 And LCase$(sText) Like LCase$(sTitle) Then
      FindWindowHandle = lngHWnd: Exit Do
    End If
    
    ' Nächstes Fenster
    lngHWnd = GetWindow(lngHWnd, GW_HWNDNEXT)
  Loop
End Function

' Hilfsfunktion zum Ermitteln des Fenstertitels
Public Function GetWindowTitle(ByVal hWnd As Long) As String
  Dim lResult As Long
  Dim sTemp As String
  
  lResult = GetWindowTextLength(hWnd) + 1
  sTemp = Space(lResult)
  lResult = GetWindowText(hWnd, sTemp, lResult)
  GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function

Gruß Sepp

Anzeige
AW: MSGBox in Vordergrund von Excel unabhängig
23.10.2009 10:11:14
Excel
Hallo Sepp,
das ist ja sehr untertrieben:"etwas aufwändiger"!
Vielen Dank für die lange Ausarbeitung!! Mit Fenster-Handles habe ich noch überhaupt keine Erfahrung.
Jetzt versuche ich erst mal, deinen Code nachzuvollziehen. Vielleicht kannst du mir eine Doku im Internet empfehlen, wo ich mir die Verwendung von Handles systematisch erschließen kann?
Wenn ich durch bin mit deinem Code, bekommst du Nachricht!
Mit Dank und Gruß
Rüdiger
AW: MSGBox in Vordergrund von Excel unabhängig
23.10.2009 10:41:17
Excel
Hallo Sepp,
hab gerade angefangen mit dem Versuch, deinen Code zu erfassen:
Du hast ja etliche Funktionen aus der User32.dll benutzt. Gibt es eine - nicht zu komplexe - Übersicht über die in der DLL angebotenen Funktionen?
Bei vielen dieser Dokumentationen "sehe ich vor lauter Bäumen den Wald nicht mehr". Jede Möglichkeit ist absolut genau und detailiert erläutert. Der Gesamtzusammenhang geht in einem Wust von Informationen unter.
Kannst du mir da etwas Geeignetes empfehlen?
Gruß
Rüdiger
Anzeige
AW: MSGBox in Vordergrund von Excel unabhängig
23.10.2009 11:20:09
Excel
Hallo nochmal!
Du hast mir ja schon zwei Links angegeben, wo es weitere Infos gibt. Die werde ich mir zuerst mal ansehen. Dürfte erst mal reichen!
Vielen Dank!
Gruß
Rüdiger
AW: MSGBox in Vordergrund von Excel unabhängig
23.10.2009 14:02:43
Excel
Hallo Sepp,
deine beiden Links sind wirklich hervorragend. Das VB-Archiv mit der guten API-Dokumentation und vieles mehr! Genau das, was mir bisher gefehlt hat.
Deinen Code habe ich eingebaut. Bin gerade am Testen.
Frage ist damit erledigt!
Noch mal vielen Dank!
Gruß
Rüdiger

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige