2012-12-06 46 views
0

我返回的ListObject(Excel表格),基于可见行的Excel.range,使用这种语法(其中巴解组织是一个列表对象):Excel - 为什么我的范围在区域中有重叠行?

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

这之后发生的事情我在一列上做了一个高级过滤器。我可以看到高级过滤器已经工作,并且通过视觉检查返回正确数量的行。

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

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

埃里克,一些关于重叠的更多信息。上面的returnUniqueList范围将包含众多'Area'对象。这些数字可以从1到n,其中'n'可以超过我原始表中可见行的数量。

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

编辑完* * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****

我不能做一个先进的过滤器,以不同的范围,因为我需要返回过滤表的表价值。

我希望这是有道理的。

干杯,

LazzMaTazz

+0

您是否想通过1列的可见行循环? –

+0

pLO是一个工作表对象?在VBA中没有List对象.. – InContext

+0

joseph4tw - 不,我正在过滤一个列,然后查看表中的每个可见行,从每行中提取信息。 –

回答

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

2

尝试不一样的.EntireRow为:

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

,看到的领域是什么,如果有尚未在这一结果的任何重叠行。

+0

嗨艾瑞克,我试过了,但它只返回一个范围,包括我目前选择的列。我想我可能会想出一个答案,我现在要发布。 –