2012-12-06 79 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

嗨艾瑞克,我試過了,但它只返回一個範圍,包括我目前選擇的列。我想我可能會想出一個答案,我現在要發佈。 –