2017-02-20 15 views
0

У меня есть набор данных, в котором я использую фильтр. Я просто хочу рассчитать общие значения в столбце N, которые видны. Данные начинаются в строке 2 и заканчиваются в строке 2047.SpecialCells (xlCellTypeVisible) также включает скрытые/отфильтрованные ячейки

Я видел this thread, но это дает мне тот же тип проблемы, который у меня есть.

Вот моя функция:

Function sumVisible() As String 
Dim rng As Range 
Set rng = Range("N2:N2047").SpecialCells(xlCellTypeVisible) 
' Debug.Print "Range: " & rng.Address & ", Sum: " & WorksheetFunction.Sum(rng) 
sumVisible = Format(WorksheetFunction.Sum(rng), "$#,###.##") 
End Function 

С моим текущим фильтром, моя строка заголовка (1) видно, как и строки 901 до 937 Итак, я хочу подвести N901: N937.

Однако rng продолжает устанавливаться в $N$2:$N$2047. Я ожидал, что это будет $N$901:$N$937.

Используя функцию, которая дается нить я связан выше, я получаю диапазон $N$2:$N$937 ... так, по крайней мере, я правильно получать конец строки, но не начальную строку.

Но!, если я нахожу Range("N2:N2047").SpecialCells(xlCellTypeVisible).Select в окне Immediate, вне макроса, он правильно выбирает только видимые ячейки. И еще один шаг, делая ?Range("N2:N2047").SpecialCells(xlCellTypeVisible).address правильно возвращает $N$901:$N$937.

Что может быть неправильным?

Редактировать: Я только что нашел, что выполнение =SUBTOTAL(9,N1:N2047) будет просто суммировать видимые ячейки, поэтому я использую это. Но мой вопрос все еще стоит - почему не SpecialCells(xlCellTypeVisible) работает правильно в макросе?

+0

Функция работает правильно для меня. Как вы скрыли строки, которые вы не хотите включать? (Может быть, есть что-то смешное в том, как это делается, что означает, что Excel не считает, что '.Hidden' является' True'.) – YowE3K

+0

@ YowE3K - Я просто использую фильтр. У меня есть данные в столбцах, и я отфильтровываю данные на основе столбца. У меня строка '2' отфильтрована и выполняется'? Rows (2) .Hidden' в Immediate Window правильно вернулось «True». У меня также нет событий типа «Worksheet_Change», единственный макрос - тот, о котором я спрашиваю. – BruceWayne

+0

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

ответ

1

Попробуйте установить ваш rng с ниже линии:

Set rng = Range("N2:N" & Cells(Rows.Count, "N").End(xlUp).Row).SpecialCells(xlCellTypeVisible) 

Позже с помощью отладки линии Debug.Print rng.Address, я получаю следующий диапазон в немедленном окне:

$N$901:$N$937 
+0

Хм, хорошая идея, но я все еще получаю '$ N $ 2: $ N $ 937' , Может это как-то быть данными ...? Я не делаю много, буквально просто фильтруя по одной колонке, и ничего «фантазии». Я даже полностью определил диапазон, чтобы он положительно работал на 'Sheet1'. Есть больше информации. Я мог бы дать? Я мог бы, конечно, разместить некоторые образцы данных, но у меня есть ощущение, что это больше связано с моим WB, чем с самими данными. – BruceWayne

+0

@BruceWayne это как-то связано с вашими данными или структурой, я провел несколько тестов с различными фильтрами, и результаты были хорошими. Какой тип формата у вас в столбце J? –

+0

Столбец J форматируется как «Номер». Столбец N был «General», но они на самом деле являются числами. Позвольте мне форматировать их как число и повторить попытку. Edit: Aha, я изменил столбец N на 'Number', и похоже, что он работает. Однако это странно. Почему бы не работать с «Генералом»? – BruceWayne