2010-04-27 15 views
86

Ich schrieb den folgenden Code:Wie deklariere ich eine globale Variable in VBA?

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 Sub oder Function"

Wissen Sie, was ich falsch gemacht habe?

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

Ich habe versucht, die Funktion selbst als "Public" zu deklarieren, aber das hat auch nicht gut getan.

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

Antwort

130

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 
29

globale Variablen zu verwenden, Einfügen Neues Modul von VBA-Projekt UI und deklarieren Variablen Global

Global iRaw As Integer 
Global iColumn As Integer 
87

Dies ist eine Frage scope.

Wenn Sie nur die Variablen die Lebensdauer der Funktion dauern, verwenden Dim (kurz für Dimension) innerhalb der Funktion oder Unter den 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 

Ein global Variable (wie SLaks darauf hingewiesen hat) wird außerhalb der Funktion mit dem Schlüsselwort Public deklariert. Diese Variable wird während der Laufzeit Ihrer laufenden Anwendung verfügbar sein. Im Fall von Excel bedeutet dies, dass die Variablen verfügbar sind, solange diese bestimmte 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, die nur zugänglich innerhalb eines bestimmten Moduls (oder Klasse) sind, indem sie mit dem Private Schlüsselwort deklarieren.

Wenn Sie eine große Anwendung erstellen und sich gezwungen fühlen, globale Variablen zu verwenden, 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.

+1

+1 Noch nützlich 7 Jahre später. Aber gibt es eine zusätzliche Nuance in Bezug auf Objektvariablen gegenüber Datenvariablen? Ich habe ein Problem im Zusammenhang mit Variablen für Objektbereiche festgestellt, die zu einer neuen Frage geführt haben. Sehr geschätzt, wenn Sie Zeit hätten, sich umzusehen. https://StackOverflow.com/q/46058096/5457466 – Egalth

12

Wenn diese Funktion in einem Modul/einer Klasse ist, könnten Sie sie einfach außerhalb der Funktion schreiben, also Global Scope. Globale Scope bedeutet, dass die Variable kann durch eine andere Funktion im selben Modul/Klasse zugegriffen werden (wenn Sie dim als Deklarationsanweisung verwenden, verwenden public, wenn Sie die Variablen wollen, können durch alle Funktionen in allen Modulen zugegriffen werden):

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 
1

Erstellen Sie eine öffentliche Ganzzahl in der Allgemeinen Deklaration.

Dann in Ihrer Funktion können Sie ihren Wert jedes Mal erhöhen. Siehe Beispiel (Funktion zum Speichern von Anlagen 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 
9

Die Frage ist wirklich über Umfang, wie der andere Typ es ausdrückt.

Kurz gesagt, betrachten 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 reference für mehr auf Variablendeklaration überprüfen und diese anderen Stack Overflow Question für mehr darüber, wie Variablen außerhalb des Gültigkeitsbereichs gehen.

Zwei weitere schnelle Dinge:

  1. organisiert werden, wenn Arbeitsmappe Ebene Variablen, so dass Ihr Code nicht verwirrend bekommt. Lieber Funktionen (mit geeigneten Datentypen) oder Argumente übergeben ByRef.
  2. Wenn Sie möchten, dass eine Variable ihren Wert zwischen Aufrufen erhält, können Sie die Static Anweisung verwenden.
+0

Sind Sie sicher, dass eine globale Variable in verschiedenen Arbeitsmappen verwendet werden kann? Funktioniert nicht für mich – Seb

+0

Guter Punkt! Mir ist aufgefallen, dass ich keinen Hinweis hinzugefügt habe, woher ich diese Informationen erhalten habe ... Ich habe es auch nicht wiedergefunden. Besser, die Antwort zu bearbeiten ...:/Oh, und danke Seb. – FCastro