0

この種の構文(pLOはリストオブジェクト)を使用して、表示されている行に基づいて、listObject(Excelテーブル)のExcel.rangeを返します。

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

これは、列に対して高度なフィルターを実行した後に発生します。高度なフィルターが機能し、目視検査で正しい行数を返していることがわかります。

問題は、上記のコードスニペットが多くの領域を含む範囲を返すことです。この範囲には、領域内に重複する行が含まれている可能性があります。したがって、返された範囲内のすべての領域を反復処理すると、重複が発生します。表示されている行のみを返すか、後続の反復中に重複を除外するにはどうすればよいですか?

編集**** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** _ ** _

エリック、オーバーラップに関するいくつかの詳細情報。上記のreturnUniqueList範囲には、多数の「Area」オブジェクトが含まれています。これらの数は1からnまでで、「n」は元のテーブルに表示されている行の数を超える可能性があります。

これらの各エリアも範囲です(したがって、エリア1..n !!!を含めることもできます)。これらの領域の行を見ると、Area(1)にはArea(2)と同じ行が含まれている可能性があります。

編集終了**** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ****

フィルタリングされたテーブルのテーブルに相当するものを返す必要があるため、別の範囲に高度なフィルタを実行することはできません。

これが理にかなっていることを願っています。

乾杯、

LazzMaTazz

4

2 に答える 2

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

于 2012-12-10T16:20:25.017 に答える