2012-12-06 1 views
0

Я возвращающая Excel.Range из в ListObject (таблица Excel), на основе видимых строк, используя этот вид синтаксиса (где ПЛО список объектов):Excel - почему мой диапазон имеет перекрывающиеся строки в областях?

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

Это происходит ПОСЛЕ Я делаю расширенный фильтр в столбце. Я вижу, что расширенный фильтр работал и возвращает правильное количество строк с помощью визуального контроля.

Проблема заключается в том, что приведенный выше фрагмент кода возвращает диапазон со многими областями, которые могут содержать перекрывающиеся строки в областях! Поэтому, если я повторяю все области в возвращаемом диапазоне, я получаю дубликаты. Как я могу либо возвращать видимые строки, либо отфильтровывать дубликаты во время последующей итерации?

EDIT * * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *

Эрик, еще немного информации о перекрытии. диапазон returnUniqueList выше будет содержать многочисленные объекты «Area», содержащиеся в нем. Они могут быть от 1 до n, где «n» может превышать количество видимых строк в моей исходной таблице.

Каждая из этих областей также является диапазоном (так же могут быть и области 1..n !!!). Глядя на строки в этих областях, Area (1) может содержать одинаковые строки в Area (2)!

END EDIT * * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****

Я не могу сделать расширенный фильтр на другой диапазон, потому что мне нужно, чтобы вернуть таблицу стоит отфильтрованной таблицы.

Надеюсь, это имеет смысл.

Приветствие,

LazzMaTazz

+0

Вы пытаетесь пройти через видимые строки только на одну колонку? –

+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

Привет, Эрик, я пробовал это, но он возвращает только диапазон, содержащий выбранный мной столбец. Думаю, я, возможно, придумал ответ, который я сейчас отправлю. –

Смежные вопросы