it-swarm.com.de

Wie deklariere ich eine globale Variable in VBA?

Ich habe folgenden Code geschrieben:

Function find_results_idle()

    Public iRaw As Integer
    Public iColumn As Integer
    iRaw = 1
    iColumn = 1

Und ich bekomme die Fehlermeldung:

"ungültiges Attribut in Unter oder Funktion"

Wissen Sie, was ich falsch gemacht habe?

Ich habe versucht, Global anstelle von Public zu verwenden, bekam aber das gleiche Problem.

Ich habe versucht, die Funktion selbst als 'public' zu deklarieren, aber das hat auch nichts gebracht.

Was muss ich tun, um die globale Variable zu erstellen?

113
Nimrod

Sie müssen die Variablen außerhalb der Funktion deklarieren:

Public iRaw As Integer
Public iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
159
SLaks

Dies ist eine Frage zu scope .

Wenn die Variablen nur für die gesamte Lebensdauer der Funktion erhalten sollen, verwenden Sie Dim (kurz für Dimension) in der Funktion oder im Sub, um die Variablen zu deklarieren:

Function AddSomeNumbers() As Integer
    Dim intA As Integer
    Dim intB As Integer
    intA = 2
    intB = 3
    AddSomeNumbers = intA + intB
End Function
'intA and intB are no longer available since the function ended

Eine global -Variable (wie von SLaks angegeben) wird außerhalb der Funktion mit dem Schlüsselwort Public deklariert. Diese Variable ist während der Laufzeit Ihrer laufenden Anwendung verfügbar. Im Fall von Excel bedeutet dies, dass die Variablen verfügbar sind, solange die jeweilige Excel-Arbeitsmappe geöffnet ist.

Public intA As Integer
Private intB As Integer

Function AddSomeNumbers() As Integer
    intA = 2
    intB = 3
    AddSomeNumbers = intA + intB
End Function
'intA and intB are still both available.  However, because intA is public,  '
'it can also be referenced from code in other modules. Because intB is private,'
'it will be hidden from other modules.

Sie können auch Variablen haben, auf die nur innerhalb eines bestimmten Moduls (oder einer bestimmten Klasse) zugegriffen werden kann, indem Sie sie mit dem Schlüsselwort Private deklarieren.

Wenn Sie eine große Anwendung erstellen und globale Variablen verwenden möchten, würde ich empfehlen, ein separates Modul nur für Ihre globalen Variablen zu erstellen. Dies sollte Ihnen helfen, sie an einem Ort zu verfolgen.

107
Ben McCormack

Um globale Variablen zu verwenden, fügen Sie ein neues Modul aus der VBA-Projektbenutzeroberfläche ein und deklarieren Sie Variablen mit Global.

Global iRaw As Integer
Global iColumn As Integer
32
YOU

Die Frage bezieht sich wirklich auf den Spielraum, wie der andere Mann es formuliert hat.

Kurz gesagt, betrachten Sie dieses "Modul":

Public Var1 As variant     'Var1 can be used in all
                           'modules, class modules and userforms of 
                           'thisworkbook and will preserve any values
                           'assigned to it until either the workbook
                           'is closed or the project is reset.

Dim Var2 As Variant        'Var2 and Var3 can be used anywhere on the
Private Var3 As Variant    ''current module and will preserve any values
                           ''they're assigned until either the workbook
                           ''is closed or the project is reset.

Sub MySub()                'Var4 can only be used within the procedure MySub
    Dim Var4 as Variant    ''and will only store values until the procedure 
End Sub                    ''ends.

Sub MyOtherSub()           'You can even declare another Var4 within a
    Dim Var4 as Variant    ''different procedure without generating an
End Sub                    ''error (only possible confusion). 

Sie können diese MSDN-Referenz für weitere Informationen zur Variablendeklaration und diese andere Stack Overflow-Frage lesen, um mehr darüber zu erfahren, wie Variablen außerhalb des Gültigkeitsbereichs liegen.

Zwei andere schnelle Dinge:

  1. Wenn Sie Variablen auf Arbeitsmappenebene verwenden, ist Ihr Code nicht verwirrend. Bevorzugen Sie Functions (mit geeigneten Datentypen) oder übergeben Sie Argumente ByRef.
  2. Wenn Sie möchten, dass eine Variable ihren Wert zwischen Aufrufen beibehält, können Sie die Anweisung Static verwenden.
