Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ...использование Application.Frequency / 25 сообщений из 36, страница 1 из 2
04.05.2010, 03:19
    #36610129
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Доброго времени суток

Борюсь с использованием Application.Frequency в коде.

Есть некий массив данных, имеющий координаты A1:A10,

1
2
3
3
2
1
3
2
2
3

для которого нужно оценить частоту встречаемости цифр. Например, до 2, включительно. Сделать это надо через функцию листа =Частота().
Если записывать оценку частоты встречаемости напрямую - всё считается нормально, и в Range("C2") выводится 6:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Macros1()

Dim r1 as Object, freq As Variant 

    Set r1 = Range("A1:A10")

    freq = Application.Frequency(r1, Range("B1")) 'Range("B1") - ячейка, в которую на листе введен критерий 2
    
    Range("C2") = freq
End Sub

Однако если модифицировать формулу, введя вместо Range("B1") цифру 2, функция перестает работать. Также она не считается если вместо Range("B1") указывать переменную, в которой происходит перебор цифр:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub Macros2()

Dim r1 as Object, freq As Variant 
Dim min_r1 as Long, min_r2 as Long
Dim i as Long

    Set r1 = Range("A1:A10")
    With Application
        min_r1=.min(r1) 
        max_r1=.max(r1)   
    End with

    For i=min_r1 to max_r1
        freq = Application.Frequency(r1, i)
    Next i

End Sub

Какие изменения необходимо ввести в код, чтобы запустить Application.Frequency?
...
Рейтинг: 0 / 0
04.05.2010, 10:17
    #36610324
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Код: plaintext
1.
2.
For i = min_r1 To max_r1
   freq = Application.Frequency(r1, Array(i))
Next i
...
Рейтинг: 0 / 0
04.05.2010, 10:26
    #36610344
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFisher, лучше объявлять r1 как диапазон (Dim r1 as Range), а вызов функции Frequency() для порядка переписать как Application.WorksheetFunction.Frequency().
...
Рейтинг: 0 / 0
04.05.2010, 14:46
    #36611067
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth,
почему лучше через Range?
...
Рейтинг: 0 / 0
04.05.2010, 15:09
    #36611120
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth, спасибо. Всё работает. Не понятно мне использование Range и Array, но интернет мне в помощь. Еще раз спасибо.
...
Рейтинг: 0 / 0
04.05.2010, 17:35
    #36611430
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Range - потому как r1 - это объектная переменная, ссылающаяся на диапазон (конкретизируем этот момент).

Array - потому, что второй аргумент функции Frecuency() должен быть массивом значений.
...
Рейтинг: 0 / 0
04.05.2010, 18:11
    #36611488
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth...а вызов функции Frequency() для порядка переписать как Application.WorksheetFunction.Frequency().
Это разные вызовы и функции ведут себя поразному, т.ч. к порядку подобная перезапись имеет слабое отношение :-)

Код: plaintext
1.
2.
Sub test1()
    x = Application.Frequency([A1:A10], "y")
End Sub

Код: plaintext
1.
2.
Sub test2()
    x = Application.WorksheetFunction.Frequency([A1:A10], "y")
End Sub
...
Рейтинг: 0 / 0
05.05.2010, 00:05
    #36611865
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
KL (XL)vlth...а вызов функции Frequency() для порядка переписать как Application.WorksheetFunction.Frequency().
Это разные вызовы и функции ведут себя поразному, т.ч. к порядку подобная перезапись имеет слабое отношение

Автор, судя по описанию, хотел использовать функцию листа.
Поскольку, как верно замечено, это разные вызовы, и функции ведут себя по-разному, "для порядка" выбираем документированный вариант.
...
Рейтинг: 0 / 0
05.05.2010, 04:06
    #36611955
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
KL (XL)Это разные вызовы и функции ведут себя поразному

Про разное поведение можете подробней написать?
...
Рейтинг: 0 / 0
05.05.2010, 09:45
    #36612133
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
KL (XL)Это разные вызовы и функции ведут себя поразному

Про разное поведение можете подробней написать?

