【问题标题】:Issue with Excel VBA crashing constantlyExcel VBA不断崩溃的问题
【发布时间】:2017-05-11 18:52:55
【问题描述】:

我正在构建一个会根据某些选择而改变的工作表。我定义了用于复制和粘贴不同数据的范围,具体取决于应向用户显示的工作表类型。

自从我构建了复制和粘贴机制以来,当我运行代码以将工作表换成不同的外观时,工作表经常崩溃。

我在错误检查中得到“对象'Range'的方法'PasteSpecial'失败”,然后是“运行时错误”-2147417848 (80010108)':自动化错误调用的对象已与其客户端断开连接。”会发生,有时工作表运行得很好,没有错误,有时它被错误淹没。通常在出现此错误后,我会结束,然后我会得到一个“Microsoft Excel 已停止工作”错误“windows 可以尝试重新启动程序”。它有时会恢复,但通常不会。

我试图在没有任何宏或代码的情况下复制单元格并粘贴它们,但 excel 一直在崩溃。 我正在复制并粘贴一堆格式化的边框和背景颜色以及一些文本也在盒子里。

Public Sub SetupSheetForEquipmentType(equipment As EquipType)
Dim ws As Worksheet
Set ws = Sheets("Input")


Dim info As Worksheet
Set info = Sheets("Info")


Call Unprotect(ws)

ws.Range("selectedEquipType") = equipment

'Normarc Style
'show all rows first
On Error Resume Next
If ws.Rows(14).EntireRow.Hidden = True Then
    ws.Rows(14).EntireRow.Hidden = False
    ws.Rows(16).EntireRow.Hidden = False
    ws.Columns(2).EntireColumn.Hidden = False
End If
On Error GoTo errSec
'setup the sheet
'Application.DisplayAlerts = False
'Application.ScreenUpdating = False
Select Case equipment
Case Is = 2
    ws.Range("title") = "ILS PHL7801 MONITOR READINGS"
Case Is = 3
    ws.Range("title") = "ILS NORMARC 'A' MONITOR READINGS"
Case Is = 4
    ws.Range("title") = "ILS NORMARC 'B' MONITOR READINGS"
End Select

If Not equipment = PHL7801 Then

    ws.Rows(24).RowHeight = 15
    ws.Rows(25).RowHeight = 15
    ws.Columns(3).ColumnWidth = 6

    'make the sheet input look appropriate
    info.Range("NMSheet").Copy
    DoEvents
    DoEvents
    DoEvents
    ws.Range("SheetGuts").PasteSpecial xlPasteAll '************crashes here*********** but works with xlPasteValues

    'put the comment box in
    info.Range("NMComment").Copy
    ws.Range("NMCommentRef").PasteSpecial 
    ThisWorkbook.Names("comment").Delete
    ws.Range("I35").Name = "comment"
End If

Select Case equipment
Case Is = NMA

    info.Range("NMACL").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMCPNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("NMADS").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMDSNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("NMARef").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMRefNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

Case Is = NMB
    info.Range("NMBCL").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMCPNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("NMBDS").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMDSNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("NMBRef").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMRefNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

Case Is = PHL7801

    'make the sheet input look appropriate
    info.Range("PHLSheet").Copy
    DoEvents
    DoEvents
    DoEvents
    ws.Range("SheetGuts").PasteSpecial

    'hide the rows that aren't applicable and size them appropriately
    ws.Columns(2).Hidden = True
    ws.Rows(14).Hidden = True
    ws.Rows(16).Hidden = True
    ws.Rows(24).RowHeight = 30
    ws.Rows(25).RowHeight = 30
    ws.Columns(3).ColumnWidth = 10

    info.Range("PHLCL").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMCPNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("PHLDS").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMDSNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    info.Range("PHLRef").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMRefNames").PasteSpecial xlPasteAllExceptBorders, xlPasteSpecialOperationNone

    'put the comment box in
    info.Range("PHLComment").Copy
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    DoEvents
    ws.Range("NMCommentRef").PasteSpecial xlPasteAll, xlPasteSpecialOperationNone

    ThisWorkbook.Names("comment").Delete
    ws.Range("D35").Name = "comment"
End Select
errSec:
    If Err.Number <> 0 Then

    MsgBox "Error: " & Err.Description
    Err.Clear
End If

Call Protect(ws)
'Application.ScreenUpdating = True
'Application.DisplayAlerts = True
End Sub

