Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440

Обработка переменной процедурного уровня другой процедурой

23.06.2011, 16:50. Показов 1587. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые коллеги.

При написании программы возникло сомнение: правильно ли я офоромляю код? Возможно, так работать нельзя и такой код впоследствии будет нечитабельным для других?

Код выглядит приблизительно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub MainSub()
   Dim dArrl() As Double
   Dim dVar1 As Double
   Dim dVar2 As Double
   Dim dVar3 As Double
   Dim sData As String
   'Получаем строку данных
   sData = GetData()
   'Превращаем строку данных в массив данных
   Call MakeArr(dArr1, sData)
   'Выделяем отдельные значения из массива данных
   Call FillVar(dArr1, dVar1, dVar2, dVar3)
End Sub

Т.е. я объявляю переменные процедурного уровня, а затем передаю ссылки на них в другую процедуру, которая производит операции и заполняет переменные значениями.

Это, понятное дело, просто пример. Но суть такова.

Делаю я это за тем, что процедура, названная здесь MainSub имеет большой размер и ее
а) неудобно писать - пока разбираешься с отдельными частями, забываешь про целое, и
б) неудобно потом разбирать - в огромной процедуре через какое-то время перестаешь понимать что происходит.
Поэтому я разбил процедуру на части и решил проблему с переменными так, как показано выше.

Вопросы такие:
1) насколько позволительно с точки зрения программирования менять значения переменных процедурного уровня в других процедурах?
2) Если так делать нельзя, то как быть? Объявлять переменные как Public?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.06.2011, 16:50
Ответы с готовыми решениями:

Присваивание переменной процедурного типа
Есть такой код: type TScanProc = procedure(const bytes: array of Byte); //------------ procedure ScanPort(const bytes: array...

Обработка нескольких событий одной процедурой
Здравствуйте... Не могу понять тему, указанную в заголовке..Сейчас читаю Зиборова.. И там есть такой код: namespace...

Обработка компонентов одной процедурой на разных формах
Доброго времени суток. На форме есть несколько однотипных компонентов TRadioGroup для каждого канала, а каналов всего 8. В случае...

12
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
23.06.2011, 18:41
Gibboustooth,
наоборот, как раз и надо разбивать программу на процедуры: всегда должна быть процедура Main и функционирующие процедуры.
0
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
23.06.2011, 18:49  [ТС]
Цитата Сообщение от Busine2009 Посмотреть сообщение
наоборот, как раз и надо разбивать программу на процедуры: всегда должна быть процедура Main и функционирующие процедуры.
То, что надо разбивать на процедуры я в курсе, но вопрос в том, правильно ли передавать переменные процедурного уровня в другие процедуры и там их менять. Если да - то вопросов нет
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
23.06.2011, 19:15
Цитата Сообщение от Gibboustooth Посмотреть сообщение
правильно ли передавать переменные процедурного уровня в другие процедуры и там их менять
не знаю, ведь придумали передавать - значит используйте пока косяк не найдёте. Когда косяк найдёте, то используйте глобальные переменные.
1
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
23.06.2011, 19:17  [ТС]
Я понял, спасибо.
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
24.06.2011, 15:04
Работать написанное будет вполне корректно. Передавать возвращаемые процедурой значения по ссылкам, по-мне, так это не самый удачный стиль. Мои советы:

1. Там, где нет необходимости передавать переменную по ссылке обратно в вызывающую процедуру - передавайте по значению (флаг ByVal перед именем переменной в декларации вызываемой процедуры). Это позволит в некоторых случаях не допустить ошибки.
2. Процедуры попробуйте заменить на функции, которые будут возвращать значение. Можно предусмотреть и проверку возвращаемого значения на код ошибки, как это сделано в Win API.
3. Если возвращать приходится много данных, то где-то будет уместно передавать структуру, массив или буфер по ссылке.
4. Если модуль кода дальше не планируется расширять (код разбросан по разным модулям), то допустимо использовать переменные с областью выдимости в пределах модуля.
5. Или можете ничего не менять в Вашем коде, просто припишите перед вызовом примечание, что вызываемая функция может изменять свои параметры.
1
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
24.06.2011, 15:22  [ТС]
Цитата Сообщение от mc-black Посмотреть сообщение
3. Если возвращать приходится много данных, то где-то будет уместно передавать структуру, массив или буфер по ссылке.
Действительно, стоило реализовать функцию с возвратом структуры. Буду иметь ввиду в дальнейшем. Спасибо.
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
24.06.2011, 15:42
А еше лучше сделать все классом. Тогда будет меньше писанины. Не нужно будет передавать ничего. Вообще твой вариант не очень привлекательный тем, что у тебя очень много параметров у функций - Это будет создавать путаницу, потому что ты на глаз не сможешь определить что ты передал как объекты, с которыми работаешь, а что реальные параметры функции.

