0

我使用这种语法(其中 pLO 是列表对象)根据可见行返回 listObject(Excel 表)的 Excel.range:

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

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

问题是上面的代码片段返回了一个包含许多区域的范围,其中可能包含这些区域中的重叠行!因此,如果我遍历返回范围内的所有区域,我会得到重复。我怎样才能只返回可见行,或者在随后的迭代期间过滤掉重复项?

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

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

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

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

我不能对不同的范围进行高级过滤,因为我需要返回过滤表的价值。

我希望这是有道理的。

干杯,

拉兹马塔兹

4

2 回答 2

2

尝试相同,但不使用.EntireRow如下:

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

并查看区域是什么,以及此结果中是否还有任何重叠行。

于 2012-12-07T07:04:28.680 回答
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
    

如果有人想完整查看解决方案,我可以上传工作簿。这个问题我花了几天时间才解决 - 所以请随时提问!

拉兹马塔兹

于 2012-12-10T16:20:25.017 回答