Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Excel, вопрос по фильтрам


Автор: Andrew1 30.5.2006, 13:09
Есть пользовательская функция, аргументом которой является диапазон ячеек. Функция проводит расчет для этого диапазона. Подскажите как при наложении фильтра на этот диапазон сделать так, чтобы подсчитывались только видимые значения (удовлетворяющие фильтру)? Или иначе, как определить отфильтрованый диапазон ячеек?
 

Автор: Дмит 30.5.2006, 14:53
К примеру:
Код

Dim i As Long
For i = 1 To Range("A1:D20").Rows.Count
    If Range("A1:D20").Rows(i).Hidden = False Then
        Range("A1:D20").Cells(i, 1) = "TS"
    End If
Next
 

Автор: Aloha 30.5.2006, 15:12
Andrew1
У меня работает такой код:
Код

Sub sVisibleRng()
  Dim sh As Worksheet
  Dim AF_Rng As Range
  Dim VisibleRng As Range
  Dim i As Integer
  Set sh = Worksheets("Лист1")
  Set AF_Rng = sh.AutoFilter.Range
Debug.Print AF_Rng.Address
  For i = 1 To AF_Rng.Rows.Count   'если 1-я строка автофильтра - заголовок то
                                   'цикл начинаем с i=2
    If Not AF_Rng.Rows(i).Hidden Then
      If TypeName(VisibleRng) = "Nothing" Then
        Set VisibleRng = sh.AutoFilter.Range.Rows(i)
      Else
        Set VisibleRng = Union(VisibleRng, AF_Rng.Rows(i))
      End If
    End If
  Next i
Debug.Print VisibleRng.Address
  Call myFunction(VisibleRng)
End Sub

Function myFunction(myRng As Range)

End Function

 

Автор: AsIs 30.5.2006, 19:17
Цитата(Andrew1 @ 30.5.2006,  13:09)
Есть пользовательская функция, аргументом которой является диапазон ячеек. Функция проводит расчет для этого диапазона. Подскажите как при наложении фильтра на этот диапазон сделать так, чтобы подсчитывались только видимые значения (удовлетворяющие фильтру)? Или иначе, как определить отфильтрованый диапазон ячеек?

Если без макросов, то функция Промежуточные.Итоги. 

Автор: Staruha 30.5.2006, 20:55
Дмит
 
Цитата

If Range("A1:D20").Rows(i).Hidden = False Then
        Range("A1:D20").Cells(i, 1) = "TS"

 
Код

 If Rows(i).Hidden = false Then
   накопитель=накопитель+ Cells(i, 1) 
 

Автор: Andrew1 31.5.2006, 12:11
Цитата(AsIs @  30.5.2006,  19:17 Найти цитируемый пост)
Если без макросов, то функция Промежуточные.Итоги.  

Дело в том, что эта функция позволяет использовать только 11 итоговых функций. А как быть с остальными?

Цитата(Aloha @  30.5.2006,  15:12 Найти цитируемый пост)

    If Not AF_Rng.Rows(i).Hidden Then
      If TypeName(VisibleRng) = "Nothing" Then
        Set VisibleRng = sh.AutoFilter.Range.Rows(i)
      Else
        Set VisibleRng = Union(VisibleRng, AF_Rng.Rows(i))
      End If
    End If

Такой код работает и в результате полученый диапазон можно вставить в стандартную функцию (WorksheetFunction). Но возникла такая проблема: если стандартная функция в качестве аргументов требует два диапазона (напр. функция НАКЛОН), то если этим кодом вычислить отдельно два диапазона и подставить их в эту функцию - возникает ошибка. Это связано с тем, что адрес диапазона имеет вид (напр. $A$1,$A$3:$A$5). Если подставить в функцию два таких диапазона, то она это не понимает. Можно это как-то решить? Очень не хотелось бы самому писать алгоритмы для подсчета такого, какой делают стандартные функции.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)