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

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

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

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

Про разное поведение можете подробней написать?
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36612133
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...использование Application.Frequency
    #36612182
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавил пересчет данных. Однако теперь функция не возвращает своего значения и выполнение макроса прерывается ошибкой 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
...использование Application.Frequency
    #36612269
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
R1_count = .CountIf(r1, "<>")
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36612292
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
data_r1 = freq( 1 ) / R1_count
???
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36612880
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth,

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

не понял мысли про
Код: plaintext
data_r1 = freq( 1 ) / R1_count
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36612942
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...использование Application.Frequency
    #36612989
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlth
Код: plaintext
data_r1 = freq/ R1_count
Используйте freq(НомерЭлемента).

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

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

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

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

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

Из Справки:

"Количество элементов в возвращаемом массиве на единицу больше числа элементов в массиве массив_интервалов. Дополнительный элемент в возвращаемом массиве содержит количество значений, больших чем максимальное значение в интервалах. Например, при подсчете трех диапазонов значений (интервалов), введенных в три ячейки, убедитесь в том, что функция ЧАСТОТА возвращает значения в четырех ячейках. Дополнительная ячейка возвращает число значений в массив_данных, больших чем значение границы третьего интервала."
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36613195
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...использование Application.Frequency
    #36613223
SirFisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KL (XL),

наверное я не правильно использую данную функцию, т.к. при построении вариационных рядов мне удобней было прописывать ее со ссылкой не на массив, а на единичный интервал, например =частота(A1:A100;B1). Правда при этом она возвращала кумуляту (накопление частот), что решалось простым вычитанием суммы предыдущих частот.
Вероятно, из-за такого использования функции и возникли у меня проблемы с ее реализацией через VBA
...
Рейтинг: 0 / 0
...использование Application.Frequency
    #36613376
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...использование Application.Frequency
    #36613975
Фотография vlth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 36, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / ...использование Application.Frequency
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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