FilePicker в макросе открывает диалоговое окно в фоновом режиме - PullRequest
0 голосов
/ 06 ноября 2019

Я разработал макрос Outlook, который позволяет пользователю выбирать и открывать файл Excel.

Проблема в том, что диалоговое окно файла открывается не над всем, а в фоновом режиме. Таким образом, для пользователя это выглядит так, как будто приложение Outlook застряло, в то время как оно просто ждет, пока пользователь выберет файл в диалоговом окне Filepicker за всеми остальными окнами.

Вот код:

Dim SigFolder2 As String
Dim fd As Office.FileDialog
Dim selectedItem As Variant
Dim ExcelFileName As String
Dim FileName As String
Dim objExcel As New Excel.Application
Dim exWb As Excel.Workbook


'Suggested Folder--Downloads
SigFolder2 = "C:\Users\" & Environ("UserName") & "\Downloads\"

'Dialog Settings

Set fd = objExcel.FileDialog(msoFileDialogFilePicker)
With fd
.Filters.Clear
 .InitialFileName = SigFolder2
 .AllowMultiSelect = False
 .Title = "Select Signature File"
End With

'Getting the file
If fd.Show = -1 Then
    For Each selectedItem In fd.SelectedItems
        SigFolder = selectedItem
    Next
Else
Exit Sub
End If

ExcelFileName = SigFolder
FileName = Left(fso.GetFileName(ExcelFileName), InStr(fso.GetFileName(ExcelFileName), ".") - 1)
Debug.Print ExcelFileName 'file Path with filename

Есть ли способ исправить это?

1 Ответ

1 голос
/ 06 ноября 2019

Проблема вызвана тем, что окна Excel ничего не знают о окнах Outlook. Вы должны установить родительское окно в диалоговое окно вашего дочернего окна, если вы хотите, чтобы оно всегда оставалось поверх другого окна. Например:

Public Declare Function SetForegroundWindow _
Lib "user32" (ByVal hwnd As Long) As Long

Public Sub Bring_to_front()
    Dim setFocus As Long

    ThisWorkbook.Worksheets("Sheet1").Activate
    setfocus = SetForegroundWindow(Application.hwnd)
End Sub

В вашем случае это будет диалоговое окно:

Private Declare Function FindWindowA Lib "user32" (ByVal class As String, ByVal caption As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal win As Long) As Long

Dim hxl As Long

Set objExcel = New Excel.Application
Set fd = xl.FileDialog(msoFileDialogFilePicker)
hxl = FindWindowA("XLMAIN", "Excel")
If (hxl <> 0) Then
    res = SetForegroundWindow(hxl)
End If
With fd
.Filters.Clear
 .InitialFileName = SigFolder2
 .AllowMultiSelect = False
 .Title = "Select Signature File"
End With
res = fd.Show
...