Excel – 为什么我的范围在区域中有重叠行?

我使用这种语法(其中pLO是一个列表对象)基于可见行返回一个listObject(Excel表)的Excel.range。

Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible).EntireRow

这是在我对一列进行高级过滤后发生的。 我可以看到,先进的filter已经工作,并通过目视检查返回正确的行数。

问题是,上面的代码片段返回一个范围有很多区域,可能在区域中包含重叠的行! 所以如果我遍历返回范围中的所有区域,我会得到重复的。 我怎么才能只返回可见的行,或在随后的迭代过滤出重复?

编辑* * ** * ** * ** * ** * ** * ** * ** * ** * ** ** ** ** ** ** ** ** ** ** ** * *

Erik,关于重叠的更多信息。 上面的returnUniqueList范围将包含许多“区域”对象。 这些数字可以从1到n,其中“n”可以超过我原始表中可见行的数量。

每个这些区域也是一个范围(所以也可以包含区域1..n !!!)。 查看这些区域中的行,Area(1)可能包含与Area(2)相同的行!

结束编辑* * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****

我不能做一个高级filter到不同的范围,因为我需要返回过滤表的价值。

我希望这是有道理的。

干杯,

LazzMaTazz

在没有.EntireRow情况下尝试一下,如下所示:

 'Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible).EntireRow Set returnUniqueList = pLO.range.SpecialCells(xlCellTypeVisible) 

并查看区域是什么,以及在这个结果中是否有重叠的行。

我遇到这个问题的解决scheme是在我的工作簿中创build一个新的工作表,并将过滤的表复制到这个新的工作表中。

这总是(在我迄今为止对各种表进行的testing中)似乎将来自源工作表的已过滤表复制到临时目标工作表中的连续行中。 然后返回一个带有单个“区域”的范围对象,可以可靠地使用它。

我必须小心:

  • 请确保在完成数据处理后清理临时工作表
  • 每次操作后清除临时工作表单元格,这样旧的数据不会造成我的问题。

     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 

如果有人希望看到解决scheme,我可以上传工作簿。 这个问题花了我几天的时间来解决 – 所以请随时问!

LazzMaTazz