2

这里的 Excel 有一个非常令人沮丧的问题 - 无法删除最后一个单元格;它被锁定在最后使用的第 1048576 列和第 1048576 行。在您开始使用常见修复之前,我已经尝试了我在互联网上可以找到的所有修复,包括:

  • 删除所有未使用的行,删除所有未使用的列
  • 保存、关闭、重新打开
  • 清除所有未使用的行和列中的格式
  • 各种宏的引用 worksheet.UsedRange、UsedRange.Rows.Count、UsedRange(1) 等。
  • 上面的许多排列以不同的顺序,总是跟着一个保存/重新打开

这发生在 Excel 2007 和 Excel 2013 中。即使我删除工作上的所有内容(即全选、右键单击、删除)、保存/打开,最后一个单元格仍然引用最后一行。

我可以将工作表的活动区域复制并粘贴到新工作表中,但是我以前也遇到过这种情况,我想找到一个完整的修复程序以供将来参考(或者知道这确实是一个错误,我我不只是在这里发疯!)

4

2 回答 2

0

我也遇到过几次这种情况——工作表几乎是空的,但由于某种奇怪的原因,Excel 存储了所有 1M 行——并且没有一个正常的技巧起作用。

在这种情况下,我最终要做的是直接编辑 .xlsx 文件:

  1. 将 .xlsx(或 .xlsm)文件重命名为 .zip,您将看到内容
  2. 提取文件 xl\worksheets\sheet1.xml (或任何一个非常大的工作表 - 请注意,编号可能需要与 Excel 中的编号对齐)
  3. 使用强大的编辑器编辑文件。我可以推荐 UltraEdit,尤其是。因为它具有“XML 转换为 CR/LF”功能(在格式下),它将 XML 格式化为可读格式。(如果是 1M 行,这种格式可能需要几分钟!)
  4. 在文件中搜索<row r="X"X要保留的最后一行。从这里删除所有内容,直到</sheetData>(通常在倒数第三行)
  5. 保存文件,将其放回 .zip 并将 .zip 重命名为 .xlsx/.xlsx

完毕!

于 2013-10-30T10:06:34.720 回答
0

(晚了一天,少了一美元)

我仍在使用 excel 2003 并遇到此问题。这些宏删除旧工作表并添加新工作表。第一个宏将截断工作表,因此“Ctl-End Lastcell”是最后一个内容。第二个宏只是删除工作表并添加一个具有相同名称的新工作表,因此“Ctl-End Lastcell”为 A1。

Sub ShTrunc() ' truncate active sheet to content only
  Dim sold$, snew$, rowz&, colz&, zRange As Range
  ' -- get old and new sheet names
  sold = ActiveSheet.Name ' old sheet name
  Sheets.Add
  snew = ActiveSheet.Name ' new name
  ' -- get the "true" last row and column
  ' based on http://www.rondebruin.nl/win/s9/win005.htm
  Sheets(sold).Activate
  Set zRange = Cells.Find("*", [a1], xlFormulas, xlPart, xlByRows, xlPrevious, False)
  If zRange Is Nothing Then rowz = 1 Else rowz = zRange.Row
  Set zRange = Cells.Find("*", [a1], xlFormulas, xlPart, xlByColumns, xlPrevious, False)
  If zRange Is Nothing Then colz = 1 Else colz = zRange.Column
  ' -- copy the content from old sheet, paste to new sheet
  Range(Cells(1, 1), Cells(rowz, colz)).Copy ' Sheets(snew).Cells(1, 1)
  Sheets(snew).Activate
  ActiveSheet.Paste
  ' -- delete old sheet and rename new to old
  Application.DisplayAlerts = False
  Sheets(sold).Delete
  Application.DisplayAlerts = True
  Sheets(snew).Name = sold ' rename to old name
  ' -- the following checks if the world works as it should
  If ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row <> rowz Then Stop
  If ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column <> colz Then Stop
End Sub

Sub ShDelAdd() ' delete and add active sheet (to CLEAR it)
  ' this is a simpler version of ShTrunc if you only want to clear a sheet
  Dim sold$, snew$
  sold = ActiveSheet.Name
  Application.DisplayAlerts = False
  Sheets(sold).Delete
  Application.DisplayAlerts = True
  Sheets.Add
  snew = ActiveSheet.Name ' new name
  Sheets(snew).Name = sold ' rename to old name
  ' -- the following checks if the world works as it should
  If ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row <> 1 Then Stop
  If ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column <> 1 Then Stop
End Sub
于 2019-10-03T16:28:44.207 回答