excel 筛选后实现自动填充,跳过隐藏单元格

Sub CopyRangeToTempSheet()
    Dim selectedRange As Range
    Dim VisibleRange As Range
    Dim totalRows As Long
    Dim area As Range
    Dim wsTemp As Worksheet
    Dim wsActive As Worksheet
    Dim arr()
    
    ' 设置当前激活的工作表
    Set wsActive = ActiveSheet
      
    ' 通过Application.Input让用户选择一个区域
    On Error Resume Next ' 如果用户取消选择,避免错误
    Set selectedRange = Application.InputBox("请选择要复制的区域", Type:=8)
    On Error GoTo 0 ' 恢复正常的错误处理
      
    ' 检查用户是否实际选择了一个区域
    If selectedRange Is Nothing Then
        MsgBox "未选择任何区域,操作已取消。", vbExclamation
        Exit Sub
    End If
    
    Set VisibleRange = selectedRange.SpecialCells(xlCellTypeVisible)
    ' 将可见单元格,存储在VisibleRange中
    
     Application.ScreenUpdating = False
    
    For Each area In VisibleRange.Areas
    totalRows = totalRows + area.Rows.Count
    Next area
    '计算VisibleRange的行数,数量为totalRows
    
    ' 检查并删除已存在的"临时"工作表
    Application.DisplayAlerts = False ' 关闭自动弹出的警告信息
    On Error Resume Next ' 如果工作表不存在,避免错误
    Sheets("临时").Delete
    On Error GoTo 0 ' 恢复正常的错误处理
    Application.DisplayAlerts = True ' 恢复自动弹出的警告信息
      
    ' 创建新的"临时"工作表
    Set wsTemp = Sheets.Add(After:=wsActive)
    wsTemp.Name = "临时"
     
    Application.ScreenUpdating = False
     
    wsTemp.Cells(1, 1) = selectedRange(1, 1)
    wsTemp.Cells(1, 1).Select
    Selection.AutoFill Destination:=Range("A1:A" & totalRows), Type:=xlFillSeries
    
    Dim visibleCells As Range
    Set visibleCells = VisibleRange.EntireColumn.SpecialCells(xlCellTypeVisible)
    
    ReDim arr(1 To totalRows)
    
    l = selectedRange(1, 1).Row
    c = selectedRange(1, 1).Column
   
    i = 1
    j = 1
        For i = 1 To totalRows
        arr(i) = wsTemp.Cells(i, 1)
    Next
    
    Application.DisplayAlerts = False
    wsTemp.Delete
    Application.DisplayAlerts = True
    
    wsActive.Activate '激活工作表
   
    Dim m, n
    m = 1
    n = 0
   
    Do While m < totalRows + 1
        If Intersect(Cells(l + m + n - 1, c), visibleCells) Is Nothing Then
            n = n + 1
        Else
            Cells(l + n + m - 1, c) = arr(m)
            m = m + 1
        End If
    Loop
    Exit Sub
    
    Application.ScreenUpdating = True
    If errline Then
    MsgBox "失败!检查一下数据格式,可以新建工作簿,复制这列序列号,在新的工作簿上操作"
    End If
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值