Vba 复制粘贴筛选数据未按预期工作
第一件事。我对VBA很陌生。 其次,我在谷歌上搜索了我的屁股,我真的没有找到它的底部。主要是因为代码是根据我做的谷歌搜索(复制/粘贴代码)来适应我的需要的 解决我的问题。我有一个表(原始数据),其中有很多列(a:AN)和很多行(160000),它们会不时更新。我想根据几列(a和B)中的条件过滤数据集,并从a列开始将数据复制/粘贴到不同的工作表(散点原始数据)中。我也不想从“原始数据”中复制标题,并开始粘贴在标题->下面的“散点表”中(在本例中为2行) 我现在有两个问题:Vba 复制粘贴筛选数据未按预期工作,vba,excel,Vba,Excel,第一件事。我对VBA很陌生。 其次,我在谷歌上搜索了我的屁股,我真的没有找到它的底部。主要是因为代码是根据我做的谷歌搜索(复制/粘贴代码)来适应我的需要的 解决我的问题。我有一个表(原始数据),其中有很多列(a:AN)和很多行(160000),它们会不时更新。我想根据几列(a和B)中的条件过滤数据集,并从a列开始将数据复制/粘贴到不同的工作表(散点原始数据)中。我也不想从“原始数据”中复制标题,并开始粘贴在标题->下面的“散点表”中(在本例中为2行) 我现在有两个问题: 根据我使用的过滤器,我将
Sub Copy()
Dim destTrSheet As Worksheet
Dim sctrSheet As Worksheet
Set destTrSheet = ThisWorkbook.Worksheets("Data Raw")
Set sctrSheet = ThisWorkbook.Worksheets("Scatter Raw")
With destTrSheet
.Range("A:A").AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
.Range("B:B").AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
Set Rng = .Range("N2").Resize(Cells(Rows.count, "N").End(xlUp).Row - 1)
Rng.Copy
sctrSheet.Range("A" & Rows.count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)
Set Rng = .Range("X2").Resize(Cells(Rows.count, "N").End(xlUp).Row - 1)
Rng.Copy
sctrSheet.Range("B" & Rows.count).End(xlUp).Offset(2, 0).PasteSpecial (xlPasteValues)
End With
End Sub
你提到的问题
- 列A
.Offset(1,0)。将特殊的
-1行粘贴到上次使用的行下方
- 列B
。偏移量(2,0)。将特殊的
-粘贴到上次使用的行下方的2行
.Range(“N2”)
vs(单元格(Rows.count,“N”)
由于点(.Range(“N2”)
)而被明确限定-指的是“原始数据”
隐式引用的是单元格(Rows.count,“N”)
(缺少ActiveSheet
)
- 是的,可以使用helper列,如下面的代码中所示
- 另一种方法:将列复制到数组中,除以每个值,然后将其粘贴回去
其他问题
- 子名称(
)与内置的Copy()
方法之间可能存在冲突范围.Copy
- 两个自动筛选行无效
.Range(“A:A”)。自动筛选字段:=1,标准1:=VF,运算符:=xlFilterValues
.Range(“B:B”)。自动筛选字段:=2,标准1:=CITY,运算符:=xlFilterValues
- 如果你的代码有效,你可能会在发布问题时修改它;它们应该是
.Range(“A:B”)。自动筛选字段:=1,标准1:=VF,运算符:=xlFilterValues
.Range(“A:B”)。自动筛选字段:=2,标准1:=CITY,运算符:=xlFilterValues
.PasteSpecial(xlPasteValues)
Option Explicit
Public Sub CopyRawToScatter()
Dim wsR As Worksheet: Set wsR = ThisWorkbook.Worksheets("Data Raw")
Dim wsS As Worksheet: Set wsS = ThisWorkbook.Worksheets("Scatter Raw")
Dim lrR As Long: lrR = wsR.Cells(wsR.Rows.Count, "A").End(xlUp).Row
Dim lrS As Long: lrS = wsS.Cells(wsS.Rows.Count, "A").End(xlUp).Row + 1
With wsR
Dim fRng As Range: Set fRng = .Range(.Cells(1, "A"), .Cells(lrR, "B"))
Dim rngN As Range: Set rngN = .Range(.Cells(2, "N"), .Cells(lrR, "N"))
Dim rngX As Range: Set rngX = .Range(.Cells(2, "X"), .Cells(lrR, "X"))
Dim cRng As Range: Set cRng = Union(rngN, rngX)
End With
Application.ScreenUpdating = False
fRng.AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
fRng.AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
If fRng.SpecialCells(xlCellTypeVisible).CountLarge > 2 Then
cRng.Copy
wsS.Cells(lrS, "A").PasteSpecial xlPasteValues
With wsS
Dim vis As Long: vis = .Cells(.Rows.Count, "A").End(xlUp).Row
Dim lcS As Long: lcS = .Cells(lrS, "A").End(xlToRight).Column + 1
Dim divA As Range: Set divA = .Range(.Cells(lrS, "A"), .Cells(vis, "A"))
Dim divX As Range: Set divX = .Range(.Cells(lrS, lcS), .Cells(vis, lcS))
divX.Formula = "=" & .Cells(lrS, 1).Address(RowAbsolute:=False) & " / 1000"
divA.Value2 = divX.Value2
divX.ClearContents
End With
End If
wsR.UsedRange.AutoFilter
Application.ScreenUpdating = False
End Sub