Решил уменьшить время на печатания кода Объявил переменные типа 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 написал: 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
Андрей VG написал: Привет, Михаил.Да согласен. Как можно задавать вопрос, не предоставляя информацию о контексте выполнения? vcomp71 , проблема файл приложить?
Так весь код выложил. Вопрос в одинаковых именах, при определении. Всё уже понял...
Цитата
Апострофф написал: Проще говоря - нет никакой связи между База в декларации и База в Sub Ини
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
Задал глобальные переменные в качестве аргумента, они передавались и тут же обнулялись. Ну, бывает!
Уменьшили время на написание кода (намного?), но кажый раз при открытой книге нагружаете оперативку. Глобальные переменные откусывают память и не отдают ее, пока не закроете книгу, даже если макросы не работают. Наоборот - стараться уходить от глобальных переменных. Без них часто не обойтись, но специально созавать, чтобы в коде не написать пару строк... Такой путь "облегчения" считаю ущербным.
Вы бы лучше уделили время принудительному освобождению памяти от всех объектов:
Dim Страница As Worksheet
Dim РусскиеБуквы As Range
Dim ЛатинскиеБуквы As Range
Dim ИндексБуквы As Range
Set Страница = ActiveWorkbook.Worksheets(2)
Set РусскиеБуквы = Страница.Range("B4:AQ4")
Set ЛатинскиеБуквы = Страница.Range("B3:AQ3")
For Индекс = 1 To Len(Значение)
Символ = UCase(Mid(Значение, Индекс, 1))
ИндексСимвола = 0
If Символ >= "0" And Символ <= "9" Then
ИндексСимвола = Val(Символ)
ElseIf (Символ >= "A" And Символ <= "Z") Or (Символ >= "А" And Символ <= "Я") Then
If Символ >= "A" And Символ <= "Z" Then
ОбластьПоиска = ЛатинскиеБуквы
Кто-то в таком, как рыба в воде, а меня в жар кидает. Возможно, из-за этого и не продолжил заниматься на курсах 1C )
Цитата
vcomp71 написал: сразу видно, где переменные и функции и они имеют значимое имя.
Видимо, никогда еще Ваши макросы не попадали на МАС. Кириилица ломается - и все сэкономленное время, нажитое непосильным созданием глобальных переменых, тратится на переписывание кода )
vcomp71 написал: Почему сбрасываются глобальные переменные?
глобальные переменные обнуляются каждый раз как только вы что-то поправили в коде исправили код - инициируйте глобальные переменные повторно не открывайте VBE и глобальная переменная будет жить столько, сколько в Excel живет контейнер, в котором она обьявлена
я однажды заполнял анкету на вакансию программиста, там был вопрос: не привлекались-ли вы к уголовной ответственности за хранение данных в глобальных переменных? я там ответил: не привлекался
vikttur написал: Такой путь "облегчения" считаю ущербным.
Писать проще! А оперативки - 32 Gb По-моему вопросы оптимизации оперативки закончили обсуждать лет шесть назад.. А так, конечно, перевести таблицу в текстовый файл и написать консольную программу под C++ , однозначно. И что в памяти увечится? Процесс excel? Вы пробовали ради прикола померить объем процесса с Set w= Nothing и без него? Какой будет реальный выигрыш, даже после нескольких запусков?
Цитата
Юрий М написал: Я считаю плохой практикой написание кириллицей. А значимое имя можно и латиницей написать.
vcomp71 написал: По-моему вопросы оптимизации оперативки закончили обсуждать лет шесть назад
именно по этому теперь программы, которые в прошлом занимали килобайты и не требовали ресурсов - теперь распухли и дайте им памяти, процессор по мощнее….
Естественно все что написано имеет значимость для больших проектов, но как правило начинают с малых, привычка остается, и потом тоже проделывается уже на больших.
Я не знаю (не на чем проверить), будет ли "работать" на машинах с другой локалью переменная ПоследняяСтрока, но знаю, что LastRow сработает. Да и короче получится )
к чему эта категоричность? никто не должен вам ничего обосновывать. вы пришли за советом, ответом люди высказывают свое мнение, на основании своего опыта или мировоззрения (если хотите), а вы можете взять его на вооружение, принять к сведению, проигнорировать в полный рост, причем совершенно не обязаны обосновывать почему решили поступить именно так, как решили. удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
vcomp71 написал: померить объем процесса с Set w= Nothing и без него
Вы посуду моете абы-как, оставляя крошки? Обувь вытираете после улицы?
Во-первых, культура написания кода. Это как то, что обновление экрана желательно включать, переменные желательно объявлять все и с указванием типа переменной, код писать так, чтобы понятно другим было. Во-вторых, неправильно написанный код бывает очень прожорлив. И тут двояко: - если Вы пишете что-то небольшое - какой смысл в замене 10 нажатий на клавиши одной глобальной переменной? - если проект большой, то нужно себя приучать к оптимизации, чтобы потом не грызть локти.
А насчет обоснования - Игорь написал. Наше дело подсказать, Ваше - принимать или не принимать к сведению.