我使用这种语法(其中pLO是列表对象)返回基于可见行的listObject(Excel表)的Excel.range:
Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible).EntireRow
这是在我对列进行高级过滤后发生的。我可以看到高级过滤器已经工作,并通过目视检查返回正确的行数。
问题是上面的代码片段返回了一个包含许多区域的范围,这些区域可能包含区域中的重叠行!因此,如果我遍历返回范围内的所有区域,我会得到重复项。如何才能返回可见行,或者在后续迭代过程中过滤掉重复项?
编辑*的 * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *
Erik,有关重叠的更多信息。上面的returnUniqueList范围将包含许多“Area”对象。这些数字可以从1到n,其中“n”可以超过原始表中可见行的数量。这些区域中的每一个也是一个范围(因此也可以包含区域1..n !!!)。查看这些区域中的行,Area(1)可以包含与Area(2)相同的行!
结束编辑* * ** * ** * ** * ** < EM> *
** * ** * ** * ** * ** < EM> * ** * ** * ** * ** * ** < EM> * ****我不能对不同的范围进行高级过滤,因为我需要返回值过滤表的表。
我希望这是有道理的。
干杯,
LazzMaTazz
答案 0 :(得分:2)
在没有.EntireRow
的情况下尝试相同:
'Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible).EntireRow
Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible)
并查看区域是什么,以及此结果中是否有任何重叠的行。
答案 1 :(得分:0)
我遇到此问题的解决方案是在我的工作簿中创建一个新工作表,并将过滤后的表复制到这个新工作表中。
这总是(在我目前为止使用各种表的测试中)似乎将过滤后的表从源工作表复制到临时目标工作表中的连续行。然后返回一个带有单个“区域”的范围对象,可以可靠地使用它。
我必须小心:
在每次操作后清除临时工作表单元格,因此旧数据不会给我带来问题。
Private Function copyToNewWorkSheet() As Excel.range
' call this when the sourcesheet (pWkSht) is already filtered.
Dim myWkBk As New Excel.Workbook
Dim tempWs As New Excel.Worksheet
' if the first time this is called, create the new worksheet
If WorksheetExists("TempWorkSheet") Then
Set tempWs = pMyWkBk.Worksheets("TempWorkSheet")
Else
Set tempWs = pMyWkBk.Worksheets.Add(After:=pMyWkBk.Worksheets(pMyWkBk.Worksheets.Count))
tempWs.Name = "TempWorkSheet"
End If
' clear the temp worksheet contents
tempWs.Cells.Clear
' reselect my source worksheet (which is already filtered)
pWkSht.Select
' it falls over sometimes if this isn't here - any thoughts???
pWkSht.range("A1", pWkSht.Cells(pWkSht.rows.Count, "A").End(xlUp)).Select
' copy the required from the course worksheet, using information from the table (pLO) on the worksheet
pWkSht.range("A1", pWkSht.Cells(pLO.range.Areas(pLO.range.Areas.Count).rows.Count, "A")).Resize(, pLO.range.Columns.Count).Copy tempWs.range("A1")
' return the 'clean' range from the temporary worksheet
Set copyToNewWorkSheet = tempWs.range("A1", tempWs.Cells(tempWs.rows.Count, "A").End(xlUp)).Resize(, pLO.range.Columns.Count)
End Function
如果有人想要完整地查看解决方案,我可以上传工作簿。这个问题花了我几天时间来解决 - 所以请随时问一下!
LazzMaTazz