excel 将上一个打开的窗口(Word文档)置于前台

bnl4lu3b  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(154)

假设我有两个超链接(在excel工作表上)指向两个文档:
例如,我的本地内联网上的A.docB
我将打开第一个文档“A.doc”,然后打开第二个文档“B.doc”

问题是:

如果已经有一个打开的Word文档,然后我点击了超链接(Word文档在我的本地内联网),后面的文件不会自动打开,我必须点击 Flink 的任务栏按钮打开引用的第二个文件。
此问题仅发生在本地Intranet上的Microsoft Word文档中。
如果没有打开的文档,我点击了任何文字超链接,它会正常打开,没有任何问题。
请看这个short video来理解我的问题。
我需要利用Excel中的FollowHyperlink事件或任何其他方法:
将上一个打开的窗口A.doc置于最前面,然后将第二个窗口B.doc置于最前面。
你可能会觉得这是个奇怪的问题!
但是我每次都要手动操作才能显示并把第二个带到前面。
我在Normal-ThisDocument上使用过这个API代码(在Word文档中):

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                   (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Dim LHwnd As Long

Private Sub Document_Open()
    If Application.Documents.Count > 1 Then
       LHwnd = FindWindow("rctrl_renwnd32", Application.ActiveWindow.Caption)
       SetForegroundWindow (LHwnd)
    End If 
End Sub

并在我的Excel工作表上使用了这些代码:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    On Error Resume Next
      Dim objWd As Object
       Set objWd = GetObject(, "Word.Application")
      AppActivate objWd.ActiveWindow.Caption
    Set objWd = Nothing
End Sub

最后,我找到了这个有用的页面Bring an external application window to the foreground
但我不能使它适应我的需要。

llew8vvj

llew8vvj1#

请尝试下一个BeforeDoubleClick事件。如果问题只与超链接有关,它应该工作...

Option Explicit

Private Declare PtrSafe Function SetForegroundWindow Lib "User32" _
                                 (ByVal hWnd As LongPtr) As LongPtr
                                                              
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.column = 1 And Target.Value <> "" Then 'limit this behavior to the first column
        If Dir(Target.Value) <> "" Then
            Cancel = True
             Dim objWd As Object, d As Object, arrD: arrD = Split(Target.Value, ".")
             If LCase(left(arrD(UBound(arrD)), 3)) <> "doc" Then Exit Sub
            On Error Resume Next
                 Set objWd = GetObject(, "Word.Application")    'find the Word open session, if any
            On Error GoTo 0
            If objWd Is Nothing Then
                Set objWd = CreateObject("Word.Application")
            End If
            
            With objWd
                .Visible = True
                Set d = .Documents.Open(Target.Value)
             End With
             
             'force somehow the new open document window expose its handler...
             Dim i As Long
             Do Until objWd.ActiveWindow.Caption = d.name
                    DoEvents: If i >= 10 Then Exit Do 'just in case, if something unexpected happens...
             Loop
             SetForegroundWindow CLngPtr(objWd.ActiveWindow.hWnd)
        End If
    End If
End Sub

它应该工作在64位,但它很容易适应这两种情况,假设它的工作,因为你需要。

相关问题