【发布时间】:2018-09-14 14:30:23
【问题描述】:
单元格 A3 包含文件夹路径。下面的单元格包含带有扩展名的文件名。选择下面的单元格后,我的 Excel 宏会在文件资源管理器中打开该文件的位置,并在该文件夹中的多个文件中选择这个特定的文件,可以在预览中看到。在电子表格中选择包含另一个文件名的下一个单元格时,将打开另一个文件资源管理器窗口,即使它与 A3 的路径相同。寻找要添加的代码行,它将首先关闭第一个文件资源管理器窗口,然后再打开一个新窗口。代码需要从多个打开的文件资源管理器窗口中关闭单元格 A3 中的特定文件资源管理器窗口。我到目前为止的代码
更新:运行下面的代码,但它不会关闭现有打开的文件夹,只是打开另一个:
If Target.Column = 1 And Target.Row > 5 Then
Call CloseWindow
Shell "C:\Windows\explorer.exe /select," & Range("A3") & ActiveCell(1, 1).Value, vbNormalFocus 'this works, but opens NEW folder every time
在单独的模块中:
'BELOW GOES WITH Public Sub CloseWindow() FROM: https://stackoverflow.com/questions/49649663/close-folder-opened-through-explorer-exe
Option Explicit
''for 64-bit Excel use
'Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
' (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Long) As LongPtr
''for 32-bit Excel use
'Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
' (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
'To make it compatible with both 64 and 32 bit Excel you can use
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Long) As LongPtr
#Else
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
#End If
'Note that one of these will be marked in red as compile error but the code will still run.
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060
Public Sub CloseWindow()
Dim sh As Object
Set sh = CreateObject("shell.application")
Dim w As Variant
For Each w In sh.Windows
'print all locations in the intermediate window
Debug.Print w.LocationURL
' select correct shell window by LocationURL
' If w.LocationURL = "file://sharepoint.com@SSL/DavWWWRoot/sites/folder" Then
'If w.LocationURL = "Range("M1").value" Then
If w.LocationURL = "file://K:/ppp/xx/yy/1 - zzz" Then
SendMessage w.hWnd, WM_SYSCOMMAND, SC_CLOSE, 0
End If
Next w
End Sub
更新 2:
然而,我现在在想,最好的解决方案实际上可能不是关闭文件资源管理器然后打开它,而是让代码识别已经有一个打开的文件资源管理器窗口,其路径来自单元格 A3 并且既不关闭它也不要打开一个新文件,而只需选择与在已打开的文件资源管理器窗口中单击的新单元格相对应的新文件,路径来自单元格 A3。有人能想出办法吗?
【问题讨论】:
-
@BigBen - Shell "C:\Windows\explorer.exe /select," & Range("A3") & ActiveCell(1, 1).Value, vbNormalFocus '这工作,但打开新每次文件夹
-
@BigBen - 谢谢,完成
-
@Pᴇʜ - 你能帮忙解决这个问题吗?