14
FCastro

Wenn sich diese Funktion in einem Modul/einer Klasse befindet, können Sie sie einfach außerhalb der Funktion schreiben, sodass Global Scope vorhanden ist. Globaler Bereich bedeutet, dass auf die Variable mit einer anderen Funktion im selben Modul/in derselben Klasse zugegriffen werden kann (wenn Sie dim als Deklarationsanweisung verwenden, verwenden Sie public, wenn Sie möchten, dass auf alle Variablen in allen Modulen zugegriffen werden kann)

Dim iRaw As Integer
Dim iColumn As Integer

Function find_results_idle()
    iRaw = 1
    iColumn = 1
End Function

Function this_can_access_global()
    iRaw = 2
    iColumn = 2
End Function
13
Zai

Erstellen Sie in der Allgemeinen Erklärung eine öffentliche Ganzzahl.

Dann können Sie in Ihrer Funktion den Wert jedes Mal erhöhen. Siehe Beispiel (Funktion zum Speichern von Anhängen einer E-Mail als CSV).

Public Numerator As Integer

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim FileName As String

saveFolder = "c:\temp\"

     For Each objAtt In itm.Attachments
            FileName = objAtt.DisplayName & "_" & Numerator & "_" & Format(Now, "yyyy-mm-dd H-mm-ss") & ".CSV"
                      objAtt.SaveAsFile saveFolder & "\" & FileName
                      Numerator = Numerator + 1

          Set objAtt = Nothing
     Next
End Sub
1
Dan Bidner

Eine gute Möglichkeit, öffentliche/globale Variablen zu erstellen, besteht darin, das Formular wie ein Klassenobjekt zu behandeln, Eigenschaften zu deklarieren und mit Public Property Get [variable] auf die Eigenschaft/Methode zuzugreifen. Möglicherweise müssen Sie auch eine Referenz auf das instanziierte Formularmodul verweisen oder übergeben. Sie erhalten Fehler, wenn Sie Methoden für geschlossene Formulare/Berichte aufrufen.
Beispiel: Übergeben Sie Me.Form.Module.Parent in sub/function nicht in form. 

Option Compare Database 
Option Explicit
''***********************************''
' Name: Date: Created Date Author: Name 
' Current Version: 1.0
' Called by: 
''***********************************''
' Notes: Explain Who what when why... 
' This code Example requires properties to be filled in 
''***********************************''
' Global Variables
Public GlobalData As Variant
''***********************************''
' Private Variables
Private ObjectReference As Object
Private ExampleVariable As Variant
Private ExampleData As Variant
''***********************************''
' Public properties
Public Property Get ObjectVariable() As Object
   Set ObjectVariable = ObjectReference
End Property 
Public Property Get Variable1() As Variant 
  'Recommend using variants to avoid data errors
  Variable1 = ExampleVariable
End property
''***********************************''
' Public Functions that return values
Public Function DataReturn (Input As Variant) As Variant
   DataReturn = ExampleData + Input
End Function 
''***********************************''
' Public Sub Routines
Public Sub GlobalMethod() 
   'call local Functions/Subs outside of form
   Me.Form.Refresh
End Sub
''***********************************''
' Private Functions/Subs used not visible outside 
''***********************************''
End Code

In dem anderen Modul können Sie also auf Folgendes zugreifen: 

Public Sub Method1(objForm as Object)
   'read/write data value
   objForm.GlobalData
   'Get object reference (need to add Public Property Set to change reference object)
   objForm.ObjectVariable
   'read only (needs Public property Let to change value)
   objForm.Variable1
   'Gets result of function with input
   objForm.DataReturn([Input])
   'runs sub/function from outside of normal scope
   objForm.GlobalMethod
End Sub

Wenn Sie Late Binding verwenden, sollten Sie immer nach Nullwerten und Objekten suchen, die Nothing sind, bevor Sie versuchen, eine Verarbeitung durchzuführen. 

0
Double E CPU

Sie können auch -

Private Const SrlNumber As Integer = 910

Private Sub Workbook_Open()
    If SrlNumber > 900 Then
        MsgBox "This serial number is valid"
    Else
        MsgBox "This serial number is not valid"
    End If
End Sub

Es wurde im Amt 2010 getestet

0
SftAps