Excel VBA:列在结束前一直填充不可见内容(列16384)

Excel VBA:列在结束前一直填充不可见内容(列16384),excel,vba,Excel,Vba,我有一个Excel文件用于预算编制,后台有很多VBA编程。该文件允许进行各种导入/导出,并且工作得很好,但是一旦项目数量(每个项目有15个工作表)太多,就会变得混乱 很多时候,我会收到一条错误消息,要么说“无法将对象移出工作表”,要么说“Excel的资源太少,无法完成任务”。在这两种情况下,谷歌都说问题在于我超过了最大列数或行数。这是真的——如果我运行宏来查找最后一列的内容,它将返回16384 但我只把数据放在A列到B列。。。对于行,包含内容的最大行数为2000。我没有看到任何内容,我没有任何m

我有一个Excel文件用于预算编制,后台有很多VBA编程。该文件允许进行各种导入/导出,并且工作得很好,但是一旦项目数量(每个项目有15个工作表)太多,就会变得混乱

很多时候,我会收到一条错误消息,要么说“无法将对象移出工作表”,要么说“Excel的资源太少,无法完成任务”。在这两种情况下,谷歌都说问题在于我超过了最大列数或行数。这是真的——如果我运行宏来查找最后一列的内容,它将返回16384

但我只把数据放在A列到B列。。。对于行,包含内容的最大行数为2000。我没有看到任何内容,我没有任何makros引用“lastrow/lastcolumn”。。。不知道发生了什么。有时我可以手动删除一堆行和列,然后它就可以工作了;有时我必须手动重新创建工作簿

我知道这是一个非常模糊的解释,但我有大约15000行代码,所以解释起来相当复杂

也许还有人可以帮忙


谢谢

这是Excel文件的常见问题。如果
UsedRange
超出范围,则文件会毫无明显原因地膨胀

这应该可以解决这个问题:

Sub ResetUsedRange()

    Dim sht As Worksheet

    Dim lng As Long

    For Each sht In ActiveWorkbook.Worksheets

        lng = sht.UsedRange.Rows.Count

    Next

End Sub

如果由于某种原因,这不起作用,试着手动删除数据区域底部/右边的所有空白行/列,点击保存,然后检查文件大小。 代码取自

编辑#1

此扩充代码将删除工作簿中使用范围之外的每张工作表上的所有空行和空列,并在之后尝试重置
UsedRange
。请记住在执行代码之前备份文件,并且只有在保存文件后,文件大小才会减小。根据图纸的数量,可能需要一段时间才能完成

Sub DeleteBlankRowsAndColumnsAndResetUsedRange()

    Dim rangeBool As Boolean
    Dim i As Long, lastCol As Long, lastRow As Long, lng As Long, tempRwsCount As Long
    Dim tempRng As Range
    Dim sht As Worksheet

    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False

    For Each sht In ThisWorkbook.Sheets

        On Error Resume Next
        lastRow = sht.Cells.Find(What:="*", _
                  After:=.Range("A1"), _
                  Lookat:=xlPart, _
                  LookIn:=xlFormulas, _
                  SearchOrder:=xlByRows, _
                  SearchDirection:=xlPrevious, _
                  MatchCase:=False).Row
        lastCol = sht.Cells.Find(What:="*", _
                  After:=.Range("A1"), _
                  Lookat:=xlPart, _
                  LookIn:=xlFormulas, _
                  SearchOrder:=xlByColumns, _
                  SearchDirection:=xlPrevious, _
                  MatchCase:=False).Column
        On Error GoTo 0

        tempRwsCount = sht.Rows.count

        If lastRow > 0 And lastRow < tempRwsCount Then
            ' delete empty rows and columns
            Set tempRng = sht.Rows(lastRow + 1 & ":" & tempRwsCount)
            tempRng.Delete
            Set tempRng = sht.Columns(lastCol + 1).Resize(, sht.Columns.count - lastCol)
            tempRng.Delete

        End If

        ' reset used range
        lng = sht.UsedRange.Rows.count

    Next sht

        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
End Sub
子删除blankrowsandcolumns和resetUsedRange()
Dim rangeBool作为布尔值
暗i一样长,lastCol一样长,lastRow一样长,lng一样长,TEMPRWSCONT一样长
暗温度范围
将sht变暗为工作表
应用
.Calculation=xlCalculationManual
.ScreenUpdate=False
对于此工作簿中的每个sht。工作表
出错时继续下一步
lastRow=sht.Cells.Find(What:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
lastCol=sht.Cells.Find(What:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
SearchOrder:=xlByColumns_
搜索方向:=xlPrevious_
MatchCase:=False)。列
错误转到0
temprwscont=sht.Rows.count
如果lastRow>0且lastRow
编辑#2


感谢
Shawn V.Wilson
”指出有必要保存该文件,然后关闭并重新打开该文件以查看文件大小的变化。

非常感谢,我将保存新代码以备下次使用!
最后,我90%的工作表都使用了原始代码,其余的工作表都是手动处理的(从BX中删除所有列,直到最后,再保存、关闭和打开文件)。

非常感谢,我会立即尝试。在上面的代码中将“行”替换为“列”时,它是否也适用于列?请尝试新代码。它适用于两列和行。重要的是添加到“miq180”所说的“如果由于某种原因,这不起作用,只需手动删除数据区域底部/右侧的所有空白行/列,点击保存,然后检查文件大小。”(a)记住您必须实际删除整个行和列,不仅仅是清除它们的内容。(b) 你不能只保存文件。您必须关闭它,然后重新打开它,才能重置“最后一个单元格”所在的位置。@Shawn V.Wilson感谢您指出这一点。我对这篇文章做了第二次编辑。太好了。那么你可以考虑接受我的回答。谢谢