Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
29 / 28 / 7
Регистрация: 18.08.2013
Сообщений: 708
Excel

Не понимаю, как передать в процедуру аргумент типа Range

11.11.2022, 06:08. Показов 1947. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброе утро!
Учусь VBA и попал в тупик. Есть книга Excel, в ней колонка чисел, а также два модуля:

модуль 1
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Option Explicit
 
Sub Version3()
 
Worksheets("1").Activate
 
Dim res As Range
Set res = Selection
Dim i As Range
 
For Each i In res.Columns
    Promah (i.Cells)
Next
 
End Sub
И модуль два:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Option Explicit
 
Function Grubs(n As Integer, q As Integer) As Double
 
If q <= 5 Then
    Grubs = Sheets("Критерий Граббса").Cells(n, 2).Value
Else
    Grubs = Sheets("Критерий Граббса").Cells(n, 3).Value
End If
 
End Function
 
Function CountNotBlank(target As Range) As Integer
Dim c As Integer
c = 0
For Each i In target.Cells
    If Not IsEmpty(i) Then
        c = c + 1
    End If
Next
CountNotBlank = c
End Function
 
Sub Promah(results As Range)
 
Dim n As Integer, q As Integer
Dim sred As Double, SKO As Double, SKO_sr As Double, G1 As Double, G2 As Double, Gt As Double, max As Double, min As Double
Dim Promah As Boolean
 
q = 4
 
Do
    n = CountNotBlank(results.Cells)
    Promah = False
    sred = WorksheetFunction.Average(results.Cells)
    SKO = WorksheetFunction.StDev_P(results.Cells)
    SKO_sr = SKO / Sqr(n)
    min = WorksheetFunction.min(results.Cells)
    max = WorksheetFunction.max(results.Cells)
    G1 = Abs(max - sred) / SKO
    G2 = Abs(sred - min) / SKO
    
    Gt = Grubs(n, q)
    
    If G1 > Gt Then
        For Each res In results.Cells
            If (res = max) Then
                res.ClearContents
                Promah = True
            End If
        Next
    End If
    
    If G2 > Gt Then
        For Each res In results.Cells
            If (res = min) Then
                res.ClearContents
                Promah = True
            End If
        Next
    End If
Loop While Promah = True
 
End Sub
Если вкратце, то я пытаюсь обработать результаты измерений по ГОСТ 8.736, но это не очень важно.
Проблема в том, что при вызове процедуры Promah(i.Cells) у меня появляется ошибка 424 Object Required. И все, я не понимаю, ведь i - это объект, в цикле я перебираю объекты, чего ему надо?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2022, 06:08
Ответы с готовыми решениями:

Как передать в функцию переменную-структуру через аргумент типа object?
Функция, о которой идёт речь- встроенный обработчик событий и грош цен этому обработчику, если никаких данных кроме собственно объекта в...

Как передать в процедуру Oracle параметр типа table%rowtype из ADO.NET?
Привет, что-то затруднился. Возможен ли вызов оракловой процедуры через ADP.NET у которой входой параметр имеет тип коллекции...

Передать в поток процедуру типа void с входным параметров
Доброго времени суток. Я наверное просто дико туплю, но давайте сначала. Мне нужно чтобы Моя процедура, которая кладет весь проект из-за...

8
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
11.11.2022, 06:56
George_Smith, первое, что бросилось в глаза это совпадение имён переменных с функциями. А вместо max поставить Maxi (Mini) сложно? Да уж многим писали, что вместо макросов надо присылать файл с макросами.
0
 Аватар для Angry Old Man
3004 / 744 / 313
Регистрация: 26.03.2022
Сообщений: 1,390
Записей в блоге: 1
11.11.2022, 07:16
Цитата Сообщение от George_Smith Посмотреть сообщение
И модуль два:
- это посторонний шум. Либо вазывайте процедуру колом, либо скобки не рисуйте, либо обращайтесь с ней как с функцией.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Sub Version3()
    Dim i As Range, res As Boolean
 
    Worksheets("1").Activate
    For Each i In Selection.Columns
        Call PromahSub(i.Cells)
        PromahSub i.Cells
        res = PromahFun(i.Cells)
    Next
End Sub
 
Sub PromahSub(R As Range)
    MsgBox R.Address
End Sub
 
Function PromahFun(R As Range) As Boolean
    PromahFun = False
    MsgBox "Функция  " + R.Address
