Страницы: 1
RSS
Почему сбрасываются глобальные переменные?
 
Решил уменьшить время на печатания кода
Объявил переменные типа  Worksheet и типа Workbook как переменные модуля, чтобы уменьшить написание текста.
При отладке показывает, что глобальным переменным База,Отчет,w - в процедуре Ини присваиваются соответствующие значения,а потом показывает, что опять переменная Nothing

Код
Dim База As Worksheet
Dim Отчет As Worksheet
Dim w As Workbook

Sub Ини(База, Отчет, Optional Книга)

If IsMissing(Книга) Then
    Set w = ActiveWorkbook
Else
    Set w = Workbooks(Книга)
End If

Set База = w.Worksheets("Смета")
Set Отчет = w.Worksheets("ЕИ")

End Sub

Function Б(Строка, Столбец)
    Б = Царь.База.Cells(Строка, Столбец).Value
End Function

Sub ПроверкаЧисло()
Dim start As Long

start = 3
i = start
Смещение = 1


Царь.Ини "Смета", "ЕИ"

Do

n = Б(i, 1)
If ИзРасц(База, i) Then

Царь.ДО k + Смещение, 1, n
Царь.ДО k + Смещение, 2, Б(i, 4)

    k = k + 1
End If

i = i + 1
Loop Until База.Cells(i, 1).Value = "Конец"


End Sub

Как-нибудь можно объект типа WorkSheet сделать глобальной переменной?
Изменено: vcomp71 - 05.04.2020 09:03:55 (опечатки)
 
ответ- переменные могут быть любых известных и даже неизвестных типов.  Вопрос у Вас в другом и  просто требует изучения
https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/declaring-variables
По вопросам из тем форума, личку не читаю.
 
Цитата
vcomp71 написал:
Dim База As Worksheet
Dim Отчет As Worksheet
Dim w As Workbook

Sub Ини(База, Отчет, Optional Книга)
Проще говоря - нет никакой связи между База в декларации и База в Sub Ини

А вот так может и прокатит
Код
Sub Ини(База, Отчет, Optional Книга) 
If IsMissing(Книга) Then
    Set w = ActiveWorkbook
Else
    Set w = Workbooks(Книга)
End If
 
Set царь.База = w.Worksheets(База)
Set царь.Отчет = w.Worksheets(Отчет)
 
End Sub
Изменено: Апострофф - 05.04.2020 09:35:05
 
Цитата
БМВ написал:
Вопрос у Вас в другом
Привет, Михаил.
Да согласен. Как можно задавать вопрос, не предоставляя информацию о контексте выполнения? vcomp71, проблема файл приложить?
 
Цитата
Андрей VG написал:
Привет, Михаил.Да согласен. Как можно задавать вопрос, не предоставляя информацию о контексте выполнения?  vcomp71 , проблема файл приложить?
Так весь код выложил. Вопрос в одинаковых именах, при определении. Всё уже понял...
Цитата
Апострофф написал:
Проще говоря - нет никакой связи между База в декларации и База в Sub Ини
Да... Неправильное имя задал. Спасибо!  8)  :(
 
Вот как прокатит

Код
Dim База As Worksheet
Dim Отчет As Worksheet
Dim w As Workbook

 
Sub Ини(База_Имя, Отчет_Имя, Optional Книга_Имя)
 
If IsMissing(Книга_Имя) Then
    Set w = ActiveWorkbook
Else
    Set w = Workbooks(Книга_Имя)
End If
 
Set База = w.Worksheets(База_Имя)
Set Отчет = w.Worksheets( Отчет_Имя)
 
End Sub
 
Function Б(Строка, Столбец)
    Б = Царь.База.Cells(Строка, Столбец).Value
End Function
 
Sub ПроверкаЧисло()
Dim start As Long
 
start = 3
i = start
Смещение = 1
 
 
Царь.Ини "Смета", "ЕИ"
 
Do
 
n = Б(i, 1)
If ИзРасц(База, i) Then
 
Царь.ДО k + Смещение, 1, n
Царь.ДО k + Смещение, 2, Б(i, 4)
 
    k = k + 1
End If
 
i = i + 1
Loop Until База.Cells(i, 1).Value = "Конец"
 
 
End Sub


Задал глобальные переменные в качестве аргумента, они передавались и тут же обнулялись.
Ну, бывает!  :D
Изменено: vcomp71 - 05.04.2020 10:47:35
 
А не лень каждый раз при написании кода раскладку клавиатуры перещелкивать? Зачем переменные на кириллице писать?
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
vcomp71 написал:
Так весь код выложил
Серьёзно? А где был объявлен или хотя бы инициализирован
Цитата
vcomp71 написал:
Царь
:qstn:
 
Царь - назваие модуля.

Цитата
Nordheim написал: А не лень каждый раз при написании кода раскладку клавиатуры перещелкивать? Зачем переменные на кириллице писать?
Зато сразу видно, где переменные и функции и они имеют значимое имя. Для всего остального есть Punto
Изменено: vcomp71 - 05.04.2020 12:44:58
 
Уменьшили время на написание кода (намного?), но кажый раз при открытой книге нагружаете оперативку. Глобальные переменные откусывают память и не отдают ее, пока не закроете книгу, даже если макросы не работают.
Наоборот - стараться уходить от глобальных переменных. Без них часто не обойтись, но специально созавать, чтобы в коде не написать пару строк... Такой путь "облегчения" считаю ущербным.

Вы бы лучше уделили время принудительному освобождению памяти от всех объектов:
Код
Set w= Nothing
 
Цитата
vcomp71 написал:
Зато сразу видно, где переменные и функции и они имеют значимое имя
Я считаю плохой практикой написание  кириллицей. А значимое имя можно и латиницей написать.
 
Цитата
Юрий М написал:
А значимое имя можно и латиницей написать.
да, да vikttur,  :D
По вопросам из тем форума, личку не читаю.
 
Опять мохнатый пристает. Чего не так? :)

