Открыть документ 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