0

我在工作表中也有这些值:

Cell location   Value
A1              Today()
B1              =TEXT(A1,"dddd")
G3              Day
H3              Day
I3              Day
G4              D
H5              =LEFT(B1,3)
I6              x

现在从 A3 开始到 D19

Book Name   Code    QTY Day
.Net                    x
Book1       NBC     2   Mon
Book2       NAA     1   Wed
Book3       NBA     3   Tue/Mon
Oracle                  x
Book1       OB1     1   D
Book2       OXZ     1   Fri
Book3       OPS     2   Sun
Book4       OPR     1   Thu
Java                    x
Book1       JPS     1   D
Book2       JJJ     4   Sat
PHP                     x
Book1       PMW     3   Wed/Tue
Book2       PHY     2   D
Book3       PED     1   Fri

今天是星期四,当我打开工作簿时,它的视图应该是这样的:

Book Name   Code    QTY Day
Oracle
Book1       OB1     1   D
Book4       OPR     1   Thu
Java
Book1       JPS     1   D
PHP
Book2       PYH     2   D

我已经提到 x 作为书籍类别的日期,因为我也希望视图中的类别名称行。

表示在日列中具有 D(每日)且在日列中具有前三个字符的所有行,无论它们是 Thu 还是 /Thu(例如星期四)。

我已经通过 VBA 完成了:

Private Sub Workbook_Open()
        Range("A3:D19").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
        Range("G3:I6"), Unique:=False
End Sub

但它给了我以下观点:

Book Name   Code    QTY Day
.Net                    x   <---Not required
Oracle                  x   
Book1       OB1     1   D
Book4       OPR     1   Thu
Java                    x
Book1       JPS     1   D
PHP                     x   
Book2       PHY     2   D

我不想要上面提到的行,因为今天没有书籍,也没有日常视图。

请让我知道,我的问题很清楚或请提供更多详细信息。

4

1 回答 1

0

如果我的假设是正确的,那么您使用 x 表示该行是书籍类型。鉴于此数据结构,过滤数据后,您需要检查后续行是否在 day 列中有 x。如果是这样,那么这两行之间没有书,因此没有该书类型的书。为此,您需要使用该SpecialCells函数并在遍历可见单元格的行时跟踪行号。您完全更新的代码应如下所示:

Private Sub Workbook_Open()
Dim myRange As Range
Dim curRowWithX As Integer
Dim lastRowWithX As Integer

    Range("A3:D19").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Range("G3:I6"), Unique:=False

    ' Get all visible cells in the filtered area
    Set myRange = Range("A3:D19").SpecialCells(xlCellTypeVisible)

    ' initialize row indexes
    curRowWithX = 0
    lastRowWithX = 0

    For Each Row In myRange.Rows
        ' Check if Day value of current row is x
        If Row.Cells(1, 4) = "x" Then

            ' Store current row and check if last Day value was x
            ' in the visible range was x, and hide if so
            curRowWithX = Row.Row
            If lastRowWithX > 0 Then Rows(lastRowWithX).EntireRow.Hidden = True

        Else
            ' Reset the current row index
            curRowWithX = 0
        End If

        ' Update the last row index with the current indext
        lastRowWithX = curRowWithX

    Next
End Sub
于 2013-11-07T14:20:29.587 回答