提问人:Javier Puig Rovira 提问时间:7/25/2023 最后编辑:BigBenJavier Puig Rovira 更新时间:7/26/2023 访问量:66
表和结果 - 如何编写 If 语句 [duplicate]
Tables and results - How to write a If statement [duplicate]
问:
我需要过滤一个表(as 和 object)并复制特定范围内的结果。有时我从表中获取数据,有时不获取数据。当我获得数据时没关系,我在特定范围内复制粘贴可见数据,但是当我没有获得数据时,它会粘贴整个列,这是错误的。 我想要,当表中没有可见的数据时,转到下一步。
我试过了这个:
Dim Table as ListObject
Set Table = Thisworkbook.ListObjects("Table")
Table.AutoFilter.ShowAllData
Table.Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
Table.Range.AutoFilter Field:=16, Criteria1:=Range("Tema1Lun").Value, Operator:=xlAnd
Table.Range.AutoFilter Field:=17, Criteria1:="=*TV*", Operator:=xlAnd
If Table.DataBodyRange = 0 Then
GoTo Filter2
ElseIf Range("Table[Column1]").SpecialCells(xlCellTypeVisible).Count > 1 Then
With Range("Table[Column2]:Table[Column3]").Copy
End With
Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End If
Filter2:
Table.AutoFilter.ShowAllData
Table.Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
Table.Range.AutoFilter Field:=16, Criteria1:=Range("Tema1Lun").Value, Operator:=xlAnd
Table.Range.AutoFilter Field:=17, Criteria1:="0", Operator:=xlAnd
答:
0赞
taller
7/26/2023
#1
您的代码逻辑已接近工作状态。但是,用作检查表中没有可见数据的条件将无法按预期工作。If Table.DataBodyRange = 0
DataBodyRange 属性返回一个 Range 对象,该对象表示 Table 中的值范围。(注意:它与任何过滤无关。
Dim Table as ListObject
Set Table = Thisworkbook.ListObjects("Table")
If Table.ListColumns(1).Range.SpecialCells(xlCellTypeVisible).Count > 1 Then
GoTo Filter2
Else
Application.CutCopyMode = False
Range("Table[Column2]:Table[Column3]").Copy
Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End If
评论
0赞
BigBen
7/26/2023
我想你是在这里找的,不是ListObject.DataBodyRange
PivotTable
0赞
taller
7/26/2023
@BigBen 谢谢。你是对的。当我在文本编辑器中输入时,这是一个自动完成的错别字。
1赞
CDP1802
7/26/2023
#2
用于检查是否有任何可见行。On Error Resume Next
Dim rng As Range
With ThisWorkbook.Sheets(1).ListObjects("Table")
.AutoFilter.ShowAllData
.Range.AutoFilter Field:=20, Criteria1:="Lunes", Operator:=xlAnd
.Range.AutoFilter Field:=16, Criteria1:=Sheets(1).Range("Tema1Lun").Value, Operator:=xlAnd
.Range.AutoFilter Field:=17, Criteria1:="=*TV*", Operator:=xlAnd
End With
On Error Resume Next
Set rng = Range("Table[Column1]").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
GoTo Filter2
Else
Range("Table[Column2]:Table[Column3]").Copy
Range("SpecificRange").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End If
0赞
2 revs, 2 users 85%Javier Puig Rovira
#3
我明白了! 我用了这个:
If Range("Table[Column1]").RowHeight = 0 Then
GoTo Filter2
ElseIf Range("Table[Column1]").SpecialCells(xlCellTypeVisible).Count >= 1 Then
With Range("Table[Column2]:Table[Column3]").Copy
End With
Range("rng_HLLun1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False End If
Filter2:
评论
If Table.DataBodyRange = 0 Then
这个测试到底是为了什么?Table.DataBodyRange.Rows.Count
DataBodyRange
ListColumns(1).Range.SpecialCells(xlCellTypeVisible).Count