SirFisher, вызовы функций frecuency(), min() и max(), которые Вы используете, должны обеспечивать совместимость с Excel 5 и Excel 95:
Excel® 2007 VBA Programmer’s ReferenceFor compatibility with Excel 5 and Excel 95, you can use Application rather than
WorksheetFunction
Если к этому можно добавить что-то ещё, то я присоединяюсь к Вашему вопросу ))
...
Рейтинг: 0 / 0
05.05.2010, 10:07
    #36612182
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Добавил пересчет данных. Однако теперь функция не возвращает своего значения и выполнение макроса прерывается ошибкой Type mismatch на data_r1. Переназначение типа данных желаемого эффекта не дало.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub Macros2()

Dim r1 As Range, freq As Variant
Dim R1_count As Variant
Dim min_r1 As Double, max_r1 As Double
Dim i As Long, data_r1 As Variant

    Set r1 = Range("A1:A10")
    
    With Application.WorksheetFunction
        R1_count = .CountIf(r1, "<>""")
        min_r1 = .Min(r1)
        max_r1 = .Max(r1)
    End With

    For i = min_r1 To max_r1
        freq = Application.WorksheetFunction.Frequency(r1, Array(i))
        data_r1 = freq / R1_count
        Range("C3") = data_r1
    Next i

End Sub
...
Рейтинг: 0 / 0
05.05.2010, 10:43
    #36612269
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Код: plaintext
R1_count = .CountIf(r1, "<>")
...
Рейтинг: 0 / 0
05.05.2010, 10:52
    #36612292
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Код: plaintext
data_r1 = freq( 1 ) / R1_count
???
...
Рейтинг: 0 / 0
05.05.2010, 13:40
    #36612880
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth,

здесь
Код: plaintext
R1_count = .CountIf(r1, "<>""")
отсекаются пустые значения

не понял мысли про
Код: plaintext
data_r1 = freq( 1 ) / R1_count
...
Рейтинг: 0 / 0
05.05.2010, 14:04
    #36612942
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFishervlth,

здесь
Код: plaintext
1.
2.
3.
4.
R1_count = .CountIf(r1, "<>""")[src]
отсекаются пустые значения

не понял мысли про
[src vba]data_r1 = freq( 1 ) / R1_count


Ваша CountIf(r1, "<>""") у меня вернула кол-во всех ячеек в диапазоне, что равносильно r1.cells.count

CountIf(r1, "<>") возвращает кол-во непустых ячеек в r1 (ячеек, в которых есть значение или формула).

Здесь у Вас
Код: plaintext
data_r1 = freq/ R1_count
записана попытка выполнения арифметического действия с массивом , что и вызывает появление сообщения об ошибке.
Используйте freq(НомерЭлемента).
...
Рейтинг: 0 / 0
05.05.2010, 14:22
    #36612989
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth
Код: plaintext
data_r1 = freq/ R1_count
Используйте freq(НомерЭлемента).

Записал как
Код: plaintext
data_r1 = freq(i)/ R1_count
запись вызывает прежнюю ошибку - Type mismatch
...
Рейтинг: 0 / 0
05.05.2010, 14:26
    #36612999
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFisher, почему "i" ? - ставте 1 (или 2 - смотря что Вы отслеживаете).
...
Рейтинг: 0 / 0
05.05.2010, 14:31
    #36613014
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
Код: plaintext
data_r1 = freq( 1 ,  1 ) / R1_count
...
Рейтинг: 0 / 0
05.05.2010, 14:33
    #36613023
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
или
Код: plaintext
data_r1 = freq( 2 ,  1 ) / R1_count
...
Рейтинг: 0 / 0
05.05.2010, 14:52
    #36613077
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlth,

вот теперь всё работает. Не ожидал, что эта функция будет столь заковыристой. Спасибо.

В заключение. Скажите, пожалуйста, это
Код: plaintext
freq( 1 ,  1 )
координаты двухмерного массива? Что на первом месте, что на втором?
...
Рейтинг: 0 / 0
05.05.2010, 15:18
    #36613160
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFishervlth,

вот теперь всё работает. Не ожидал, что эта функция будет столь заковыристой. Спасибо.

В заключение. Скажите, пожалуйста, это
Код: plaintext
freq( 1 ,  1 )
координаты двухмерного массива? Что на первом месте, что на втором?