сегодня вот такое видел
Кто-то в таком, как рыба в воде, а меня в жар кидает. Возможно, из-за этого и не продолжил заниматься на курсах 1C )

Цитата
vcomp71 написал: сразу видно, где переменные и функции и они имеют значимое имя.
Видимо, никогда еще Ваши макросы не попадали на МАС. Кириилица ломается - и все сэкономленное время, нажитое непосильным созданием глобальных переменых, тратится на переписывание кода )
 
Цитата
vikttur написал: Кто-то в таком, как рыба в воде, а меня в жар кидает
так это эти рыбы https://infostart.ru/upload/iblock/458/458e5c1e9a841b20896f9824e7290ca1.png  :D

И не пристает, а подтверждает, что значимое имя латиницей :-)
Изменено: БМВ - 05.04.2020 12:48:59
По вопросам из тем форума, личку не читаю.
 
и отвечая на вопрос:
Цитата
vcomp71 написал:
Почему сбрасываются глобальные переменные?
глобальные переменные обнуляются каждый раз как только вы что-то поправили в коде
исправили код - инициируйте глобальные переменные повторно
не открывайте VBE и глобальная переменная будет жить столько, сколько в Excel живет контейнер, в котором она обьявлена

я однажды заполнял анкету на вакансию программиста, там был вопрос:
не привлекались-ли вы к уголовной ответственности за хранение данных в глобальных переменных?
я там ответил: не привлекался
Изменено: Ігор Гончаренко - 05.04.2020 12:58:28
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
vikttur написал: Такой путь "облегчения" считаю ущербным.
Писать проще! А оперативки - 32 Gb
По-моему  вопросы оптимизации оперативки закончили обсуждать лет шесть назад.. А так, конечно, перевести таблицу в текстовый файл и написать консольную программу под C++ , однозначно. И что в памяти увечится? Процесс excel?  Вы пробовали ради прикола померить объем процесса с Set w= Nothing и без него? Какой будет реальный выигрыш, даже после нескольких запусков?

Цитата
Юрий М написал: Я считаю плохой практикой написание  кириллицей. А значимое имя можно и латиницей написать.
Обоснуйте.
 
Цитата
vcomp71 написал:
По-моему  вопросы оптимизации оперативки закончили обсуждать лет шесть назад
именно по этому теперь программы, которые в прошлом занимали килобайты и не требовали ресурсов - теперь распухли и дайте им памяти, процессор по мощнее….

Естественно все что написано имеет значимость для больших проектов, но как правило начинают с малых, привычка остается, и потом тоже проделывается уже на больших.

Цитата
vcomp71 написал:
Обоснуйте.
Да просто не выполнится код на другом ПК однажды, так как там будет другая настройка ОС.
По вопросам из тем форума, личку не читаю.
 
Цитата
vcomp71 написал:
Обоснуйте
Я не знаю (не на чем проверить), будет ли "работать" на машинах с другой локалью переменная ПоследняяСтрока, но знаю, что LastRow сработает. Да и короче получится )
 
Цитата
vcomp71 написал:
Обоснуйте.
к чему эта категоричность?
никто не должен вам ничего обосновывать. вы пришли за советом, ответом
люди высказывают свое мнение, на основании своего опыта или мировоззрения (если хотите), а вы можете взять его на вооружение, принять к сведению, проигнорировать в полный рост, причем совершенно не обязаны обосновывать почему решили поступить именно так, как решили.
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
vcomp71 написал:  померить объем процесса с Set w= Nothing и без него
Вы посуду моете абы-как, оставляя крошки? Обувь вытираете после улицы?

Во-первых, культура написания кода.  Это как то, что  обновление экрана желательно включать, переменные желательно объявлять все и с указванием типа переменной, код писать так, чтобы понятно другим было.
Во-вторых, неправильно написанный код бывает очень прожорлив. И тут двояко:
- если Вы пишете что-то небольшое - какой смысл в замене 10 нажатий на клавиши одной глобальной переменной?
- если проект большой, то нужно себя приучать к оптимизации, чтобы потом не грызть локти.

А насчет обоснования - Игорь написал. Наше дело подсказать, Ваше - принимать или не принимать к сведению.
 
Цитата
vcomp71 написал: Царь - назваие модуля.
Цитата
Ігор Гончаренко написал: люди высказывают свое мнение,
Мое мнение: назовите модуль "Бред_сивой_кобылы".
 
Цитата
vcomp71 написал:
А оперативки - 32 Gb
В умелых руках...

Код
Ячейки=Cells
Владимир
Страницы: 1
Наверх