2014-08-26 13 views
4

Я использую Index/Match, чтобы получить данные из связанной таблицы для заполнения в первой таблице. В моей связанной таблице я отфильтровал значения, но отфильтрованные значения все еще заполняются в моей первой таблице. Если Index/Match недостаточно умен, чтобы захватывать только отфильтрованные значения, как я могу обойти это (предпочтительная формула, но приемлемая для VBA), чтобы получить только отфильтрованные значения.Как игнорировать отфильтрованные данные в формуле Excel

Вот моя текущая формула:

=INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0)) 
+0

= INDEX (Table_owssvr__1 [MyValues], MATCH ([@ [ID]], Table_owssvr__1 [ID], 0)) – Kode

+0

нажмите кнопку редактирования и положить, что в вопросе – whytheq

+0

Я думаю, что путь преуспеть формулы получить данные из скрыты области умнее, а не наоборот. Это означает, что мы можем скрыть наши разработки и все еще иметь формулы, которые ссылаются на эти скрытые области. – whytheq

ответ

1

Я был в состоянии получить эту работу следующим:

1) Создайте три листа, один для клиентов, один для покупок, и один для purchasesforclient.

2) Создайте макрос для копирования отфильтрованных значений в новый лист:

Sub Purchases() 
Dim Rng As Range 
Set Rng = Worksheets("Comments").Columns("A") 
Set Rng = Rng.Resize(65535, 1).Offset(1, 0) 
Set Rng = Rng.Resize(, 5).SpecialCells(xlCellTypeVisible) 
Rng.Copy Worksheets("PurchasesforClient").Range("A2") 
End Sub 

3) Когда я обновляю покупки через фильтр, я запустить макрос на шаге 2, создавая субтотальное поле и запуск макрос следующим образом. Поскольку это формула, для этого требуется расчет. Это встроенное в покупках листе, как VBA, где фильтрация происходит, когда В23 является субтотальным полем, которое меняется, когда он подсчитывает количество элементов, как только применяется фильтр:

Public CurrentValue As Double 

Private Sub Worksheet_Activate() 
CurrentValue = Application.WorksheetFunction.Sum(ActiveSheet.Range("B23")) 
End Sub 

Private Sub Worksheet_Calculate() 
If Application.WorksheetFunction.Sum(Range("B23")) <> CurrentValue Then Purchases 
End Sub 

4) Я использую теперь фильтруюсь значения на листе shoppingforclient для моей формулы index/match на листе клиентов. Это позволяет мне динамически фильтровать по дате, типу покупки и т. Д. И обновлять информацию на листе клиентов.

2

Возможно, функция SUBTOTAL полезна, поскольку она работает только с видимыми рядами. (Here «s некоторые более общее обсуждение SUBTOTAL)

Но если это не достаточно гибкой для ваших потребностей, here's как проверить фильтруется определенная клетка или нет.

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

Если суммирование по ячейкам не то, что вы хотите сделать, просто измените часть, указанную в комментариях. (Очевидно, что вы должны были бы изменить название функции от sumFilteredColumn к чему-то еще!)

Public Function sumFilteredColumn(startCell As Range) 

    Dim lastRow As Long ' the last row of the worksheet which startCell is on 
    Dim currentCell As Range 
    Dim runningTotal As Long ' keeps track of the sum so far 

    lastRow = lastRowOnSheet(startCell) 
    Set currentCell = startCell 

    ' Loop until the last row of the worksheet 
    Do While currentCell.Row <= lastRow 
     ' Check currentCell is not hidden 
     If Not cellIsOnHiddenRow(currentCell) Then 
      ' ------------------------------------------------- 
      ' Here's where the magic happens. Change this to 
      ' change sum to, e.g. concatenate or multiply etc. 
      If IsNumeric(currentCell.Value) Then 
       runningTotal = runningTotal + currentCell.Value 
      End If 
      ' ------------------------------------------------- 
     End If 
     Set currentCell = currentCell.Offset(1) ' Move current cell down 
    Loop 

    sumFilteredColumn = runningTotal 

End Function 

' return the number of the last row in the UsedRange 
' of the sheet referenceRange appears in 
Public Function lastRowOnSheet(referenceRange As Range) As Long 

    Dim referenceSheet As Worksheet 
    Dim referenceUsedRange As Range 
    Dim usedRangeCellCount As Long 
    Dim lastCell As Range 

    Set referenceSheet = referenceRange.Parent 
    Set referenceUsedRange = referenceSheet.usedRange 
    usedRangeCellCount = referenceUsedRange.Cells.CountLarge 

    Set lastCell = referenceUsedRange(usedRangeCellCount) 
    lastRowOnSheet = lastCell.Row 

End Function 

' Is the row which referenceCell is on hidden by a filter? 
Public Function cellIsOnHiddenRow(referenceCell As Range) As Boolean 

    Dim referenceSheet As Worksheet 
    Dim rowNumber As Long 

    Set referenceSheet = referenceCell.Parent 
    rowNumber = referenceCell.Row 

    cellIsOnHiddenRow = referenceSheet.Rows(rowNumber).EntireRow.Hidden 

End Function 
0

Вы уверены, что хотели бы усложнить жизнь ...

«Не пытайтесь изобретать колесо» как они говорят ...

=INDEX(ARRAY.FILTER(Table_owssvr__1[MyValues]),MATCH([@[ID]],ARRAY.FILTER(Table_owssvr__1[ID]),0))

ARRAY.FILTER() function «сохраняет только видимые ячейки диапазона (например отфильтрованный диапазон) в массиве и возвращает этот массив."


мой ответ требует MOREFUNC аддон *


MOREFUNC ADDON

  • Morefunc Аддон бесплатная библиотека 66 новых функций рабочего листа.
  • HERE является некоторая информация (по оригинальному автору)
  • здесь последний рабочий download link я нашел
  • здесь хороший installation walk-through video
1

LondonRob упомянул функцию SUBTOTAL. AGGREGATE - это более общая функция, чем SUBTOTAL, которая работает со знанием как скрытых, так и фильтрованных ячеек (есть разница). Они сделают это без добавок или VBA, хотя и с некоторыми трудночитаемыми формулами.

Я узнал об этом от here.

+0

Хотя это теоретически может ответить на вопрос, [было бы желательно] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. – Takarii

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