优化Excel VBA脚本

时间:2014-03-25 14:20:51

标签: excel excel-vba vba

我已经在Excel工作表中有一个脚本。我在下面提到过:

Sub Auto_Open()
'
' Auto_Open Macro
'
ActiveWorkbook.RefreshAll
'
End Sub


Private Sub Workbook_Open()
   Worksheets("Sheet2").Range("A4:BX33").Copy
   Worksheets("November").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet2").Range("A34:BX64").Copy
   Worksheets("December").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet2").Range("A65:BX95").Copy
   Worksheets("January").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet2").Range("A96:BX123").Copy
   Worksheets("February").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet2").Range("A124:BX154").Copy
   Worksheets("March").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet3").Range("A2:BX100").Copy
   Worksheets("Weekly").Range("C3").PasteSpecial Transpose:=True

   Worksheets("Sheet4").Range("A2:DZ100").Copy
   Worksheets("Monthly Figures").Range("C2").PasteSpecial Transpose:=True

   Worksheets("Sheet5").Range("A2:BX100").Copy
   Worksheets("All Time Figures").Range("C1").PasteSpecial Transpose:=True

   Application.CutCopyMode = False 
End Sub

感谢SO上的优秀人才,这段代码非常棒。现在我要添加的附加功能是:

a)在上午6点自动打开此表。每天。 b)在Excel中没有任何提示的情况下保存它。 c)关闭工作表。

我在网上搜索并提出了这些解决方案:

Private Sub Workbook_Open()
    Application.OnTime TimeValue("15:00:00"), "mymacro"
End Sub

Workbooks.Open Filename:="C:\test.xls"

Workbooks("Test.xls").Close

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub

请告知如何将上述给定的想法整合到我现有的脚本中以及如何优化脚本。

我正面对当前脚本的一个问题是,在数据刷新结束之前,会发生转置。无论如何也要解决这个问题。

提前感谢您的帮助。

关于, 马努斯

3 个答案:

答案 0 :(得分:1)

你想要做一些事情:

  1. 将代码从Workbook_Open移动到模块文件
  2. 编写一个VBScript文件,用于打开工作簿,执行子例程,然后在保存后关闭Excel
  3. 创建执行VBScript文件的任务
  4. 以下是代码,将其放在工作簿中的新模块中

    Option Explicit
    
    Public Sub DoWork()
    
        ThisWorkbook.RefreshAll
    
        Worksheets("Sheet2").Range("A4:BX33").Copy
        Worksheets("November").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet2").Range("A34:BX64").Copy
        Worksheets("December").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet2").Range("A65:BX95").Copy
        Worksheets("January").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet2").Range("A96:BX123").Copy
        Worksheets("February").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet2").Range("A124:BX154").Copy
        Worksheets("March").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet3").Range("A2:BX100").Copy
        Worksheets("Weekly").Range("C3").PasteSpecial Transpose:=True
    
        Worksheets("Sheet4").Range("A2:DZ100").Copy
        Worksheets("Monthly Figures").Range("C2").PasteSpecial Transpose:=True
    
        Worksheets("Sheet5").Range("A2:BX100").Copy
        Worksheets("All Time Figures").Range("C1").PasteSpecial Transpose:=True
    
        Application.CutCopyMode = False
    
    End Sub
    

    然后你想要创建一个VBScript文件来打开你的工作簿(任务计划程序只有打开文件本身就会出现问题,事情可能会变得很糟糕)。

    Dim objExcel
    
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Workbooks.Open("path to your workbook here")
    
    objExcel.Visible = False
    objExcel.DisplayAlerts = False
    
    objExcel.Run "DoWork"
    
    objExcel.ActiveWorkbook.Save
    objExcel.ActiveWorkbook.Close(0)
    objExcel.Quit
    

    保存在某处,无所谓,只记得它。现在您要创建一个将执行该VBScript文件的任务。

    1. 打开任务计划程序(控制面板 - >管理工具 - >任务计划程序)
    2. 点击右侧面板中的“创建基本任务...”
    3. 给它起一个名字和描述。单击“下一步”。
    4. 告诉它触发“每日”。点击下一步。给它一个开始日期以及你希望它每天运行的时间。告诉它每天都要复发。单击“下一步”。
    5. 选择“启动程序”。单击“下一步”。
    6. 在程序/脚本框中,输入VBScript文件的路径。
    7. 你很高兴,这个任务现在每天都会在你指定的那天开始运行。该任务将执行脚本,该脚本将在后台创建一个新的Excel实例(不干扰您正在做的任何事情),运行您的更新,保存并关闭。

答案 1 :(得分:0)

一块蛋糕,只需从第二个子调用第一个子。你可以通过将sub分成两个单独的subs来解决刷新之前的转置。我还建议您在子开头关闭更新并在结束时重新打开它们。像这样:

Private Sub updatetoggleoff()

    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

End Sub
Private Sub updatetoggleon()

    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

Private Sub Workbook_Open()

updatetoggleoff

Application.OnTime TimeValue("15:00:00"), "mymacro"
End Sub

Workbooks.Open Filename:="C:\test.xls"

Auto_Open

updatetoggleon

Workbooks("Test.xls").Close

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub

答案 2 :(得分:0)

创建由任务计划程序触发的VBS脚本。

使用记事本将其粘贴到名为TEST.VBS

的文件中
Set objExcel = CreateObject("Excel.Application") 
Set objWorkbook = objExcel.Workbooks.Open("C:\test.xlsx") 
objworkbook.Application.DisplayAlerts = False
objExcel.Calculate
objexcel.Save
objexcel.quit 

创建任务计划程序事件,每天早上6点运行TEST.VBS。

程序:wscript.exe

参数:c:\ test.vbs // B