【问题标题】:Macro is copying only the visible cells宏仅复制可见单元格
【发布时间】:2011-10-20 14:20:37
【问题描述】:

宏仅复制过滤行的可见单元格,尽管我没有使用仅复制可见单元格。我如何让我的宏复制所有单元格,尽管它们在工作表中是不可见的

非常感谢任何帮助

谢谢

【问题讨论】:

  • 删除过滤器然后复制。
  • @Reafidy 感谢您的帮助,但条件是,宏不应更改过滤器设置。并且工作表不应该被宏过滤,即使没有被宏过滤进行复制,它也会像以前一样恢复,但是当我们设置 autofiltermode = false 时,不可能取回过滤器。
  • 请帮我解决这些问题,即使它们在不更改过滤器设置的情况下不可见,我该如何复制,我想到了变体,但问题是某些单元格有背景颜色,而变体只选择数据但不是颜色,所以我不知道该怎么办!
  • 然后您可能需要保存用户自动过滤器设置,删除过滤器,运行您的代码然后恢复自动过滤器设置。如果您需要帮助,请告诉我。
  • @Reafidy 如何保存用户自动过滤设置?

标签: excel


【解决方案1】:

尼可,

在这种情况下,只需复制工作表并进行两次删除,代码就会立即运行。如果您的最后一行位置未知,那么我可以调整此代码以找到真正的最后使用行

Sub QuickKill()
    Application.ScreenUpdating = False
    ActiveSheet.Copy After:=Sheets(Sheets.Count)
    With ActiveSheet
        .AutoFilterMode = False
        .Rows("1:1499").Delete
        .Rows("2001:30000").Delete
    End With
    Application.ScreenUpdating = True
End Sub

【讨论】:

    【解决方案2】:

    如果可以只复制单元格值和公式(即没有格式),您可以使用它

    Sub CopyAllData()
        Dim v As Variant
        Dim rngFrom As Range
        Dim rngTo As Range
    
        ' set a reference to the range to be copied, eg
        Set rng = [2:8]
        ' get the data
        v = rng.Formula
    
        ' set a range to the desitination, eg
        Set rngTo = [8:12]
        ' put the data
        rngTo.Formula = v
    
    End Sub
    

    编辑
    刚刚看到您对 niko 的评论,看来您确实也想要这种格式。一次复制一行就行了
    我最初尝试rngTo.Hidden = FALSE而不是rngTo.RowHeight = 15,但它返回一个错误,不知道为什么

    Sub CopyAll()
        Dim rngFrom As Range
        Dim rngTo As Range
        Dim i As Long
        Dim sh As Worksheet
        Dim OldCalc As XlCalculation
    
        On Error GoTo Cleanup
    
        OldCalc = Application.Calculation
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
    
        ' set a reference to the range to be copied, eg
        Set rngFrom = [2:12]
    
        ' set a range to the desitination first row, eg
        Set sh = Worksheets("Sheet2")
        Set rngTo = sh.[2:2]
    
        ' copy each row in turn and restore the copied row height
        For i = 1 To rngFrom.Rows.Count
            rngFrom.Rows(i).Copy rngTo
            rngTo.RowHeight = 15
            Set rngTo = rngTo.Offset(1, 0)
        Next
    
    Cleanup:
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Application.Calculation = OldCalc
    
    End Sub
    

    【讨论】:

    • 当你有 2000 行时复制每一行,这不是一个耗时的过程吗?
    • @niko 肯定是!不过有一些方法可以改进它,我将对其进行编辑以包含它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2016-05-14
    相关资源
    最近更新 更多