打开Word文档并带到前面

时间:2014-08-18 11:46:14

标签: excel vba excel-vba ms-word

下面是一个(工作)代码片段,它打开一个Microsoft Word文档,并转到目录中的特定索引。 filePath只是一个文件路径,strTopic是一个链接到Word文档中ToC的值。

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();之类的东西,但我无法在中找到类似的东西。

9 个答案:

答案 0 :(得分:10)

您可以使用API​​S实现您想要的效果。我使用了两个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

答案 1 :(得分:5)

怎么样,

docWord.Activate

这应该将docWord对象的“Set”文件带到前台。

编辑:在Access上测试过,在Excel上安静不可靠。如果运行Word应用程序的多个实例,则使用API​​是最佳方法。

答案 2 :(得分:1)

也可以使用AppActivate“Microsoft Word”


访问Microsoft帮助:here

使用AppActivate需要您想要关注的窗口的确切标题。例如。对于作为“添加”打开的单词2013模板,您将不得不使用AppActivate“Document1 - Word”

答案 3 :(得分:1)

一旦打开文档(或添加了一个文档),就可以从Httnd传递到ActiveWindow对象的SetForegroundWindow API函数(例如obWord.ActivieWindow.Hwnd)。这样,您就不需要搜索正确的Word实例。

答案 4 :(得分:0)

发现!

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

完美无瑕。我已经有了一个" activedocument"我正在努力。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我在这里很新,并且在对此特定案例进行了大约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用户格式一起使用时,效果很好!我可以看到单词立即改变了单词!!!!

答案 7 :(得分:0)

我只是用;

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

如果文件已经打开,它甚至可以工作。

答案 8 :(得分: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