首页 > 解决方案 > excel vba卡在某个点

问题描述

我有一个 32 位 excel 2016。excel 有一个专有的附加组件,允许查询专有数据库。附加组件包括一个函数 DvCHRaw(),它返回一个数据数组。

我正在写一个列出查询条件的母亲 excel vba。vba 倾向于打开新工作簿并执行查询然后关闭工作簿。例如,我将每天循环 1000 列,循环 10 天。我会将每天的数据保存在自己的文件夹中,其中包含 1000 个 csv 文件。

但是,excel 会卡在某个时间点,例如 9 天或 5 天。尽管我在工作簿关闭后设置了 wb = nothing,但不确定这是否与内存相关。

有人可以在这里帮忙吗?

这是我写的代码

Sub raw_data_extract()

    Set StartDate = Range("B1")
    nextdate = StartDate
    Set EndDate = Range("B2")


    Do While nextdate <= EndDate
        Set tagname = Range("E1")
    
        savedate = Month(nextdate) & "-" & Day(nextdate) & "-" & Year(nextdate)
        newfolderpath = "D:\rawdata\" & savedate
        
        
        If Dir(newfolderpath, vbDirectory) = "" Then
            MkDir (newfolderpath)
        End If
        
        
        Do While tagname.Value <> ""
            Set wb = Workbooks.Add()
            Range("A1").Value = nextdate
            Range("B1").Value = tagname
            Range("C1").Value = "=ROWS(DvCHRaw(""APP"",B1,FALSE,""Timestamp;Value"",""Local"",A$1,A$1+1,0,0,-1))"
            
            Set arraystart = Range("A2")
            Set arrayend = arraystart.Offset(Range("C1") - 1, 1)
            
            Range(arraystart, arrayend).FormulaArray = "=DvCHRaw(""APP"",B1,FALSE,""Timestamp;Value"",""Local"",A$1,A$1+1,0,0,-1)"
            Range("C1").Clear
            
            Range("A2").Select
            Range(Selection, Selection.End(xlDown)).NumberFormat = "m/d/yyyy h:mm:ss.000"
            
            
            Range("A1").CurrentRegion.Select
            Selection.Copy
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            
            Application.DisplayAlerts = False
            replaceslash = Replace(tagname, "/", "#")
            replaceslashdot = Replace(replaceslash, ".", "#")
            
            newname = replaceslashdot & "_" & savedate
            Application.ActiveWorkbook.SaveAs newfolderpath & "\" & newname, xlCSV
            
            Application.DisplayAlerts = True
            ActiveWorkbook.Close savechanges = False
            
            Set tagname = tagname.Offset(1, 0)
            
            Set wb = Nothing
    
        Loop
        nextdate = nextdate + 1
    Loop
    
    MsgBox "Your Automated Task successfully ran at " & TimeValue(Now), vbInformation
    
    Application.DisplayAlerts = False
    ActiveWorkbook.Close
    Application.DisplayAlerts = True

End Sub

标签: excelvba

解决方案


是的,这很可能是内存问题。

您最好每天使用任务计划程序打开您的 .xlsm 或 .xlsb 文件。这不是对您问题的确切答案,而是会有所帮助的解决方案。完成后请记住将其包含在宏Application.Quit代码中。

  1. 打开开始。
  2. 搜索任务计划程序,然后单击顶部结果以打开体验。
  3. 右键单击“任务计划程序库”分支,然后选择“新建文件夹”选项。
  4. 键入文件夹的名称。例如,我的任务。
  5. 单击确定按钮。
  6. 展开“任务计划程序库”分支,然后选择 MyTasks 文件夹。
  7. 单击操作菜单。
  8. 选择创建基本任务选项。
  9. 在“名称”字段中,键入任务的简短描述性名称。
  10. 单击下一步按钮。
  11. 选择每日选项。
  12. 单击下一步按钮。
  13. 选择启动程序选项以执行脚本/Excel 文件。
  14. 在“程序/脚本”字段中,指定 Excel 文件的路径。
  15. 单击完成按钮。

你完成了

而且,你不会后悔的。我敢打赌,你会更频繁地开始使用任务调度程序来进行其他自动化,因为它有各种触发器,并且独立于任何运行或不运行的应用程序。

关于 Excel 的简短说明

无论如何,Excel 在很长一段时间后都有挂断的倾向,很难说出原因。在我个人看来,这是一个如此庞大但出色的应用程序,开发人员多年来一直在摸索如何解决这些问题。尽管如此,微软的主要关注点是让一切变得更简单、更直观和云集成。

最重要的是,VBA 很久以前就被放弃了,并被 Microsoft 视为遗留解决方案。尽管自 v. 2010 以来出现了新版本的 Excel,但没有包含其他功能。如果我没记错的话,那么在 MS Office 包中它仍然是 6.0 版。他们只是不会杀死它,因为对于许多企业来说,依赖于(有时是优秀且非常专业的)重要的宏,这些宏不能轻易地用用 JS 编写的新扩展范例替换(或根本不能)以便在任何地方工作。

祝你好运!

有问题?在评论部分问我任何事情。


推荐阅读