Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在筛选表中循环行_Excel_Autofilter_Vba - Fatal编程技术网

Excel 在筛选表中循环行

Excel 在筛选表中循环行,excel,autofilter,vba,Excel,Autofilter,Vba,是否有人有一个很好的方法来循环过滤表中的行 我倾向于需要使用筛选表中的一些数据来填充另一个文档,在本例中是一个会计报表工作表。由于行是非连续的,我以前使用行号填充数据的方法似乎失败了 SOAwb是一个单独的工作簿,将使用TSOA表中的数据填充,其中大部分代码实际上可以工作,但仍然包括来自筛选/隐藏范围的数据 j是SOAwb上的第一个空行,因此在for循环结束时,当j=j+1时,下一个空行重复填充过程 For k = 1 To TSOA.DataBodyRange.Columns(1).Speci

是否有人有一个很好的方法来循环过滤表中的行

我倾向于需要使用筛选表中的一些数据来填充另一个文档,在本例中是一个会计报表工作表。由于行是非连续的,我以前使用行号填充数据的方法似乎失败了

SOAwb是一个单独的工作簿,将使用TSOA表中的数据填充,其中大部分代码实际上可以工作,但仍然包括来自筛选/隐藏范围的数据

j是SOAwb上的第一个空行,因此在for循环结束时,当j=j+1时,下一个空行重复填充过程

For k = 1 To TSOA.DataBodyRange.Columns(1).SpecialCells(xlCellTypeVisible).Count

SOAwb.Worksheets(1).Cells(j, 4) = TSOA.DataBodyRange(k, 6) 'debit amount

SOAwb.Worksheets(1).Cells(j, 5) = TSOA.DataBodyRange(k, 7) 'credit amt

SOAwb.Worksheets(1).Cells(j, 1) = TSOA.DataBodyRange(k, 3) 'Date

SOAwb.Worksheets(1).Cells(j, 2) = Right(TSOA.DataBodyRange(k, 3), 2) & "-" & TSOA.DataBodyRange(k, 2) 'Reference Number

Select Case TSOA.DataBodyRange(k, 1)

Case "INV"

    SOAwb.Worksheets(1).Cells(j, 3) = "Invoice"

Case "CR"

    SOAwb.Worksheets(1).Cells(j, 3) = "Credit"

Case Else

    MsgBox "Invalid Type"

End Select

j = j + 1

Next

如果k仍然是表中的相对行位置,那就太完美了。是否有人对如何执行此操作或使用筛选范围将数据(逐行)填充到另一工作簿的替代方法有任何建议?

隐藏行的高度为0

您必须循环所有使用的行,并且只处理可见的行

For k = 1 To TSOA.DataBodyRange.Rows.Count

与此类似:

For k = 1 To TSOA.DataBodyRange.Rows.Count

    With SOAwb.Worksheets(1)

        If TSOA.DataBodyRange(k, 6).Height > 0 Then

            .Cells(j, 4) = TSOA.DataBodyRange(k, 6) 'debit amount
            .Cells(j, 5) = TSOA.DataBodyRange(k, 7) 'credit amt
            .Cells(j, 1) = TSOA.DataBodyRange(k, 3) 'Date
            .Cells(j, 2) = Right(TSOA.DataBodyRange(k, 3), 2) & "-" & _
                                TSOA.DataBodyRange(k, 2) 'Reference Number
            Select Case TSOA.DataBodyRange(k, 1)
                Case "INV": .Cells(j, 3) = "Invoice"
                Case "CR":  .Cells(j, 3) = "Credit"
                Case Else:  MsgBox "Invalid Type"
            End Select
        End If
    End With
    j = j + 1
Next

使用已直接指定的范围集合,而不是其计数

Dim rCell as Range
For each rCell in TSOA.DataBodyRange.Columns(1).SpecialCells(xlCellTypeVisible)
    ' Access the cells as
    t.DataBodyRange.Cells(c.Row - t.HeaderRowRange.Row, ColumnNum)
Next

使用
for
循环和
.specialcells(xlcelltypevisible)
循环表格,仅使用过滤结果。相应地修改您的代码。这就是我的代码所做的,我一直在努力解决“相应地修改您的代码”这一点。多亏了两种剥龙虾皮的方法,我下次遇到For循环时会注意到这一点。这就是为什么这么多人都赢了的原因
Dim rCell as Range
For each rCell in TSOA.DataBodyRange.Columns(1).SpecialCells(xlCellTypeVisible)
    ' Access the cells as
    t.DataBodyRange.Cells(c.Row - t.HeaderRowRange.Row, ColumnNum)
Next