Excel 如何自动筛选然后仅复制和粘贴可见单元格
我试图用名为“操作符”的工作表中的“AN”列中的值填充“am”列中的任何空白单元格,方法是使用以下代码为宏指定形状请注意中的单元格中有一个等式,因此我只想复制值Excel 如何自动筛选然后仅复制和粘贴可见单元格,excel,vba,autofilter,Excel,Vba,Autofilter,我试图用名为“操作符”的工作表中的“AN”列中的值填充“am”列中的任何空白单元格,方法是使用以下代码为宏指定形状请注意中的单元格中有一个等式,因此我只想复制值 Sub PendingChanges() Range("AM1:AM10").CurrentRegion.AutoFilter Field:=1, Criteria1:="=" Worksheets("Operator").Range("AM1:AM10").SpecialCells(xlCellTypeVisibl
Sub PendingChanges()
Range("AM1:AM10").CurrentRegion.AutoFilter Field:=1, Criteria1:="="
Worksheets("Operator").Range("AM1:AM10").SpecialCells(xlCellTypeVisible).Value = Worksheets("Operator").Range("AN1:AN10").Value
Selection.AutoFilter Field:=1
End Sub
我知道有一种“SpecialCells”方法只显示可见的单元格(所以在自动过滤后,它会为我显示空白),但我不知道如何将其包含到我的代码中!
以下屏幕截图是工作表最初的外观:(在本例中,AN3和AN5的单元格值将分别粘贴到AM3和AM5中:
“我的代码”自动筛选列“AN”中的任何空白单元格,然后尝试复制AN中的单元格,并将可见单元格值粘贴到AM中的单元格中
结果应如下所示:
此处无需过滤;您只需使用
特殊单元格(xlCellTypeBlanks)
,然后在结果上使用偏移量
,以引用相同的行,但在列“AN”中
一些注意事项:
- 由于
调用将在没有空格的情况下失败,因此需要“错误恢复下一步”和“错误转到0时”。它们临时禁用并重新启用错误处理特殊单元格(xlCellTypeBlanks)
- 是非连续范围内的每个不同区域。例如,如果
指的是blankCells
和AM2
,则AM4:AM5
是第一个区域,AM2
是第二个区域AM4:AM5
- 您需要遍历这些区域,因为当存在多个区域时,尝试值传输
无法正常工作.value=.value
- 您不需要制作过滤器,然后填充下一列的空白
您可以尝试下面的代码,它可以直接解决您的问题
[VBA]
Sub test()
Dim rBlanks As Range
Set rBlanks = Nothing
With ThisWorkbook.Sheets("Operator")
On Error Resume Next
Set rBlanks = Intersect(.Range("AM:AM"), .UsedRange).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rBlanks Is Nothing Then
rBlanks.FormulaR1C1 = "=RC[1]"
Intersect(.Range("AM:AM"), .UsedRange).Copy
.Range("AM1").PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
End If
End With
End Sub
[/VBA]
你使用公式是什么意思?我在`Set blankCells=Worksheets(“运算符”).Range(“AM1:AM10”).SpecialCells((xlCellTypeBlanks)`中遇到语法错误,我删除了它。编辑,出于某种原因,它只复制了第一个值(AN2单元格值为5)在AOK的所有空白单元格中,请参阅编辑,很抱歉。当有多个区域时,使用值传输不起作用。当然,我将添加一些细节。它从“AM6、AM8和AM10:AM121”复制“0”。
[VBA]
Sub test()
Dim rBlanks As Range
Set rBlanks = Nothing
With ThisWorkbook.Sheets("Operator")
On Error Resume Next
Set rBlanks = Intersect(.Range("AM:AM"), .UsedRange).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rBlanks Is Nothing Then
rBlanks.FormulaR1C1 = "=RC[1]"
Intersect(.Range("AM:AM"), .UsedRange).Copy
.Range("AM1").PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
End If
End With
End Sub
[/VBA]