Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 我可以判断一个文件是由本地宏打开的吗?或者,我可以找到一个实例文件的调用方或父对象是谁吗?_Excel_Vba - Fatal编程技术网

Excel 我可以判断一个文件是由本地宏打开的吗?或者,我可以找到一个实例文件的调用方或父对象是谁吗?

Excel 我可以判断一个文件是由本地宏打开的吗?或者,我可以找到一个实例文件的调用方或父对象是谁吗?,excel,vba,Excel,Vba,当且仅当目标文件已关闭或由本地VBA宏打开时,我希望运行特定的代码段。如果文件由网络上的其他用户打开,则代码不应运行 到目前为止,我有以下测试代码: Sub refreshAll() Dim wbIsOpen As Boolean, wbIsOpenByMe As Boolean Dim fileName As String, filePath As String Dim testWb As Workbook fileName = "test.xlsm"

当且仅当目标文件已关闭或由本地VBA宏打开时,我希望运行特定的代码段。如果文件由网络上的其他用户打开,则代码不应运行

到目前为止,我有以下测试代码:

Sub refreshAll()
    Dim wbIsOpen As Boolean, wbIsOpenByMe As Boolean
    Dim fileName As String, filePath As String
    Dim testWb As Workbook

    fileName = "test.xlsm"

    If IsWorkBookOpen(ThisWorkbook.Path & "\" & fileName) Then wbIsOpen = True

    On Error Resume Next
    Set testWb = Workbooks(fileName)
    If Not testWb Is Nothing Then wbIsOpenByMe = True
    Err.Clear
    On Error GoTo 0

    If wbIsOpen = False Or wbIsOpenByMe = True Then
        ThisWorkbook.Connections("testcon").OLEDBConnection.BackgroundQuery = False
        ThisWorkbook.refreshAll
        DoEvents
    End If
End Sub

这种变通方法可以正常工作,但它不能判断文件是手动打开的还是由某个编程代理打开的。有没有一种方法可以做到这一点,或者有没有一种更简单的方法可以做到我在代码中尝试过的事情?

如果您知道可以打开文件的宏,您有权限吗?也许只是让宏在工作簿中更改一些受保护的值-即:让它将该时刻的日期和时间添加到隐藏形状的标题中。然后,该宏可以检查标题上的日期和时间是否与处理时间误差范围内的当前日期和时间匹配

这可能会产生如下效果:

Sub MacroWhichCouldHaveBeenUsedToOpenWorkbook()

    'Other code
    'Code to open target workbook

    Workbooks("TargetWorkbook.xlsx").Sheets(1).Shapes(1).Title = Now()

End Sub

Sub RunIfAutoOpened()

    If (Now + #0:00:05#) < Workbooks("TargetWorkbook.xlsx").Sheets(1).Shapes(1).Title Then
        'Run desired code
    End If

End Sub

无法判断当前实例中打开的工作簿是由用户打开的还是由代码打开的,除非代码设置了某种标志。为什么它会产生不同的影响?只有在中心文件调用此工作簿时,它才需要在特定条件下执行某些计算并刷新某些数据连接。如果无法读取文件是否由vba打开,我必须添加一些冗长的冗余。必要性源于连接刷新:如果在尝试刷新时数据连接的源不可用,Excel会尝试打开文件的本地副本,这会中断宏的流。因此,我必须编写一个例程来捕捉这种情况,并在后台打开该文件,以避免代码halt.cont。我担心调用文件会调用正在打开的工作簿本地的任何宏,因为在打开工作簿之前调用宏之前,我遇到了时间问题,所以我求助于将宏初始化放在正在打开的文件的工作簿中。因此,我想知道是谁/什么打开了这个文件。我很困惑。为什么数据源工作簿是由用户打开还是由代码打开很重要?如果它是打开的,那么它就是打开的。这些文件都可以在网络共享上使用,并且可以由任意数量的用户打开。如果文件是通过代码打开的,我保证这两个文件是彼此本地的,并且不会遇到代码暂停。但是,如果一个人打开了文件A,另一个人打开了文件B,文件A将很忙,并且不是文件B的本地副本,导致文件B想要打开文件A的本地副本。这会导致代码暂停,我必须解决这个问题。我正在使用工作簿_open启动宏,因此,我认为在另一个宏运行之前,调用方无法写入单元格。但我会记住这一点,也许可以一起破解一些东西。我要到星期一才能测试它,但感谢您迄今为止的输入。如何-在可能已打开或未打开工作簿的宏中,首先更改旧工作簿中形状的属性,然后运行工作簿打开命令。然后在“工作簿\打开”事件下,检查a上一个工作簿是否打开,b形状上该工作簿中的计时器指示工作簿打开宏已运行。这是一种更明智的查看方式。。。我有点不高兴,我没想到这一点。当我有机会尝试的时候,我会回来看看的!