簡體   English   中英

使用 SpecialCells(xlCellTypeVisible) in Excel VBA 中的表創建的范圍獲取額外的行,這些行已被過濾

[英]Range created from table with SpecialCells(xlCellTypeVisible) in Excel VBA gets extra row that are filtered

我有一個包含多個數據的表格的工作表。 我需要將過濾后的數據復制到 word 文檔中。 首先,我嘗試使用 excel 中的 .copy 和 word 中的 .pastespecial,但在過去 4 天閱讀了大量內容后,我開始直接使用對象,因為復制/粘貼過程很慢,而且沒有得到我想要的結果想。

使用 Object 方法,我發現當帶有 specialCells(xCellTypeVisible) 的范圍有多個區域時,您需要查看每個區域以獲取行數。 但是由於某種原因,在 Range 中添加了一行,但該行未顯示在 Filter 中。

代碼通過 A 列中的字符串和 D 列中的數組(D 列可以具有以下值 V、W、X、Y 和 Z)在名為“Horas”的工作表中過濾名為“Horas”的表

當按 A 列過濾然后按數組(X、Y 和 Z)過濾時,使用 A 列過濾且 XY 和 Z 以外的值的某些行在范圍內且未被過濾。

這是代碼的一部分

'code to set word app, word doc and set XLSDoc objects, etc
    Set xlsSheet = xlsDoc.Worksheets("Horas")
    xlsSheet.Activate
    
    ' Clear AutoFilter
    For nCounter = 1 To xlsSheet.ListObjects("Horas").ListColumns.Count
        xlsSheet.ListObjects("Horas").Range.AutoFilter Field:=nCounter
    Next
    
    ' Filter by customer and Row Type 
    xlsSheet.ListObjects("Horas").Range.AutoFilter Field:=1, Criteria1:=customer
    xlsSheet.ListObjects("Horas").Range.AutoFilter Field:=4, Criteria1:=Array("X", "Y", "Z"), Operator:=xlFilterValues
    
    ' calculate las row in table            
    Dim LR As Long
    LR = Range("A" & Rows.Count).End(xlUp).Row - 1
    Dim rngFiltered As Range
    Set rngFiltered = Nothing
                   
    On Error Resume Next
    'define range with cells visible in table
    Set rngFiltered = Range("B2:G" & LR).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    ' check if range return values
    If Not rngFiltered Is Nothing Then
        Dim lcount
        Dim rngArea
    'check every area in range to get row count
        For Each rngArea In rngFiltered.SpecialCells(xlCellTypeVisible).Areas 
             lcount = lcount + rngArea.Rows.Count
        Next
        Dim i As Long
    'Add a row in word Table for every row in range filtered with visible cells
        For i = 1 To lcount
            HourTable.Rows.Add
            Set oRow = HourTable.Rows(HourTable.Rows.Count)
            Dim z As Long
            For z = 1 To 6
    'Copy every cell to word document
                 oRow.Cells(z).Range.Text = rngFiltered.Cells(i, z))
    Else
    'code to add a row if range is empty
        HourTable.Rows.Add
        Set oRow = HourTable.Rows(HourTable.Rows.Count)
        Dim mergeRNG As Word.Range
        Set mergeRNG = oRow.Cells(1).Range
        mergeRNG.End = oRow.Cells(HourTable.Columns.Count).Range.End
        mergeRNG.Cells.Merge
        HourTable.Cell(HourTable.Rows.Count, 1).Range.Text = "No se registraron horas en el período"
    End If

此代碼按客戶正確過濾,但當客戶有一些行的 XY 和 Z 以外的值仍然出現在范圍內並被復制到 Word 表時。

我想我和這個線程有同樣的問題,但在這個線程中,數據出現在同一區域的連續行中。 在我的例子中,當應用 Column D 過濾器時,多行被過濾。

提前感謝您的閱讀。 請原諒我的英文寫作。

oRow.Cells(z).Range.Text = rngFiltered.Cells(i, z)

您不能使用這樣的索引訪問多區域(非連續)范圍。

為了顯示:

Sub Tester()

    Dim rngVis As Range, rw As Range, i As Long
    
    'rows 2:3 and 5 are hidden
    Set rngVis = ActiveSheet.Range("A1:C6").SpecialCells(xlCellTypeVisible)
    
    Debug.Print rngVis.Address(False, False)             '>> A1:C1,A4:C4,A6:C6
    
    Debug.Print rngVis.Cells(1, 1).Address(False, False) '>> A1
    Debug.Print rngVis.Cells(2, 1).Address(False, False) '>> A2 ! Cannot access range this way
    
    'loop rows like this, not using a counter.
    For Each rw In rngVis.Rows
        i = i + 1
        Debug.Print i, rw.Address(False, False)
    Next rw
    'Output:
    '1            A1:C1
    '2            A4:C4
    '3            A6:C6

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM