2012-05-15 7 views
1

Я никогда не использовал глобальные переменные в VBA, но я понимаю, что глобальные переменные создаются вне функций/sub declarations?Доступ к глобальным переменным в VBA (Excel)

У меня есть глобальная (общедоступная) переменная, объявленная в верхней части модуля, которая затем получает значение 0 подпрограммой внутри того же модуля.

Option Explicit 
Public NumNodes As Integer 

Sub Inst_Glob_Vars() 
NumNodes = 0 
End Sub 

Эта подпрограмма вызывается при открытии книги (суб вызывается в объекте «ThisWorkbook»), который также будет инстанцирует глобальную переменную и установить значение 0.

Option Explicit 

Private Sub Workbook_Open() 
Call Inst_Glob_Vars 
End Sub 

У меня есть кнопка на листе excel, которая при щелчке увеличит эту глобальную переменную. Определение этой кнопки находится в объекте Sheet1.

Private Sub CommandButton2_Click() 
'NumNodes = NumNodes + 1 
Debug.Print "NumNodes = " & NumNodes 'Debug 
End Sub 

Нужно ли объявлять глобальные/общедоступные переменные в каждом модуле/объекте, используемом переменной? Каждый раз, когда я нажимаю кнопку, переменная не увеличивается, но при отладке дает значение Null/Blank. Я точно не утверждаю свою глобальную переменную правильно, но не уверен, где я делаю ошибки.

Обновление: здесь обновлена ​​кнопка командной кнопки. Если я прокомментирую второй подзаголовок (Node_Button_Duplication), все работает нормально. Скорее всего, это может быть, что к югу, которая вызывает проблемы ...

Private Sub CommandButton2_Click() 
Call Channel_Selection_Duplication 
Call Node_Button_Duplication 
NumNodes = NumNodes + 1 
Debug.Print "NumNodes = " & NumNodes 'Debug 
End Sub 

Оба Channel_Selection_Duplication и Node_Button_Duplication оба определены в одном отдельном модуле:

Option Explicit 

Public Sub Channel_Selection_Duplication() 
' 
' Description: Macro which duplicates the 'Channel Usage Selection' columns at a specific cell reference 

    Range("Q8:S8").Select 
    With Selection 
     .HorizontalAlignment = xlCenter 
     .VerticalAlignment = xlBottom 
     .WrapText = False 
     .Orientation = 0 
     .AddIndent = False 
     .IndentLevel = 0 
     .ShrinkToFit = False 
     .ReadingOrder = xlContext 
     .MergeCells = False 
    End With 
    Selection.Merge 
    Range("Q8:S8").Select 
    ActiveCell.FormulaR1C1 = "Channel Usage Selection" 
    Range("Q8:S52").Select 
    Range("Q52").Activate 
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone 
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone 
    With Selection.Borders(xlEdgeLeft) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    With Selection.Borders(xlEdgeTop) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    With Selection.Borders(xlEdgeBottom) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    With Selection.Borders(xlEdgeRight) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    With Selection.Borders(xlInsideVertical) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    With Selection.Borders(xlInsideHorizontal) 
     .LineStyle = xlContinuous 
     .Weight = xlThin 
     .ColorIndex = xlAutomatic 
    End With 
    Range("Q8:S8").Select 
    Selection.Interior.ColorIndex = 36 

'NumNodes = NumNodes + 1 
'Debug.Print NumNodes 
End Sub 

Public Sub Node_Button_Duplication() 

    ActiveSheet.Shapes("CommandButton1").Select 
    Selection.Copy 
    Range("Q5").Select 
    ActiveSheet.Paste 
    Selection.ShapeRange.IncrementTop -14.25 
End Sub 
+0

Вы должны объявить его один раз. Вы можете сделать это в любом модуле :) Пожалуйста, покажите нам код. Также покажите нам, как вы увеличиваете переменную? –

ответ

3

Paste это в модуле

Option Explicit 

Public myVar As Long 

Вставить это в командную кнопку события щелчка в листе1

Option Explicit 

Private Sub CommandButton1_Click() 
    myVar = myVar + 1 
    MsgBox myVar 
End Sub 

Теперь попробуйте.

Также вам не нужно устанавливать значение 0 в Workbook_Open событие :) Оно принимает значение 0 по умолчанию при открытии книги.

Followup

У меня есть ощущение копирование и вставка элемента управления в таблице каким-то образом сбрасывает переменную. Я сейчас пытаюсь найти решение ... - user1373525 6 мин. Назад

Да :) Добавление кнопки перекомпилирует код VBA и, следовательно, глобальные переменные получают сброс. Используйте Temp Sheet для хранения переменных. Вы можете также использовать реестр для хранения этой информации :) - Сиддхарт Разгром только сейчас

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

Private Sub CommandButton2_Click() 
    NumNodes = NumNodes + 1 
    MsgBox NumNodes, vbInformation, "1" 

    Node_Button_Duplication 

    NumNodes = NumNodes + 1 
    MsgBox NumNodes, vbInformation, "2" 

    Node_Button_Duplication 

    NumNodes = NumNodes + 1 
    MsgBox NumNodes, vbInformation, "3" 
End Sub 

В таком случае он всегда будет увеличивать значение. Однако в следующий раз, когда вы нажмете на кнопку, вы заметите, что переменная была сброшена.

+0

С некоторыми дополнениями, я теперь могу увеличить значение один раз (одним нажатием кнопки). Когда я снова нажимаю кнопку, значение, похоже, продолжает восстанавливаться. Кажется, может быть, я повторяю значение несколько раз для каждого нажатия кнопки? – Ehudz

+0

Могу ли я увидеть вашу книгу для более быстрого разрешения? Если да, то, пожалуйста, загрузите его на www.wikisend.com и поделитесь ссылкой здесь :) –

+0

Хорошо, когда я уменьшаю проблему и имею только счетчик приращений в кнопке click sub, все работает. Интересно то, что когда у меня есть другие функции, вызываемые в кнопке click sub, приращение не работает. – Ehudz

Смежные вопросы