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
excel 筛选后实现自动填充,跳过隐藏单元格
于 2024-08-09 16:01:11 首次发布