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

时间:2012-12-06 14:21:53

标签: excel excel-vba vba

我使用这种语法(其中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

2 个答案:

答案 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