VBA Excel 日期过滤器,多字段
VBA Excel date filter, multiple fileds
我是 VBA 的新手,但正在学习。
我的目标是加快一些日常总结。
我在清除过滤器时遇到问题(以防将某些过滤器放在另一个字段中)当存在 none 时出现错误。
我无法根据单元格值得到正确的格式,没有错误,它只是 select 空白
不确定如何select过滤范围,我想到了一个,但一定有更好的方法。
如果有人知道一些好的 summary/tutorial 如何在没有 object Table 的情况下 select 范围,请发给我 link。
它是更大宏的一部分,所以声明更早,它们在不同的部分工作,所以它们不是问题。
Sub aktualizacja_SKU()
Set wbThis = ActiveWorkbook
var1 = DATA.Value
With SKU_table
lr1 = .Range.Rows.Count
End With
strPath = "C:\Users\###\Desktop\###\"
strFile = "###.xlsm"
Set wbTarget = Workbooks.Open(strPath & strFile)
wbTarget.Activate
第一个问题:我试图找到解决以下错误的解决方案,但没有成功
'Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11,
' Criteria1:="SPM"
'Sheets("Zamówienie").ShowAllData
第二个:它忽略日期上带过滤器的行并选择一个空白
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=4
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=4,
Criteria1:=Format(var1, "yyyy-mm-dd") ', Operator:=xlOr
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11,
Criteria1:="SPM" ', Operator:=xlOr
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=14
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=14,
Criteria1:="Lack of delivery"
Sheets("Zamówienie").Select
Range("C3:F3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.SpecialCells(xlCellTypeVisible).Copy
wbThis.Activate
第三。我用 header 复制所有范围然后删除它,通常我会将数据更改为 Table,但我无法更改数据源。
SKU_table.DataBodyRange(lr1, 1).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
SKU_table.ListRows(lr1).Delete
End Sub
能否请您解释一下新行的作用或向教程发送 link。
我宁愿看懂也不愿复制粘贴
1st problem
为了安全地消除任何以前的过滤器,不要使用 Worksheet.ShowAllData
;请改用 Worksheet.AutoFilterMode = False
。即
Sheets("Zamówienie").AutoFilterMode = False
2nd problem
要过滤日期,假设您的列已经格式化为日期,并且 var1
是一个 Date
或数字变量,只需使用该变量,不要 Format
它.此外,您不需要两个 Autofilter
语句,只需一个。当然,不需要使用 Select
(你不需要它,它是错误的来源)。
3rd problem
要在没有 header 的情况下进行复制,请使用 .Offset(1).Copy
,并且无需使用 SpecialCells(xlCellTypeVisible)
,因为 Copy
方法会自动执行此操作。
Sub aktualizacja_SKU()
Dim var1 As Date: var1 = Data.value
Const strPath As String = "C:\Users\###\Desktop\###\"
Const strFile As String = "###.xlsm"
Dim wbTarget As Workbook: Set wbTarget = Workbooks.Open(strPath & strFile)
With wbTarget.Sheets("Zamówienie").Range("$A:$V0000")
.AutoFilter 11, "SPM"
.AutoFilter 4, var1
.AutoFilter 14, "Lack of delivery"
.Columns("C:F").Offset(1).Copy
SKU_table.Range(SKU_table.ListRows.Count + 2, 1).PasteSpecial xlPasteValues
.AutoFilter
End With
End Sub
最后,您不能在不同的字段上应用 "ORed" 过滤器。为此,您需要使用辅助列,如 this answer.
所示
我是 VBA 的新手,但正在学习。 我的目标是加快一些日常总结。
我在清除过滤器时遇到问题(以防将某些过滤器放在另一个字段中)当存在 none 时出现错误。
我无法根据单元格值得到正确的格式,没有错误,它只是 select 空白
不确定如何select过滤范围,我想到了一个,但一定有更好的方法。
如果有人知道一些好的 summary/tutorial 如何在没有 object Table 的情况下 select 范围,请发给我 link。
它是更大宏的一部分,所以声明更早,它们在不同的部分工作,所以它们不是问题。
Sub aktualizacja_SKU()
Set wbThis = ActiveWorkbook
var1 = DATA.Value
With SKU_table
lr1 = .Range.Rows.Count
End With
strPath = "C:\Users\###\Desktop\###\"
strFile = "###.xlsm"
Set wbTarget = Workbooks.Open(strPath & strFile)
wbTarget.Activate
第一个问题:我试图找到解决以下错误的解决方案,但没有成功
'Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11,
' Criteria1:="SPM"
'Sheets("Zamówienie").ShowAllData
第二个:它忽略日期上带过滤器的行并选择一个空白
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=4
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=4,
Criteria1:=Format(var1, "yyyy-mm-dd") ', Operator:=xlOr
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=11,
Criteria1:="SPM" ', Operator:=xlOr
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=14
Sheets("Zamówienie").Range("$A:$V0000").AutoFilter Field:=14,
Criteria1:="Lack of delivery"
Sheets("Zamówienie").Select
Range("C3:F3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.SpecialCells(xlCellTypeVisible).Copy
wbThis.Activate
第三。我用 header 复制所有范围然后删除它,通常我会将数据更改为 Table,但我无法更改数据源。
SKU_table.DataBodyRange(lr1, 1).PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
SKU_table.ListRows(lr1).Delete
End Sub
能否请您解释一下新行的作用或向教程发送 link。 我宁愿看懂也不愿复制粘贴
1st problem
为了安全地消除任何以前的过滤器,不要使用 Worksheet.ShowAllData
;请改用 Worksheet.AutoFilterMode = False
。即
Sheets("Zamówienie").AutoFilterMode = False
2nd problem
要过滤日期,假设您的列已经格式化为日期,并且 var1
是一个 Date
或数字变量,只需使用该变量,不要 Format
它.此外,您不需要两个 Autofilter
语句,只需一个。当然,不需要使用 Select
(你不需要它,它是错误的来源)。
3rd problem
要在没有 header 的情况下进行复制,请使用 .Offset(1).Copy
,并且无需使用 SpecialCells(xlCellTypeVisible)
,因为 Copy
方法会自动执行此操作。
Sub aktualizacja_SKU()
Dim var1 As Date: var1 = Data.value
Const strPath As String = "C:\Users\###\Desktop\###\"
Const strFile As String = "###.xlsm"
Dim wbTarget As Workbook: Set wbTarget = Workbooks.Open(strPath & strFile)
With wbTarget.Sheets("Zamówienie").Range("$A:$V0000")
.AutoFilter 11, "SPM"
.AutoFilter 4, var1
.AutoFilter 14, "Lack of delivery"
.Columns("C:F").Offset(1).Copy
SKU_table.Range(SKU_table.ListRows.Count + 2, 1).PasteSpecial xlPasteValues
.AutoFilter
End With
End Sub
最后,您不能在不同的字段上应用 "ORed" 过滤器。为此,您需要使用辅助列,如 this answer.
所示