4Manuals

  • PDF Cloud HOME

为什么Excel因自动化错误而崩溃? Download

    ASP.net,使用WebConfig httpErrors重定向到区域内的控制器不起作用 在多个XML中导出Excel EXCEL评估函数结果不一致 如何通过Selenium C#实现Sharepoint爬网功能? 宏VBA-具有2个Y轴的xlColumnClustered 语法没有错误时,Python程序错误会显示语法错误 Excel VBA用户表单文本框十进制格式 优化刮取和循环 如何调用带有组名或标签的复选框? Excel,XPATH函数和数字格式

这是我的第一篇文章,所以如果我做错了,请不要把我钉在十字架上。

我已经编写了这段代码,该代码可以打开一系列工作簿(打开的工作簿的数量取决于该国家/地区的诊所数量(最多200个)),然后从该工作簿中复制任何问题数据进入宏工作簿。然后,它将处理所有已跟踪的问题,并将它们复制到另一个工作簿中,并将其保存为问题日志。在运行过程中,在某个随机点上,我遇到了一个完全使excel崩溃的自动化错误。我不会在错误线上中断。我没有任何交互或其他警告,并且“自动化错误”没有错误代码,只是带有“确定”和“帮助”按钮的自动化错误。帮助按钮对我没有任何帮助。我尝试设置计时器以打开工作簿。我尝试禁用打开工作簿时可能运行的宏,以加快它们的速度。我已经尝试过逐步执行,但不会产生错误,因此仅当它以全倾斜运行时。

我已经读到这些错误是由于VBA无法引用工作簿对象引起的,因为在与该工作簿关联的对象被调用时它尚未完全“打开”,因此计时和宏终止代码被加入,但无济于事。

有人可以告诉我我做错了什么吗?这是工作,我需要此报告才能正常运行。感谢任何愿意提前帮助的人。

以下是从工作簿中提取问题的代码:

Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long

