Excel VBA 调试器在没有错误或警告的情况下停止

Excel VBA debugger stops without error or warning

在尝试测试一些代码时,我遇到了一个我以前不记得 运行 的问题。当我单步执行代码时,它在 ClearContents 行后停止...没有错误,没有警告,什么都没有。

Public Sub CreateCurMth(wsCur As Worksheet)
Dim iData As Integer, iRow As Integer
Dim wbData As Workbook
On Error GoTo err_here

  iRow = wsCur.Cells(Rows.Count, 1).End(xlUp).Row
  wsCur.Range("A10:X" & iRow).ClearContents  '<----- Fails after this line

'Assume that file is already open
  Set wbData = Workbooks("qReport.xlsx")
  ... etc
err_here:
  Beep
End Sub

wsCur 是在调用子中分配的作品sheet。该代码准确地 returns iRow 作为 wsCur 上最后使用的行。此外,内容被清除......因此该行执行正常。它死后不会发出哔哔声。我在 Beep 上也有一个断点,它永远不会被击中。

所以,就像我输入问题时经常发生的事情一样...我不断尝试,通常最终会在尝试完整记录我的问题时找到我的答案。这次半体面的结果......我找不到任何理由,上面的代码现在可以工作......但是,我在 VBA 的其他部分仍然遇到同样的问题,这些问题与上面的部分。我已经在这个项目上工作了一个星期左右,今天之前的所有测试,这段代码都有效......或者至少像通常预期的那样出错。

每次调试器停止时,都没有错误也没有警告。失败的线路甚至没有任何共同点。所以我只能假设我的系统是不是环境问题。

我进行了搜索和 Google 搜索,但没有得到任何答案。我希望这里有人以前遇到过这个问题并解决了它,或者至少可以指出正确的方向。

我的代码编译没有错误。这是当前暂停的行:

wsTemp.Delete

临时工作sheet 被删除...然后停止。

编辑: 好吧,所以我认为这只是一个损坏的 Excel 文件,并且执行打开和修复解决了几个小时。但是现在我遇到了同样的问题,调试器在

之后失败
wsTemp.Delete

我打开了“工具”>“选项”>“常规”>“出现所有错误时中断”,但我仍然没有收到任何错误和警告...代码单步执行只是暂停。

为了彻底...这是直到失败点的整个过程:

'Creates combined joblist from last and current month
Sub CreateCompareList(wsCur As Worksheet, wsLast As Worksheet, wsComp As Worksheet)
Dim wsTemp As Worksheet
Dim lLastRow As Long, lCurRow As Long, lLMRow As Long
Dim iCol As Integer, x As Integer

  wsComp.Unprotect SheetPwd
  lLastRow = wsComp.Cells(Rows.Count, 27).End(xlUp).Row         'Get the last row
  If lLastRow = 9 Then
    'No data on sheet - Don't ruin headers
  Else
    wsComp.Rows("10:" & lLastRow).ClearContents                 'Clear that section of Job names and numbers
  End If
  Set wsTemp = Worksheets.Add                                   'Add a Temp Sheet to filter jobs

  lCurRow = wsCur.[A10].End(xlDown).Row                         'Get the last row
  wsCur.Range("A10:B" & lCurRow).Copy                           'Grab all jobs for the current month
  wsTemp.[A1].PasteSpecial                                      'Paste job list from Current Month
  Application.CutCopyMode = False

  lLMRow = wsLast.[A10].End(xlDown).Row                         'Get the last row
  wsLast.Range("A10:B" & lLMRow).Copy                           'Grab all jobs from the Last month
  lLastRow = wsTemp.[A1].End(xlDown).Row                        'Get the last row
  wsTemp.Cells(lLastRow + 1, 1).PasteSpecial                    'Paste jobs from last month below jobs from current month
  Application.CutCopyMode = False

  lLastRow = wsTemp.[A1].End(xlDown).Row                        'Get new last row
  'Filter out duplicates based on the JobNo
  wsTemp.Range("$A:$B$" & lLastRow).RemoveDuplicates Columns:=2, Header:=xlNo
  lLastRow = wsTemp.[A1].End(xlDown).Row                        'Get new last row
  wsTemp.Range("A1:B" & lLastRow).Copy                          'Copy unique Jobs

  wsComp.[A10].PasteSpecial                                     'Paste Unique Jobs to Compare sheet

'Clean up Temp sheet
'  Application.DisplayAlerts = False
  wsTemp.Delete

我已经在打开和关闭 DisplayAlerts 的情况下进行了尝试,当警报打开时...我收到警告说 sheet 上可能有数据...我单击删除,sheet 被删除...然后代码停止。它偶尔会在其他 .ClearContents 行上再次出现问题,如上。

对该问题的事后分析似乎得出的结论是,这实际上是一个损坏的 Excel 文件。幸运的是,我也有一个相当新的备份。但是,为了节省在该备份和损坏版本之间编码所花费的时间,以下是我保存文件所采取的步骤,以防其他人遇到我所做的 st运行ge 行为:

  1. 关闭所有 Excel windows 并在不打开文件的情况下启动新实例。
  2. 使用 Ctrl+O 搜索文件...但不是只单击“打开”,而是单击向下箭头和select“打开并修复”。
  3. 点击修复
  4. 另存为新副本 *-已修复(只是因为)。

在此之后,文件 运行 符合预期。 EOMONTH 函数中的循环引用消失了,调试器 运行 如预期。我对所有代码进行了 运行 全面测试,它工作正常。

我无法解释它是如何损坏的,我猜只是幸运。

有关处理损坏的 Excel 文件的其他选项,请参阅 https://support.office.com/en-us/article/Repairing-a-corrupted-workbook-e5b49891-dde7-4796-b60a-49b0d2478a62

编辑: 这个问题又回来了,目前它的工作是强制 Windows 更新。系统设置为自动,但是当我手动去检查时,它发现了 3 个 Office 更新。安装这些之后,我 运行 Windows 再次更新并发现另一个 .Net 框架更新...所以我也这样做了...怀疑是否有任何效果...但是...

所以...在使用 Excel 的打开和修复后,应用更新并重新启动几次,打开所有错误时中断...我的代码终于可以再次运行了.