Открыть документ Word и вывести на передний план

Ниже приведен (рабочий) фрагмент кода, который открывает документ Microsoft Word и переходит к определенному индексу из оглавления. filePath - это просто путь к файлу, и strTopic - это значение, которое ссылается на ToC в Word Doc.

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set docWord = objWord.Documents.Open(fileName:=strPath, ReadOnly:=True)

docWord.Bookmarks(strTopic).Range.Select

однако мне нужно вывести документ Word на передний план.

это возможно с VBA во-первых? Есть ли toFront() тип "функция" я могу использовать? AFAIK C# имеет что-то вроде app.ActiveWindow.Activate(); но я не могу сделать ничего подобного работа в vba.

6 ответов


вы можете достичь того, что хотите, используя API. Я использую два API SetForegroundWindow и FindWindow

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

Sub Sample()
    Dim objWord As Object, docWord As Object
    Dim strPath As String, FileName As String
    Dim hwnd As Long

    Set objWord = CreateObject("Word.Application")
    objWord.Visible = True

    '~~> Change this to the relevant Filename and path
    strPath = "C:\Users\Siddharth Rout\Desktop\Sample.docx"
    '~~> Put the acutal file name here without the extension
    FileName = "Sample"

    Set docWord = objWord.Documents.Open(FileName:=strPath, ReadOnly:=True)

    hwnd = FindWindow(vbNullString, FileName & " [Read-Only] - Microsoft Word")

    If hwnd > 0 Then
      SetForegroundWindow (hwnd)
    End If
End Sub

Примечание: если вы уверены, что нет другого приложения Word, кроме того, что вы открыли, то вы можете использовать это, а также:)

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

Sub Sample()
    Dim objWord As Object, docWord As Object
    Dim strPath As String
    Dim hwnd As Long

    Set objWord = CreateObject("Word.Application")
    objWord.Visible = True

    '~~> Change this to the relevant Filename and path
    strPath = "C:\Users\Siddharth Rout\Desktop\Sample.docx"

    Set docWord = objWord.Documents.Open(FileName:=strPath, ReadOnly:=True)

    hwnd = FindWindow("OpusApp", vbNullString)
    If hwnd > 0 Then
      SetForegroundWindow (hwnd)
    End If
End Sub

Как насчет

docWord.Activate

Это должно вывести файл, который был "установлен" для объекта docWord на передний план.

EDIT: протестировал это на Access, тихий ненадежный в Excel. Использование API-это лучший способ, если запущено несколько экземпляров приложения Word.


после открытия документа (или добавления) Вы можете получить Hwnd для передачи функции SetForegroundWindow API из объекта ActiveWindow (например, obWord.ActivieWindow.дескриптор HWND.) Таким образом, вам не нужно искать правильный экземпляр Слова, чтобы вывести на передний план.


также можно использовать AppActivate "Microsoft Word"


посетите центр справки :здесь

использование AppActivate требует точного названия окна, которое вы хотите сфокусировать. Например. для шаблона word 2013, открытого как "добавить", вам нужно будет использовать AppActivate"Document1 - Word"


нашли!

ActiveDocument.Activate 'might not be necessary
ActiveDocument.Windows.Application.WindowState = wdWindowStateMaximize

работает безотказно. У меня уже был "activedocument", над которым я работал.

http://www.access-programmers.co.uk/forums/showthread.php?t=173871


Это, кажется, работает каждый раз. Word работает или нет, несколько документов открыты или нет.

OpenAlready:

On Error GoTo 0
With wrdApp
    .Selection.Goto What:=1, Which:=2, Name:=PageNumber
    .Visible = True
    .Activate '<---seems to work well. regardless of number of Word docs open OR not open.
End With
Set wrdDoc = Nothing
Set wrdApp = Nothing