将过滤后的数据复制到新工作簿时出现问题
Problems Copying Filtered Data To New Workbook
我正在使用此代码筛选数据库,然后将生成的筛选数据复制到第二个工作簿中的工作表。
With ws_sched
Set srng = .Range(.Cells(1, 1), .Cells(.Range("A" & Rows.count).End(xlUp).row, .Cells(1, Columns.count).End(xlToLeft).Column))
srng.AutoFilter _
Field:=2, _
Criteria1:=trgt_date, _
VisibleDropDown:=False
'srng.SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
srng.Copy
ws_data.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
If .AutoFilterMode Then .AutoFilterMode = False
End With
'ws_sched' 是过滤后的原始数据库。
'ws_data' 是第二个工作簿中的目标工作表。
过滤器有效,但复制和粘贴仅留下源数据库的 header 行(过滤数据的许多行中的第一行)。
有谁能帮我解决为什么我过滤后的数据没有传输的问题?
以上代码反映了我根据我对 Thiago 建议的理解对我的原始代码所做的更改。这仍然只复制 header 行,没有过滤数据。
尝试对复制的数据进行特殊粘贴,而不是像现在这样通知目的地
一定是你在 ws_sched
列 A 中只有 header,给你行 depth of srng
,因此设置为 one-row range
你可以通过在 Set srng =...
之后添加一些 Msgbox srng.Address
语句来证明这一点
所以你有两种方法:
选择不同的列从
中获取数据行深度
在这种情况下,我会选择 "B" 列,因为这是您似乎想要过滤的列
Set srng = .Range(.Cells(1, 1), .Cells(.Range("B" & Rows.Count).End(xlUp).row, .Cells(1, Columns.Count).End(xlToLeft).Column))
通过UsedRange
推断数据行depth
在这种情况下,您只需更改 copying 语句如下:
Intersect(.UsedRange, .Columns(2).EntireRow, srng.EntireColumn).SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
最后,您可能会遇到 A 列 完全 空白的情况,即甚至没有 header。在这种情况下,您应该将所有代码转移到从 B
列开始
Set srng = .Range(.Cells(1, 2), .Cells(.Range("B" & Rows.Count).End(xlUp).row, .Cells(1, Columns.Count).End(xlToLeft).Column))
srng.AutoFilter _
Field:=1, _
Criteria1:=">=2", _
VisibleDropDown:=False
srng.SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
此 VBA 代码将帮助您将过滤后的数据放入其他 Sheet。
子 copy_filtered_data()
Worksheets("Data Input").UsedRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=Worksheets("Results").Range("A1")
结束子
注意:您也可以将此代码与自动过滤器代码一起使用。
我正在使用此代码筛选数据库,然后将生成的筛选数据复制到第二个工作簿中的工作表。
With ws_sched
Set srng = .Range(.Cells(1, 1), .Cells(.Range("A" & Rows.count).End(xlUp).row, .Cells(1, Columns.count).End(xlToLeft).Column))
srng.AutoFilter _
Field:=2, _
Criteria1:=trgt_date, _
VisibleDropDown:=False
'srng.SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
srng.Copy
ws_data.Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
If .AutoFilterMode Then .AutoFilterMode = False
End With
'ws_sched' 是过滤后的原始数据库。 'ws_data' 是第二个工作簿中的目标工作表。
过滤器有效,但复制和粘贴仅留下源数据库的 header 行(过滤数据的许多行中的第一行)。
有谁能帮我解决为什么我过滤后的数据没有传输的问题?
以上代码反映了我根据我对 Thiago 建议的理解对我的原始代码所做的更改。这仍然只复制 header 行,没有过滤数据。
尝试对复制的数据进行特殊粘贴,而不是像现在这样通知目的地
一定是你在 ws_sched
列 A 中只有 header,给你行 depth of srng
,因此设置为 one-row range
你可以通过在 Set srng =...
Msgbox srng.Address
语句来证明这一点
所以你有两种方法:
选择不同的列从
中获取数据行深度在这种情况下,我会选择 "B" 列,因为这是您似乎想要过滤的列
Set srng = .Range(.Cells(1, 1), .Cells(.Range("B" & Rows.Count).End(xlUp).row, .Cells(1, Columns.Count).End(xlToLeft).Column))
通过UsedRange
推断数据行depth在这种情况下,您只需更改 copying 语句如下:
Intersect(.UsedRange, .Columns(2).EntireRow, srng.EntireColumn).SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
最后,您可能会遇到 A 列 完全 空白的情况,即甚至没有 header。在这种情况下,您应该将所有代码转移到从 B
列开始 Set srng = .Range(.Cells(1, 2), .Cells(.Range("B" & Rows.Count).End(xlUp).row, .Cells(1, Columns.Count).End(xlToLeft).Column))
srng.AutoFilter _
Field:=1, _
Criteria1:=">=2", _
VisibleDropDown:=False
srng.SpecialCells(xlCellTypeVisible).Copy ws_data.Range("A1")
此 VBA 代码将帮助您将过滤后的数据放入其他 Sheet。
子 copy_filtered_data()
Worksheets("Data Input").UsedRange.SpecialCells(xlCellTypeVisible).Copy _ Destination:=Worksheets("Results").Range("A1")
结束子
注意:您也可以将此代码与自动过滤器代码一起使用。