使用 VBA 排序记录进行 Excel 损坏



我有一个Excel文件,其中包含一个过滤记录的宏。运行宏后,我保存并关闭文件。一旦我再次打开文件,它说该文件已损坏:

Excel 在"[文件名].xls"中发现不可读的内容。
是否要恢复此工作簿的内容?
如果您信任此工作簿的来源,请单击"是"。

单击"是"后,文件将打开,并查看将我定向到的XML文件,我发现以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error050360_01.xml</logFileName>
    <summary>Errors were detected in file 'C:xxxfile.xlsb'</summary>
    <removedRecords summary="Following is a list of removed records:">
        <removedRecord>Removed Records: Sorting from /xl/worksheets/sheet11.bin part</removedRecord>
    </removedRecords>
</recoveryLog>

在 Sheet11 上,我有以下排序代码:

LastRow = ActiveSheet.Range("A1").Offset(ActiveSheet.Rows.Count - 1, 0).End(xlUp).Row
Range("A3").Select
ActiveWorkbook.Worksheets("AP_PV").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("AP_PV").Sort.SortFields.Add key:=Range("A4:A" & LastRow) _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("AP_PV").Sort
    .SetRange Range("A3:B" & LastRow)
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

我尝试在Range("A3").Select之前添加一个条件,以查看是否LastRow > 4排除排序,但 id 没有任何区别。

关于导致腐败的原因以及如何避免腐败的任何想法?

我会对此发表评论,只是提供链接,但我还没有 50 个声誉。

谷歌搜索发现了几年前的一个SE线程,其中包含许多可能的解决方案: Excel错误:已删除的记录:从/xl/工作表/工作表10.xml部分排序

最有可能起作用的是这个:

Sheets(yoursheetname).Sort.SortFields.Clear

把它放在排序功能之后(或在保存文件之前(,似乎问题应该得到解决。

希望这能奏效。

当 SortFields.Add2 键使用普通范围(例如 Range("B2:B100"((时,不会发生此错误。但是,当使用变量设置 SortFields.Add2 键的范围时,似乎总是会发生此错误。上面提供的解决方案有效 - 但仅在使用变量时才需要。由于使用宏录制器时不包括此行(在末尾(,因此我认为它符合错误的条件。

错误告诉它是"sheet11",您可以将内容复制到新工作簿,删除错误工作簿中的工作表,然后创建一个包含内容的新工作表

我在Office 365 Excel for Windows中遇到了同样的问题。我正在将排序应用于工作表对象,但我未能在 sub 末尾释放该对象。 一旦我将集合 ws = no 代码添加到子的末尾,问题就停止了。 我还按照前面的建议清除了排序字段,但只有在添加释放代码后,这才完全停止。

分配总是很好的做法。我们经常听到对象在超出范围时被丢弃,但情况并非总是如此。

最新更新