Доступ к переменным sub в VBA - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть следующая подпрограмма

Public Static Sub Varib()

Device_ = Sheet1.DeviceType_.Text
Model_ = Sheet1.Model_.Text
Security_ = Sheet1.SecurityGroup_.Text
Catagory_ = Application.Index(Worksheets("Temp_for_varible_lists").Range("b:b"), Application.Match(x, Worksheets("Temp_for_varible_lists").Range("A:A"), 0))

End Sub

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

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

Теперь я могу сделать все переменные глобальными и получить к ним доступ в этом варианте.Но я надеялся на что-то более похожее на то, что я видел с c # и VB.net

, где вы можете получить значение с помощью

sub.varible name

, например, длякод выше.

Sub Main()

x = Varib.Device_
msgbox(x)

end sub

Есть ли симуляционный способ сделать это в VBA?

Приветствия

Аарон

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

То, что вы просите, не может быть сделано.Решением является , а не , чтобы сделать ваши переменные глобальными (как правило, плохая идея, за некоторыми исключениями, в данном случае это не один из них).

Одна из возможностей - создать пользовательскийвведите:

Type Varib
    Device_ As String
    Model_ As String
    Security_ As String
    Category_ As String
End Type

и подпункт, чтобы заполнить его с вашего листа:

Sub LoadVaribFromSheet(v As Varib)
    With v
        .Device_ = Sheet1.DeviceType_.Text
        .Model_ = Sheet1.Model_.Text
        .Security_ = Sheet1.SecurityGroup_.Text
        .Category_ = _
            Application.Index(Worksheets("Temp_for_varible_lists").Range("b:b"), _
            Application.Match(x, _
            Worksheets("Temp_for_varible_lists").Range("A:A"), 0))
    End With
End Sub

Затем вы можете использовать это следующим образом:

Sub Main()
    Dim myVarib As Varib
    LoadVaribFromSheet myVarib
    ' Now do stuff with myVarib ...
    MsgBox myVarib.Device_
End Sub
0 голосов
/ 25 ноября 2011

вы можете использовать инкапсуляцию для этого

Private value As String
Private value1 As String


Public Function setValue(val As String)
value = val
End Function

Public Function setValue1(val As String)
value1 = val
End Function


Public Function getValue() As String
getValue = value
End Function

Public Function getValue1() As String
getValue1 = value1
End Function

-------------------------------------------------------------------------

Sub test()

MsgBox getValue & vbCrLf & getValue1

setValue "myValue"
setValue1 "myValue1"

MsgBox getValue & vbCrLf & getValue1
End Sub
...