Глобальные переменные

Программирование на Visual Basic for Applications
Катя
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 20.04.2006 (Чт) 13:04

Глобальные переменные

Сообщение Катя » 12.05.2006 (Пт) 10:45

Написала макрос, выдал ошибку, что procedure too long, решила разделить на процедурки, где объявить переменные, так чтобы они были глобальными и как сделать, чтобы в название процедуры не передавать параметры?

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 12.05.2006 (Пт) 10:49

Перед процедурами, вне Sub.
Быть... или не быть. Вот. В чём вопрос?

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Re: Глобальные переменные

Сообщение Nicky » 12.05.2006 (Пт) 11:10

Катя писал(а):... и как сделать, чтобы в название процедуры не передавать параметры?

Обычно спрашивают, как передавать :)
Sub myProc()

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.05.2006 (Пт) 13:59

а что это вообще такое: Передавать в НАЗВАНИЕ процедуры параметры?
Весь мир матрица, а мы в нем потоки байтов!

Катя
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 20.04.2006 (Чт) 13:04

Сообщение Катя » 12.05.2006 (Пт) 15:50

а как сделать чтобы процедура1 инициализировала набор переменных, при этом процедура2 вызывает процедуру1(как это сделать?) и инициализированный набор переменных далее используется в процедуре 2?

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 12.05.2006 (Пт) 16:02

Катя писал(а):а как сделать чтобы процедура1 инициализировала набор переменных, при этом процедура2 вызывает процедуру1(как это сделать?) и инициализированный набор переменных далее используется в процедуре 2?

Код: Выделить всё
Dim a as Long, b as Long

Sub Proc1()
  a = 1
  b = 2
End Sub

Sub Proc2()
  Proc1
  MsgBox a + b
End Sub

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 12.05.2006 (Пт) 16:30

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

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 12.05.2006 (Пт) 16:32

Ну хотя бы так:
Код: Выделить всё
Sub1 ()
Dim var1 as integer, var2 as string, var3 as long
var1=1
var2="Stroka"
var3=400000
...
call Sub2(var1, var3, var2)
...
end sub

Sub2(v1 as integer, v2 as long, v3 as string)
Dim a as single
a = v1+v2 + asc(v3)
end sub

Катя
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 20.04.2006 (Чт) 13:04

Сообщение Катя » 26.05.2006 (Пт) 18:56

Помогите, пожалуйста!!!

У меня объявляются глобальные (для модуля) переменные, включая массивы,
дальше идут 2 процедуры без списка агрументов. Процедуры со всеми аргументами работают нормально, кроме моих 3хмерных массивово, про них пишут, что subscript out of range. Как мне сделать, что бы массивы обрабатывались корректно. Приведу часть кода, чтобы было понятней.


Код: Выделить всё

Dim vnpp(1 To 8, 1 To 44, 1 To 5) As Double
Dim osk(1 To 8, 1 To 44, 1 To 5) As Double
Dim i As Integer
Dim j As Integer
Dim k As Integer

Private Sub CommandButton1_Click()
    schet
    vivod
End Sub

Private Sub schet()
With Application.Workbooks.Item("О11.xls")
    Worksheets("Общая таблица").Activate
    Cells(1, 1).Activate
    Set r1 = Range(ActiveCell.Address)
    r1.Select
   
    For i = 1 To 8
        For j = 1 To 44
            For k = 1 To 5
                vnpp(i, j, k) = 0
                osk(i, j, k) = 0
            Next k
        Next j
    Next i

...
End with
End sub

Private Sub vivod()
  With Application.Workbooks.Item("О11.xls")
Worksheets(list).Activate
Cells(8, 6).Activate
Set r1 = Range(ActiveCell.Address)
r1.Select
g = 1
  ActiveCell.Value = osk(g, kdv, 4) + osk(g + 1, kdv, 4)
  ActiveCell.Offset(0, 1).Activate

  ActiveCell.Value = vnpp(g, kdv, 5) + vnpp(g + 1, kdv, 5)
....
end with
end sub



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

Заранее спасибо за помощь

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.05.2006 (Сб) 9:30

Катя писал(а):
Код: Выделить всё
g = 1
  ActiveCell.Value = osk(g, kdv, 4) + osk(g + 1, kdv, 4)
  ActiveCell.Offset(0, 1).Activate

  ActiveCell.Value = vnpp(g, kdv, 5) + vnpp(g + 1, kdv, 5)
....
end with
end sub




Единственным местом в котором может всплыть эта ошибка судя по приведенному коду, это строчки с использованием переменной kdv, какие она может принимать значения?
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 61

    TopList