Из Справки:

"Количество элементов в возвращаемом массиве на единицу больше числа элементов в массиве массив_интервалов. Дополнительный элемент в возвращаемом массиве содержит количество значений, больших чем максимальное значение в интервалах. Например, при подсчете трех диапазонов значений (интервалов), введенных в три ячейки, убедитесь в том, что функция ЧАСТОТА возвращает значения в четырех ячейках. Дополнительная ячейка возвращает число значений в массив_данных, больших чем значение границы третьего интервала."
...
Рейтинг: 0 / 0
05.05.2010, 15:29
    #36613195
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
vlthKL (XL)Это разные вызовы и функции ведут себя поразному

Про разное поведение можете подробней написать?

SirFisher, вызовы функций frecuency(), min() и max(), которые Вы используете, должны обеспечивать совместимость с Excel 5 и Excel 95:
Excel® 2007 VBA Programmer’s ReferenceFor compatibility with Excel 5 and Excel 95, you can use Application rather than
WorksheetFunction
Если к этому можно добавить что-то ещё, то я присоединяюсь к Вашему вопросу ))

К этому еще можно добавить как минимум два пункта раз уж вопрос SirFisher о разном поведении:

1) По-разному возвращаются ошибки (то, что я пытался проиллюстрировать примерами кода выше). Функции коллекции WorksheetFunction возвращают значение ошибки и прерывают код, а функции из Application возвращают значение типа String с номером ошибки.

2) Функции коллекции WorksheetFunction обычно выполняются быстрее функций из Application, что обусловлено методом доступа к ним
...
Рейтинг: 0 / 0
05.05.2010, 15:39
    #36613223
SirFisher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
KL (XL),

наверное я не правильно использую данную функцию, т.к. при построении вариационных рядов мне удобней было прописывать ее со ссылкой не на массив, а на единичный интервал, например =частота(A1:A100;B1). Правда при этом она возвращала кумуляту (накопление частот), что решалось простым вычитанием суммы предыдущих частот.
Вероятно, из-за такого использования функции и возникли у меня проблемы с ее реализацией через VBA
...
Рейтинг: 0 / 0
05.05.2010, 16:32
    #36613376
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFisherKL (XL),

наверное я не правильно использую данную функцию, т.к. при построении вариационных рядов мне удобней было прописывать ее со ссылкой не на массив, а на единичный интервал, например =частота(A1:A100;B1). Правда при этом она возвращала кумуляту (накопление частот), что решалось простым вычитанием суммы предыдущих частот.
Вероятно, из-за такого использования функции и возникли у меня проблемы с ее реализацией через VBA
Мне не очень понятно использование данной функции в вашем случае. Судя по обсуждению, проблема была в использовании неверного типа данных в параметрах. Опять-таки, если потом надо вычитать сумму предыдущих частот, отчего сразу не использовать COUNTIF? Либо не сделать что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub Test()

Dim r1 As Range, freq As Variant
Dim R1_count As Variant
Dim data_r1 As Double

    Set r1 = Range("A1:A10")
    
    With Application.WorksheetFunction
        R1_count = .Count(r1)
        freq = .Frequency(r1, r1)
        data_r1 = freq(.Match( 2 , r1,  0 ),  1 ) / R1_count
    End With

    Range("C3") = data_r1

End Sub
...
Рейтинг: 0 / 0
05.05.2010, 21:24
    #36613975
vlth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
...использование Application.Frequency
SirFisherВ заключение. Скажите, пожалуйста, это
Код: plaintext
freq( 1 ,  1 )
координаты двухмерного массива? Что на первом месте, что на втором?

ЧАСТОТА -
Вычисляет распределение значений по интервалам и возвращает вертикальный массив , содержащий на один элемент больше, чем массив интервалов.(Первый аргумент функции - массив данных, второй - массив интервалов)

Иллюстрация (аналогичный вертикальный массив - из двух "строк" и одного "столбца"):
Код: plaintext
1.
2.
Dim a( 1  To  2 ,  1  To  1 )
a( 1 ,  1 ) =  6 
a( 2 ,  1 ) =  4 
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ...использование Application.Frequency / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]