Sub GetIssues()

    Dim country As String, checkPer As String, CheckMon As String, fiscYear As String, fPath As String, openFile As String, openName As String, clerk As String
    Dim company As Integer, i As Integer, clinic As Integer, checkMonDays As Integer, last As Integer, b As Integer, tableRow As Integer
    Dim setupWS As Worksheet, checkWS As Worksheet, issueWS As Worksheet, valueWS As Worksheet, metaWS As Worksheet, ws As Worksheet
    Dim checkWB As Workbook
    Dim fso As New FileSystemObject
    Dim listObj As ListObject
    Dim issueWSfile As Range, valueWSfile As Range, checkWSRng As Range, checkWSRng2 As Range, dateRange As Range, cell As Range, tableRng As Range, tableRng2 As Range
    Dim startDate As Date, Timer As Date, StartTime As Date, EndTime As Date
    Dim NowTick As Long, EndTick As Long

    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    'previousSecurity = Application.AutomationSecurity
    'Application.AutomationSecurity = msoAutomationSecurityForceDisable

    StartTime = TimeValue(Time)

    Set setupWS = ThisWorkbook.Sheets("Setup")
    Set metaWS = ThisWorkbook.Sheets("Meta Data")
    Set issueWS = ThisWorkbook.Sheets("Issues")
    Set valueWS = ThisWorkbook.Sheets("Values")
    Set dateRange = issueWS.Range("F1:AL1")

    last = metaWS.Cells(Rows.count, "B").End(xlUp).Row
    startDate = DateValue(setupWS.Range("F4").Value)

    Set issueWSfile = issueWS.Range("A2:A" & last)
    Set valueWSfile = valueWS.Range("A2:A" & last)

    issueWS.Range("A2:AK1000,F1:AJ1").ClearContents
    valueWS.Range("A2:AK1000,F1:AJ1").ClearContents
    dateRange.ClearContents

    fPath = Left(ThisWorkbook.Path, Len(ThisWorkbook.Path) - Len("Takings Control Recs"))

    checkPer = Trim(Right(GetIssForm.ComboBox2.Value, 3))
    fiscYear = Left(GetIssForm.ComboBox2.Value, 4)

    If checkPer = "P1" Then
        CheckMon = "Oct"
    ElseIf checkPer = "P2" Then
        CheckMon = "Nov"
    ElseIf checkPer = "P3" Then
        CheckMon = "Dec"
    ElseIf checkPer = "P4" Then
        CheckMon = "Jan"
    ElseIf checkPer = "P5" Then
        CheckMon = "Feb"
    ElseIf checkPer = "P6" Then
        CheckMon = "Mar"
    ElseIf checkPer = "P7" Then
        CheckMon = "Apr"
    ElseIf checkPer = "P8" Then
        CheckMon = "May"
    ElseIf checkPer = "P9" Then
        CheckMon = "Jun"
    ElseIf checkPer = "P10" Then
        CheckMon = "Jul"
    ElseIf checkPer = "P11" Then
        CheckMon = "Aug"
    ElseIf checkPer = "P12" Then
        CheckMon = "Sep"
    End If

    Application.Calculation = xlCalculationAutomatic
    setupWS.Range("F1").Value = checkPer
    Application.Calculation = xlCalculationManual

    If CheckMon = "Jan" Or CheckMon = "Mar" Or CheckMon = "May" Or CheckMon = "Jul" Or CheckMon = "Aug" Or CheckMon = "Oct" Or CheckMon = "Dec" Then
        checkMonDays = 31
    ElseIf CheckMon = "Apr" Or CheckMon = "Jun" Or CheckMon = "Sep" Or CheckMon = "Nov" Then
        checkMonDays = 30
    Else: checkMonDays = 28
    End If

    For b = 1 To checkMonDays
        issueWS.Cells(1, b + 5).Value = startDate
        valueWS.Cells(1, b + 5).Value = startDate
        startDate = startDate + 1
    Next b

    country = GetIssForm.ComboBox3.Value

    'Unload GetIssForm

    For i = 5 To last
        If metaWS.Range("H" & i).Value = country Then
            company = metaWS.Range("D" & i).Value
            clinic = metaWS.Range("B" & i).Value
            clerk = metaWS.Range("F" & i).Value
            openFile = fPath & country & "\" & fiscYear & "\" & checkPer & "\E " & company & "\" & clinic & " " & checkPer & " " & CheckMon & ".xlsb"
            If Dir(openFile) <> "" Then
                openName = fso.getfilename(openFile)
                Set checkWB = Workbooks.Open(openFile)
                'EndTick = GetTickCount + 500
                'Do
                 '   NowTick = GetTickCount
                  '  DoEvents
                'Loop Until NowTick > EndTick
                Set checkWS = checkWB.Sheets("Transaction Hub")
                Set checkWSRng = checkWS.Range("AX11:AX41")
                Set checkWSRng2 = checkWS.Range("AU11:AU41")
                issueWS.Range("A" & i - 3).Value = openFile
                issueWS.Range("B" & i - 3).Value = company
                issueWS.Range("C" & i - 3).Value = clinic
                issueWS.Range("D" & i - 3).Value = clerk
                issueWS.Range("E" & i - 3).Value = country
                valueWS.Range("A" & i - 3).Value = openFile
                valueWS.Range("B" & i - 3).Value = company
                valueWS.Range("C" & i - 3).Value = clinic
                valueWS.Range("D" & i - 3).Value = clerk
                valueWS.Range("E" & i - 3).Value = country
                checkWSRng.Copy
                issueWS.Range("F" & i - 3).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, , True
                checkWSRng2.Copy
                valueWS.Range("F" & i - 3).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, , True
                Application.CutCopyMode = False
                Workbooks(openName).Close False
                Set checkWB = Nothing
            Else: End If
        End If
    Next i

    last = issueWS.Cells(Rows.count, "A").End(xlUp).Row

    Set listObj = issueWS.ListObjects(1)

    listObj.Resize Range("A1:AJ" & last)

    Set listObj = valueWS.ListObjects(1)

    listObj.Resize Range("A1:AJ" & last)

    Set tableRng = issueWS.ListObjects("Table2").Range
    Set tableRng2 = valueWS.ListObjects("Table1").Range

    issueWS.Activate

    For tableRow = tableRng.Row + tableRng.Rows.count - 1 To tableRng.Row Step -1
        If Application.WorksheetFunction.CountA(Rows(tableRow)) = 0 Then Rows(tableRow).EntireRow.Delete
    Next

    valueWS.Activate

    For tableRow = tableRng2.Row + tableRng2.Rows.count - 1 To tableRng2.Row Step -1
        If Application.WorksheetFunction.CountA(Rows(tableRow)) = 0 Then Rows(tableRow).EntireRow.Delete
    Next

    For Each ws In ThisWorkbook.Worksheets
        ws.Activate
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
        Range("A1").Select
    Next ws

    ThisWorkbook.Sheets("Run").Activate

    issueWS.Range("B:D").EntireColumn.AutoFit
    valueWS.Range("B:D").EntireColumn.AutoFit

    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    'Application.AutomationSecurity = previousSecurity

    EndTime = TimeValue(Time)

    Timer = Format(EndTime - StartTime, "hh:mm:ss")

    'MsgBox "Finished in " & -Timer & " seconds", vbOKOnly, "Workbooks Created -"

    Call ReportIssues

End Sub```

And here's the code that creates the issue log:

```Option Explicit