End Function
1
29 / 28 / 7
Регистрация: 18.08.2013
Сообщений: 708
11.11.2022, 17:45  [ТС]
Цитата Сообщение от Burk Посмотреть сообщение
первое, что бросилось в глаза это совпадение имён переменных с функциями. А вместо max поставить Maxi (Mini) сложно?
Ошибку номер 1 понял, спасибо.
Цитата Сообщение от Burk Посмотреть сообщение
Да уж многим писали, что вместо макросов надо присылать файл с макросами.
Честно говоря тупанул, полностью согласен.
Цитата Сообщение от Angry Old Man Посмотреть сообщение
- это посторонний шум.
Не совсем понял, если честно. Я не спец, но хочу реализовать модульность. Т.е. одна процедура на промахи, вторая - проверка "на нормальность" и т.д.
Цитата Сообщение от Angry Old Man Посмотреть сообщение
Либо вазывайте процедуру колом, либо скобки не рисуйте, либо обращайтесь с ней как с функцией.
Спасибо. Я уже понял, что в VBA все хитро

Разрешите подытожить: т.к. я привык указывать аргументы в скобках, лучше всегда использовать Call, правильно?
Если просто вызываем процедуру, то скобки не нужны?

Да, и еще небольшой вопросик - получается, в VBA функция всегда выполняется до конца, не зависимо от того, куда ставить VBA'шный аналог "Return"?
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,586
Записей в блоге: 1
11.11.2022, 18:13
George_Smith,
Возможны такие варианты
Visual Basic
1
2
3
4
5
6
7
Call Процедура(a, b)
Call Функция(a, b)
Процедура a, b
Функция a, b
c = Функция(a, b)
c = Функция()  'без аргументов
set с = функция 'без аргументов, ф-ция возвращает объект
2
398 / 255 / 98
Регистрация: 04.11.2022
Сообщений: 378
11.11.2022, 22:21
Цитата Сообщение от George_Smith Посмотреть сообщение
получается, в VBA функция всегда выполняется до конца, не зависимо от того, куда ставить VBA'шный аналог "Return"?
Нет, можно использовать
Visual Basic
1
Exit Function
Интересно, что если Вы поменяете в заголовке процедуры Sub на Function (или наоборот), редактор соответственно исправит операторы End Sub, Exit Sub на End Function, Exit Function.
1
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
12.11.2022, 07:27
George_Smith, а вот интересно, у меня 7 офис и там нет WorksheetFunction.StDev_P, а есть WorksheetFunction.StDevP, может версии разные?
1
932 / 365 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
14.11.2022, 09:40
Цитата Сообщение от George_Smith Посмотреть сообщение
как передать в процедуру аргумент
есть всего 2 способа: либо этот аргумент должен быть в числе аргументов процедуры (Angry Old Man показал), либо должна быть переменная, видимая обоим "участникам" (уровень модуля или проекта): на 1ом этапе публичной переменной присваивается нужное значение, запускается процедура, при необходимости, процедура перезаписывает глобальную/публичную переменную.
Если есть выбор, то всегда используйте вариант 1.
1
29 / 28 / 7
Регистрация: 18.08.2013
Сообщений: 708
14.11.2022, 19:09  [ТС]
Цитата Сообщение от Burk Посмотреть сообщение
George_Smith, а вот интересно, у меня 7 офис и там нет WorksheetFunction.StDev_P, а есть WorksheetFunction.StDevP, может версии разные?
У меня Excel 2016. Если не ошибаюсь, часть статистических функций было заменено по сравнению с Excel 2007.

Добавлено через 1 минуту
Цитата Сообщение от Jack Famous Посмотреть сообщение
есть всего 2 способа: либо этот аргумент должен быть в числе аргументов процедуры (Angry Old Man показал), либо должна быть переменная, видимая обоим "участникам" (уровень модуля или проекта): на 1ом этапе публичной переменной присваивается нужное значение, запускается процедура, при необходимости, процедура перезаписывает глобальную/публичную переменную.
Если есть выбор, то всегда используйте вариант 1.
Ага, спасибо.
Я уже понял, что сам накидал кучу и поэтому бедный VBA запутался
Ничего, потихоньку освоим.
Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2022, 19:09
Помогаю со студенческими работами здесь

Как в процедуру 1 передать адрес процедуры 2 через параметр чтобы процедура 1 выполнила процедуру 2
Зачем мне это нужно? Затем что написан вложеный цикл от 0 до N в нём цикл от 0 до M, в программе цикл используется десяток раз только с...

как передать аргумент?
Уважаемые форумчане. Программа находит в столбце А:А несколько последовательно идущих одинаковых записей код и в столбце С:С,...

Как передать аргумент
Подскажите пожалуйста, как в Report() передать третий аргумент? По мимо уже существующих (int hwnd, int lParam) которые передает...

Как передать в событие аргумент?
Привет всем! форма Panel, на которую кликнули, должна менять цвет. в текущей ситуации меняется цвет только одной панели(). Как быть,...

Как передать аргумент функции?
CustomGLWidget::CustomGLWidget(QWidget *parent):QGLWidget(parent) { //Initialize variable members m_image =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru