文件打开时停止运行任务

时间:2014-09-18 03:18:18

标签: excel-vba scheduled-tasks vba excel

我正在尝试在Window的任务计划程序中安排一个任务,打开一个excel文件并在其中自动运行宏。

宏部分已全部完成,但我遇到的一个问题是文件已经打开并且计划任务运行。每当发生这种情况时,它会询问您是否要重新打开该文件,如果我意外地单击是,实际发生的那样,那么我正在处理的数据将全部消失。

所以我想要的是在文件打开时不运行任务。我需要运行脚本吗?用代码创建一个批处理文件?如果可能的话,你可以提供一个可以做到这一点的代码,因为除了VBA之外我不熟悉另一种语言

注意即可。 为了澄清,我有一个文件不断从Live Bloomberg中提取数据。我想做的是将其保存为另一本工作簿,以供每天下午4:30参考。有一些问题。 以下是我在ThisWorkbook中所写的内容,以便更容易理解我想要完成的内容

Private Sub Workbook_Open()
    Application.OnTime TimeValue("16:30:00"), "MyMacro"
End Sub

1)如果那天我没有打开那个excel,那么Workbook_Open()根本就不会运行。

2)即使我打开excel,如果我在下午4:30之前关闭Excel,宏也不会运行

所以我想要的是让Windows任务调度程序不断为我打开excel文件,无论发生什么事情都会按时运行。

还有其他问题。我总是在实时数据文件中写注释和内容,因此如果任务计划程序尝试打开数据文件,而我在使用它时会激活Workbook_Open(),则会出现一个弹出窗口,询问我是否要重新打开文件。当然我只需要按" no"那么任务就会停止,一切都很好。但是,如果我不按按钮怎么办?还有一次,我不小心按了#34;是",这抹去了我写的所有评论。

因此,我想问的是,如果实时数据文件已经打开,只需将其设置为使任务计划程序中的任务不会运行。

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用Workbook.ReadOnly Property?这并不能确切地告诉您文件是否已打开,但它会告诉您是否具有写访问权限。尝试:

Public Sub OnlyRunWithWriteAccess()
    Dim oBook As Workbook
    Set oBook = Application.ActiveWorkbook

    If Not oBook.ReadOnly Then
        'Your processing code goes here...
    End If
    Set oBook = Nothing

End Sub

答案 1 :(得分:0)

首先感谢Steve S的意见。

我已经做了一个解决方法。我没有让LiveData文件运行宏,而是将宏放在干净的Excel模板上,让任务调度程序打开该文件。这种方式更加可靠,并且可以跳过任务调度程序中的所有" Scripting"的事情。

这是我更新的代码:

'In ThisWorkbook
Public Sub Workbook_Open()
    Run "AutoSaveAs"
End Sub


'In Module1
Public Sub AutoSaveAs()
    Application.ScreenUpdating = False

    Dim LDSP As String
    Dim IsOTF
    Dim LDS, TWB As Workbook

    'Set LiveDealSheet file path
    'Check if LiveDealSheet is already open
    LDSP = "I:\LiveDealSheet\LiveDealSheet.xlsm"
    IsOTF = IsWorkBookOpen(LDSP)

    'Set quick workbook shortcut
    Set TWB = ThisWorkbook
    If IsOTF = False Then
        Set LDS = Workbooks.Open(LDSP)
    Else
        Workbooks("LiveDealSheet.xlsm").Activate
        Set LDS = ActiveWorkbook
    End If

    'Copy all data from LIVE Deals to TWB
    LDS.Sheets("LIVE Deals").Cells.Select
    Selection.Copy
    TWB.Sheets(1).Cells.PasteSpecial (xlValues)
    TWB.Sheets(1).Cells.PasteSpecial (xlFormats)


    TWB.SaveAs FileName:="I:\LiveDealSheet\" & Format(Date, "yyyymmdd") & " LiveDealSheet", FileFormat:=52

    If IsOTF = False Then
        LDS.Close False
        TWB.Close False
    Else
        TWB.Close False
    End If

    Application.ScreenUpdating = True
End Sub

Function IsWorkBookOpen(FileName As String)
    Dim ff As Long, ErrNo As Long

    On Error Resume Next
    ff = FreeFile()
    Open FileName For Input Lock Read As #ff
    Close ff
    ErrNo = Err
    On Error GoTo 0

    Select Case ErrNo
    Case 0:    IsWorkBookOpen = False
    Case 70:   IsWorkBookOpen = True
    Case Else: Error ErrNo
    End Select
End Function