打开Word文档并置于前台显示。

7
下面是一个有效的代码片段,它打开了一个微软Word文档,并跳转到目录中特定的索引位置。 filePath是文件路径,strTopic是连接到Word文档目录的值。
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()的“函数”?

9个回答

11

您可以使用API来实现您想要的功能。我正在使用两个API:SetForegroundWindowFindWindow

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

我在运行上述代码时遇到了“远程服务器不存在”的错误(可能有单词open的实例,所以我使用了第一个)。这一行Set docWord = objWord.Documents.Open(FileName:=strPath, ReadOnly:=True)似乎是“问题”的所在。我说“问题”是因为很可能是我忽略了一些显而易见的东西! - RossC
strPath 的值是什么? - Siddharth Rout
已删除,因为内容有点敏感,但基本上是S:(网络驱动器)\blah.dox - RossC
它在本地运行,太棒了,非常感谢。网络问题我可以在这里询问并解决。再次感谢! - RossC
2
我总是更喜欢使用API的方式,因为.Activate不是一种可靠的方法。如果在同一个实例objWord中打开了多个文件但在不同的窗口中,objWord.Activate将无法按预期工作。 - Siddharth Rout
显示剩余3条评论

4

好的,

docWord.Activate

这应该将已经为docWord对象"设置"的文件置于前台。

编辑:在Access上测试通过,在Excel上不太可靠。如果有多个Word应用程序实例运行,使用API是最好的方法。


嗨,非常感谢。只有一个小问题,每次运行这个程序时窗口都不是最大化的状态。使用“wdWindowStateMaximize”似乎很奇怪。这里是否有什么明显的问题?窗口已经置顶了,所以非常好(也非常感谢)。在接受您的答案之前,我想澄清一下是否有遗漏什么! - RossC
3
最简单的可能是 objWord.Activate 吗? - Siddharth Rout
@SiddharthRout,确实更简单;) - PaulFrancis
正确。但是需要注意的是,如果在同一实例objWord中打开了多个文件但在不同的窗口中,则.Activate不是可靠的方法,因为objWord.Activate将无法按预期工作。 ;) - Siddharth Rout
即使Object已经被声明/设置为特定文件,也可能出现这种情况吗?如果使用Word.Application.Activate,则Activate方法可能不会触发正确的文件。如果文件的实例已经设置为docWord对象,则Object.Activate应该仅激活对象的实例,对吧?也许我错了。我将进行简单的测试并找出答案;) - PaulFrancis
显示剩余4条评论

4

打开文档后(或添加文档),您可以从ActiveWindow对象获取Hwnd,以便传递给SetForegroundWindow API函数(例如obWord.ActivieWindow.Hwnd)。这样,您就不需要搜索正确的Word实例来置于前面。


这个完美地运行了!将其合并到被接受的答案中会很有用。 - Jaime de los Hoyos M.

1
这似乎每次都有效。无论 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

1
我在这里还是新手,在对这个特定案例进行了约30分钟的研究后,我认为我可以在这里提供一些帮助...
我在这个链接中找到了这行代码:http://www.vbaexpress.com/forum/showthread.php?27589-bringing-Word-in-fornt-of-Excel Application.ActivateMicrosoftApp xlMicrosoftWord 它将强制将Word置于所有窗口之前,但如果有打开的文档,则会创建一个新文档。所以我发现,如果你想打开某个东西然后将其置于前台,可以使用以下语法:

[...]

Application.ActivateMicrosoftApp xlMicrosoftWord
Word.Documents.Open(MyDocument)

[...]

一旦在 VBA 调试代码时,它将始终在前面,但是当与 Excel VBA 用户窗体一起使用代码时,它运行得很好!我可以看到单词随时改变!

这部分是有效的,但有时似乎会创建一个新文档而不是激活已经打开的文档。 - Mark E.

0

由于".Activate"被多次注释,但至少对于我来说,从Excel中调用它以将Word文档带到前台。我不得不采取一个绕过的方法,最小化和最大化窗口。直到现在,这对我来说运作良好:

Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
wdApp.ScreenUpdating = True
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\" & stWordDocument) 'update your path
wdDoc.Activate
ActiveDocument.ActiveWindow _
.WindowState = wdWindowStateMinimize
ActiveDocument.ActiveWindow _
.WindowState = wdWindowStateMaximize

0

我只是使用;

FileAndPath = "C:\temp\Mydocument.docx"
ThisWorkbook.FollowHyperlink (FileAndPath)

即使文件已经打开,它也可以正常工作。


0

可以使用AppActivate "Microsoft Word"。


访问Microsoft帮助:这里

使用AppActivate需要确切的窗口标题,以便将焦点放在所需窗口上。例如,对于作为“添加”的Word 2013模板,您必须使用AppActivate "Document1 - Word"。


我不建议这样做。如果有多个 MS Word 实例打开呢? - Siddharth Rout

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接