Sub ReportIssues()

    Dim ARow As Long, issuesLastRow As Long, ACol As Long, issuesLastCol As Long, IRow As Long, issuesLastRow2 As Long, issuesLastCol2 As Long
    Dim DateNum As String, Month As String, Year As String, country As String, TestStr As String, answer As String, fPath As String
    Dim issuesWB As Workbook
    Dim ws As Worksheet, issuesWS As Worksheet, valuesWS As Worksheet, dataWS As Worksheet, setupWS As Worksheet
    Dim count As Integer

    Application.EnableEvents = False
    Application.DisplayAlerts = False

    Set dataWS = ThisWorkbook.Sheets("Issues")
    Set setupWS = ThisWorkbook.Sheets("Setup")
    Set valuesWS = ThisWorkbook.Sheets("Values")

    dataWS.Activate

    fPath = ThisWorkbook.Path & "\Issue Logs\"
    Debug.Print fPath
    issuesLastRow = dataWS.Cells(Rows.count, "B").End(xlUp).Row
    issuesLastCol = dataWS.Cells(1, Columns.count).End(xlToLeft).Column
    issuesLastRow2 = valuesWS.Cells(Rows.count, "B").End(xlUp).Row
    issuesLastCol2 = valuesWS.Cells(1, Columns.count).End(xlToLeft).Column
    IRow = 3
    DateNum = Replace(setupWS.Range("D2"), "/", "")
    count = 0
    Application.ScreenUpdating = False

    country = GetIssForm.ComboBox3.Value

    Unload GetIssForm

    Set issuesWB = Workbooks.Open("Z:\Finance\HO European Transformation\15.SSC\Q Track\Build\Issues Sheet Temp.xlsb")
    Set issuesWS = issuesWB.Sheets("Issues")

    dataWS.ListObjects("Table2").Range.AutoFilter Field:=5, Criteria1:=country

    valuesWS.ListObjects("Table1").Range.AutoFilter Field:=5, Criteria1:=country

    If Dir(fPath & country & " " & DateNum & ".xlsb") = "" Then
here:
        For ACol = 6 To issuesLastCol
            For ARow = 2 To issuesLastRow
                If Not IsError(dataWS.Cells(ARow, ACol)) And dataWS.Cells(ARow, ACol) <> 0 And dataWS.Cells(ARow, ACol) <> "" And Len(dataWS.Cells(ARow, ACol)) > 5 And dataWS.Cells(ARow, 5) = country Then 'And dataWS.Cells(1, ACol) < setupWS.Range("D2") Then 'And dataWS.Cells(1, ACol) > setupWS.Range("F4") - 1 Then
                    issuesWS.Cells(IRow, 1) = dataWS.Cells(1, ACol)
                    issuesWS.Cells(IRow, 2) = dataWS.Cells(ARow, 5)
                    issuesWS.Cells(IRow, 3) = dataWS.Cells(ARow, 3)
                    issuesWS.Cells(IRow, 4) = dataWS.Cells(ARow, 2)
                    issuesWS.Cells(IRow, 5) = dataWS.Cells(ARow, ACol)
                    issuesWS.Cells(IRow, 6) = valuesWS.Cells(ARow, ACol)
                    IRow = IRow + 1
                    count = count + 1
                End If
            Next ARow
            ARow = 2
        Next ACol
        If count = 0 Then
        For ACol = 6 To issuesLastCol2
            For ARow = 2 To issuesLastRow2
                If Not IsError(valuesWS.Cells(ARow, ACol)) And valuesWS.Cells(ARow, ACol) <> 0 And valuesWS.Cells(ARow, ACol) <> "" And valuesWS.Cells(ARow, 5) = country Then 'And dataWS.Cells(1, ACol) < setupWS.Range("D2") Then 'And dataWS.Cells(1, ACol) > setupWS.Range("F4") - 1 Then
                    issuesWS.Cells(IRow, 1) = dataWS.Cells(1, ACol)
                    issuesWS.Cells(IRow, 2) = dataWS.Cells(ARow, 5)
                    issuesWS.Cells(IRow, 3) = dataWS.Cells(ARow, 3)
                    issuesWS.Cells(IRow, 4) = dataWS.Cells(ARow, 2)
                    issuesWS.Cells(IRow, 5) = dataWS.Cells(ARow, ACol)
                    issuesWS.Cells(IRow, 6) = valuesWS.Cells(ARow, ACol)
                    IRow = IRow + 1
                    count = count + 1
                End If
            Next ARow
            ARow = 2
        Next ACol
        End If
        With issuesWB
            .SaveAs fPath & country & " " & DateNum & ".xlsb"
            .Activate
            .Close False
        End With
        MsgBox country & " Issue Sheet saved to Issue Log folder.", vbOKOnly, "File Saved -"
    ElseIf Dir(fPath & country & " " & DateNum & ".xlsb") <> "" Then
        answer = MsgBox("Do you wish to overwrite the previous Issue Report file for " & country & "?", vbYesNo, "Existing File -")
        If answer = vbYes Then
            GoTo here:
        ElseIf answer = vbNo Then
            issuesWB.Close False
        End If
    End If

    For Each ws In ThisWorkbook.Worksheets
        ws.Activate
        ActiveWindow.ScrollRow = 1
        ActiveWindow.ScrollColumn = 1
        Range("A1").Select
    Next ws

    ThisWorkbook.Sheets("Run").Activate

    'Unload RepIssForm

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True

End Sub```

0 个答案:

没有答案



Similar searches
    有没有更多的“ pythonic”方式从具有自定义分隔符的列表生成字符串 如何避免在Flask-Admin上编辑拒绝/过滤的记录 NPM错误!我已经在Heroku上部署了ionic应用程序,但是我无法查看它,它不断提示应用程序错误。有人知道如何解决此问题吗? 默认的Webpack配置 如何删除点后的所有符号