![](/img/trans.png)
[英]SpecialCells(xlCellTypeVisible) extra row is selected 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.