编辑: 我也一直在阅读并确定转储临时文件应该会有所帮助,位于此处:C:\Users\username\AppData\Local\Temp。在这和查尔斯的回答之间,它似乎工作正常,除了我的捕获错误说:“要做到这一点,所有合并的单元格需要具有相同的大小”。我想知道我拥有的所有合并单元格是否有问题?

再次编辑:我说得太早了。我注意到使用 xlpastevalues 无法正常复制和粘贴,因此我将其更改为 xlPasteAll,现在它又崩溃了。

【问题讨论】:

  • 合并单元格是魔鬼的工作,仅供参考。如果我没记错的话,除非您粘贴相同的合并单元格,否则您不能粘贴到包含合并单元格的范围内。此外,您对DoEvents 的调用次数翻了两番,这表明还有一些其他问题需要优化。
  • 您为什么不创建几个不同的工作表,根据需要对每个工作表进行格式化/合并等,然后在需要向用户显示时简单地隐藏/取消隐藏?
  • 感谢您的回复。试图为自己节省一堆代码,因为我还从单元格中获取值并将它们放入一个类中以将它们复制到另一张表中。那和我的工作表顶部有一堆按钮。 DoEvents 似乎更早地修复了这些崩溃,但它们又回来了。
  • 所以肯定有一些不同的合并单元格我正在尝试复制。我想我可能不得不去隐藏/取消隐藏,如果这对我来说变得如此暴躁的话。只是很多额外的工作。
  • 不,您可以取消合并,然后进行复制。在下面的答案中查看我的建议。

标签: vba excel


【解决方案1】:

您似乎缺少粘贴值

ws.Range("SheetGuts").PasteSpecial xPasteValues

【讨论】:

  • 所以添加了这个,并单步执行代码并注意到我的捕获中出现了一个新错误,它现在显示“要执行此操作,所有合并的单元格需要具有相同的大小”。但是,复制和粘贴工作正常。 Excel 不再崩溃,但知道如何解决这个错误捕获发生的事情吗?我基本上已经将错误捕获更改为下一个恢复并且程序现在正在运行,我只是担心它会间歇性地再次开始做同样的事情。
【解决方案2】:

而不是.Copy,然后是.PasteSpecial xlPasteAll(也避免重复的DoEvents,你能看看这是否有效:

ws.Range("NMRefNames").Unmerge
info.Range("NMSheet").Copy Destination:=ws.Range("NMRefNames")

您可能还需要在下一个区块中进行类似操作:

info.Range("NMComment").Copy
ws.Range("NMCommentRef").PasteSpecial 

如果有或可能合并单元格:

info.Range("NMComment").Copy Destination:=ws.Range("NMCommentRef")
ws.Range("NMCommentRef").Value = ws.Range("NMCommentRef").Value  'Gets rid of formula/etc

另外,对于您的 PasteAllExceptBorders 块,请尝试对所有这些块执行此操作:

info.Range("NMBDS").Copy Destination:=ws.Range("NMDSNames")
ws.Range("NMDSNames").Borders.LineStyle = xlNone

【讨论】:

  • 所以当我尝试取消合并时,它现在崩溃了。即使我不使用 VBA,我也只是抓住一些单元格并按下顶部功能区上的取消合并,它会立即崩溃。具体来说,如果我尝试取消合并 5 个或更多单元格,excel 将崩溃。 4 或更少的取消合并罚款。
  • 您是否有任何可能触发某种无限循环的工作表事件处理程序?
  • 如果是这样,您需要解决这些问题。如果没有,请完全关闭excel,如果您打开一个全新的/空工作簿并尝试合并/取消合并单元格,看看问题是否仍然存在。如果没有问题,然后重新打开您的文件,看看它是否发生。如果是这样,请重新启动并重试。听起来很愚蠢,但有时仅此而已。
  • 所以我在要取消合并的单元格中确实有一些公式。它似乎不喜欢取消合并公式的单元格。没有工作表事件处理程序。我已尝试修复 excel 并恢复,但它似乎不会在新工作簿上发生。
  • 由于我不知道为什么会发生这种情况,我只想说我一直在玩弄只使用复制命令,没有 pastespecial,现在我得到了以下错误代码:“内存不足,无法完成此操作。尝试使用较少的数据或关闭其他应用程序。要增加内存可用性,请考虑:使用 64 位版本的 excel,为您的设备添加内存”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多