Добавлено через 4 минуты
Так, к слову. У меня есть один проект на VBA, который занимал очень много места - около 6000 строк. Начинал его писать вместе с началом обучения VBA. Потом узнал, что на VBA есть классы =) Переписал все на них и число строк стало 3000 (плюс там я еще всю концепцию конечно переделал =) но ключевым аспектом переделования было введение классов), причем строки довольно легкие, потому что не передаю кучу лишних параметров в процедуру. Все стало очень структурировано и вообще супер, я стал намного быстрее ориентироваться в своем коде.
0
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
24.06.2011, 15:53  [ТС]
К сожалению, не умею работать с классами. Я вообще не программист - просто по работе начал пользоваться VBA, а теперь вообще вся работа с ним связана

Если есть литература по классам (особенно по их практическому использованию) - был бы очень благодарен.
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
24.06.2011, 16:02
Очень полезная лекция, сам ее читал почтю всю когда учил
1
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
24.06.2011, 16:34  [ТС]
Спасибо, ознакомлюсь на выходных.
0
 Аватар для mc-black
2786 / 718 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
24.06.2011, 17:34
Прошу прощения у Gibboustooth, что вмешиваюсь в тему...

Belthazor4,
Так много строк кода. Какого типа классы вы придумали для Excel (по сути и смыслу) и за счет чего код так сократился? Классы по идее должны сокращать место за счет многократного использования их кода в разных местах программы. Есть какие-то базовые вещи, которые каждому приходится писать как изобретать велосипед?

Я просто заметил, что большие куски кода у меня часто повторяются - приходиться по сто раз (уже машинально и на память) снова и снова писать куски кода. Можно что-то путевое придумать?
0
245 / 55 / 6
Регистрация: 05.08.2010
Сообщений: 222
24.06.2011, 18:02
По сути я использую классы в 3 случаях
1) Тупо main класс в котором все связанной с работой всего макроса (Раньше так не делал - было влом переписывать написанное, а вот сейчас проект делаю так ). Суть - просто оболочка всего, для упрощения взаимодействия процедур с друг другом - как раз пример того, с чего началась эта тема
2) класс оболочка определенного процесса - если есть какой-нибудь процесс, состоящий из несколько процедур (к примеру выгрузка листов из excel в PP) Для сокращения кода взаимодействия процедур друг с другом
3) если я действую с множеством однотипных материй, имеющих много разнородных параметров. собственна цель - обобщение этих параметров, удобство инициализации, удобно еще в деструкторе таких классов указывать всякие действия типа освобождения переменных (set .. = nothing) и к примеру включения скринапдейта. Деструктор удобен тем, что его не нужно вызывать, он сам отрабатывается при завершении. Пример использования таких классов - есть динамический лист отчета, на нем есть график, еще лист с данными, там пивот и т.д. Таких листов отчета - много, поэтому целесообразно было завести универсальный класс для них.

Если там интересно че, пиши лучше в аську, здесь не очень ужобно говорить монологами. Диалог это как то лучше все же.
ICQ
231782044
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2011, 18:02
Помогаю со студенческими работами здесь

Автоматические заполнение из другой таблицы процедурой
Суть такова: Есть 2 таблицы: ФИО, страна. В таблице ФИО 2 поля: счётчик(первичны ключ), ФИО. В таблице страна 3 поля:...

Обработка одной процедурой нескольких объектов без указания имени
Доброго времени суток. -на форме есть несколько полей ввода (TextBox), для них сделал процедуру обработки вводимых символов : ...

Как сделать чтобы название переменной, было значение другой переменной?
Я хочу сделать следующее: пример: $test1 = "aver"; $test2 = "12345"; В конечном итоге, я хочу получить такой результат: $aver =...

Как присвоить значение переменной, исходя из значения другой переменной?
Всем привет. Нужна помощь. Есть переменная, например "month" которая может принимать значения от 01 до 12, и переменная...

Как присвоить имя переменной равное аргументу другой переменной?
В общем вопрос такой: Допустим есть переменная string i= "qwer", хочу создать другую переменную имя у которой будет приравниваться...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru