Страницы: 1
RSS
Создание глобальной переменной или константы, в которую будет занесено значение из ячейки
 
Доброго времени суток! Надеюсь на вашу помощь)
История такая - в моем документе куча листов и нудных формул. В самом начале вычисляется кол-во временных интервалов. Надоело в каждой процедуре прописывать это. Их кол-во задается в начале и не меняется. Вот код (я не прогер, так что это говнокод, вероятнее всего):

Цитата

...
    With Worksheets("123")
    God = .Range("God")
    Mes = .Range("Mes")
    Srok = God * 12 + Mes
...
Srok глобально объявлен как целое,

Цитата
Public God, Mes, Srok As Integer
проблем с вызовом в каждой процедуре не было, но в каждую приходится писать эти вот строчки. Хотелось бы в сааааамом начале проекта его вычислить и вставлять по ходу действа, когда нужен.

С другой переменной, тоже задающейся в самом начале, попробовал такую вот штуку:
Цитата
Const StartDate As Date = Worksheets("123").Range("StartDate")

заругалась "constant expression required". Найденные в сети варианты с Set... тоже успехом не увенчались.
прошу вашей помощи, знатоки!

у меня вся эта байда во вкладке "Modules", где у меня описание всех кнопок, функции и тп. Мб куда в другое место надо перенести объявление глобальных переменных/констант?
 
Где у Вас объявлены глобальные переменные? Нужно в области деклараций стандартного модуля. Т.е. ПЕРЕД ними не должно никаких процедур. А значения им присваивайте в процедуре, которая выполняется самой первой.
 
Юрий М, на самом верху, да:

Цитата
Option Explicit
Public StartDate As Date, God, Mes, Srok, i, j, N, LastRow As Integer, Pi As Double, Cell As Variant

перед ними ничего нет. Если в первой процедуре Srok получит значение 100500, то при любых дальнейших вызовов этой переменной, ее значение будет равно 100500?
провел эксперимент и ваши слова подтвердились)спасибо большое!
возник другой вопрос - пользователь открывает документ и выполняет процедуры не с самой первой, а последние 2, к примеру. Но в них этот самый Srok используется. Каким будет его значение? Эксель как бы на заднем фоне втихую выполнит процедуру, в которой Srok считается и возьмет верное значение или подставит 0?)
Изменено: peat - 30.04.2013 19:24:41
 
Если затем это значение (100500) не менялось, то оно так и останется таким. И переменная будет доступна в любом модуле.
Обратите внимание: переменные God, Mes, Srok, i, j, N будут иметь тип Variant.
P.S. Я глобальные всегда пишу каждую в отдельную строку.
 
Вынесите присвоение переменным значений в отдельную процедуру(скажем InitPublic). Затем при открытии книги запускайте эту процедуру:
Код
Private Sub Workbook_Open()
    Call InitPublic
End Sub


Так же на всякий случай в каждой процедуре, в которой переменная может понадобиться, можно делать проверку:
Код
If Mes = 0 Then Call InitPublic


Так же можете почитать про переменные: Что такое переменная и как правильно её объявить?
А то Вы их объявляете неверно(Юрий уже указал Вам на это).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ну и вместо integer пишите Long - оно оправданнее в новых версиях VBA, и кроме того у Вас с integer не будет работать на весь лист (ругнётся на LastRow (As Integer)).
 
Юрий М, The_Prist, Hugo, спасибо Вам всем большое! ценные советы не знающим vba)
 
The_Prist, сделал, как вы описали. Весь код в модулях прекрасно понимает глобальную переменную, но вот код в юзер форме отказывается это делать.
Вставил вот такую штуку
Код
If Srok = Empty Or Srok = 0 Then Call InitPublic

При дебагере эта процедура вызывается, но Srok все равно empty после прохождения.
Изменено: peat - 01.05.2013 01:11:07
 
А что у Вас в процедуре InitPublic? Где она? И может есть смысл показать небольшой файл, где всё это происходит?
 
Юрий М, видимо, она не там... Она в самом верху модуля, в котором бОльшая часть кода.
Содержит в себе вот что:
Код
Sub InitPublic()
     With Worksheets("123")
     God = .Range("God")
     Mes = .Range("Mes")
     Srok = God * 12 + Mes
     End With
End Sub

Вероятно, она не там висит. Если не в этом дело, накрамсаю файл для примера.
 
И процедура InitPublic в модуле книги на событие открытия? Давайте лучше небольшой пример...
 
InitPublic должна быть расположена в стандартном модуле. Так же как и объявление Public переменных.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
нашел проблему - у меня не один стандартный модуль. При удалении других модулей глобальная переменная Srok спокойно работает в юзерформе. Надо создать какой-то другой модуль? читал по вашей ссылке про модуи классов - мне туда?
Изменено: peat - 01.05.2013 11:48:49
 
peat, Вы считаете необходимым пустое сообщение писать?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, нет, просто надо было его удалить - не нашел кнопки)

попробовал создать модуль класса, запихнул туда

Код
Public God As Long
Public Mes As Long
Public Srok As Long

Sub InitPublic()
     With Worksheets("Исходные Данные")
     God = .Range("God")
     Mes = .Range("Mes")
     Srok = God * 12 + Mes
     End With
End Sub


не помогло - в юзер форме Srok = empty, если call InitPublic - то не находит ее..
 
Необходимо поместить в один стандартный модуль - ЛЮБОЙ.  СТАНДАРТНЫЙ.
Не проще было уже выложить свой файл? 100% Вы сами себе проблему создали и саами не понимаете что и куда Вы пишите, что и приводит к некорректной работе.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
конечно, сам создал) но с вашей помощь сам и решил - в другом модуле эта же переменная тоже объявлялась, как паблик, в этом проблема и была)еще раз спасибо
 
Не понимаю - почему люди так упорно не желают показывать файлы-примеры?.. Давно бы получили правильный ответ.
 
у меня достаточно большой файл, в нем много кода. он не сложный, никуда не претендует, но его много) надо бОльшую часть удалить, чтобы не мешала поиску проблему - лениво немного) и выкладывать как-то стремновато - диплом все ж таки) хотя пока подготавливал файл к выкладыванию, нашел ошибку)
 
Цитата
peat пишет:
лениво немного
Вам лениво готовить небольшой файл, а нам не лениво искать Вашу ошибку по описанию? С таким подходом помогающих у Вас поубавится...
 
На мой взгляд это как раз тот случай, когда размер не имеет значения  :D

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

Цитата
Юрий М пишет:
Вам лениво готовить небольшой файл, а нам не лениво искать Вашу ошибку по описанию?

мне казалось, скачивать файл еще муторней) В итоге, Вы и помогли по описанию
 
У меня работает так:
Код
Public nastroyki As String
Public osnovnie_d As String
Public id_upd_v_buh As String
Public obmen_d As String

Public Sub Globalnie_peremennie()
nastroyki = "Настройки"
osnovnie_d = "Основные данные"
id_upd_v_buh = "3-три"
obmen_d = "4-четыре"
End Sub

Sub tttttt()
Globalnie_peremennie
MsgBox nastroyki & ", " & osnovnie_d & ", " & id_upd_v_buh & ", " & obmen_d
End Sub
Изменено: sm_ph - 26.06.2019 13:51:44
Страницы: 1
Наверх