我正在尝试在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;是",这抹去了我写的所有评论。
因此,我想问的是,如果实时数据文件已经打开,只需将其设置为使任务计划程序中的任务不会运行。
答案 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