Excel最后一个单元格bug

时间:2013-10-30 04:25:45

标签: excel vba cell

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

  • 删除所有未使用的行,删除所有未使用的列
  • 保存,关闭,重新打开
  • 清除所有未使用行中的格式&列
  • 各种宏的引用工作表.UsedRange,UsedRange.Rows.Count,UsedRange(1),等等。
  • 上述不同顺序的许多排列,后面跟着保存/重新打开

这在Excel 2007和Excel 2013中都会发生。即使我在工作表上删除一切(即全选,右键单击,删除),保存/打开,最后一个单元格仍然会被引用到最后一行。

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

2 个答案:

答案 0 :(得分: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
  6. 完成!

答案 1 :(得分: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