如何"更新"工作簿而不是重新打开它(使用VBA宏)?

pha*_*anx 5 excel vba excel-vba

我的下面的代码有问题:

Private Sub Worksheet_BeforeDoubleClick(ByVal...
Application.ScreenUpdating = False
Set wbks = Workbooks.Open("\\whatever\whatever.xlsx")           
wbks.Sheets("Control").Activate
ActiveSheet.Range("A3").Select 
Application.ScreenUpdating = True
...
Run Code Online (Sandbox Code Playgroud)

如您所见,每次双击某个单元格时,它都会打开一个工作簿.问题是:在我第二次双击后,我收到了令人讨厌的消息:

"'Filename.xlsx'已经打开.重新打开会导致您所做的任何更改被丢弃......"

¿如何关闭此消息(因为未进行任何更改),如果可能,在每次双击而不是"重新打开"后使目标工作簿"更新"?

Dou*_*ncy 6

您可以使用一个函数来检查它是否已经打开:

Function WorkbookIsOpen(wb_name As String) As Boolean

On Error Resume Next
WorkbookIsOpen = CBool(Len(Workbooks(wb_name).Name) > 0)
End Function
Run Code Online (Sandbox Code Playgroud)

然后在你的程序中,这样称呼它:

Private Sub Worksheet_BeforeDoubleClick(ByVal...
Application.ScreenUpdating = False
If WorkbookIsOpen("whatever.xlsx") then
    Set wbks = Workbooks("whatever.xlsx")
Else
    Set wbks = Workbooks.Open("\\whatever\whatever.xlsx")
End If      
wbks.Sheets("Control").Activate
ActiveSheet.Range("A3").Select 
Application.ScreenUpdating = True
Run Code Online (Sandbox Code Playgroud)

编辑:如果你真的想发疯,你可以使用这个函数检查文件是否存在,Nothing如果没有则返回,否则返回Workbook,稍微扩展上面的逻辑:

Function GetWorkbook(WbFullName As String) As Excel.Workbook

'checks whether workbook exists
'if no, returns nothing
'if yes and already open, returns wb
'if yes and not open, opens and returns workbook
Dim WbName As String

WbName = Mid(WbFullName, InStrRev(WbFullName, Application.PathSeparator) + 1)
If Not WorkbookIsOpen(WbName) Then
    If FileExists(WbFullName) Then
        Set GetWorkbook = Workbooks.Open(Filename:=WbFullName, UpdateLinks:=False, ReadOnly:=True)
    Else
        Set GetWorkbook = Nothing
    End If
Else
    Set GetWorkbook = Workbooks(WbName)
End If
End Function
Run Code Online (Sandbox Code Playgroud)

除了WorkbookIsOpen上面的函数,它使用这个:

Function FileExists(strFileName As String) As Boolean

If Dir(pathname:=strFileName, Attributes:=vbNormal) <> "" Then
    FileExists = True
End If
End Function
Run Code Online (Sandbox Code Playgroud)

你可以在你的程序中使用它,如:

Private Sub Worksheet_BeforeDoubleClick(ByVal...
Application.ScreenUpdating = False
Set wbks = GetWorkbook("\\whatever\whatever.xlsx")
If wbks is Nothing Then
    MsgBox "That's funny, it was just here"
    'exit sub gracefully
End If
wbks.Sheets("Control").Activate
ActiveSheet.Range("A3").Select 
Application.ScreenUpdating = True
Run Code Online (Sandbox Code Playgroud)