Hoe declareer ik een globale variabele in VBA?

Ik heb de volgende code geschreven:

Function find_results_idle()
    Public iRaw As Integer
    Public iColumn As Integer
    iRaw = 1
    iColumn = 1

En ik krijg de foutmelding:

“ongeldig kenmerk in sub of functie”

Weet je wat ik verkeerd heb gedaan?

Ik heb geprobeerd Globalte gebruiken in plaats van public, maar kreeg hetzelfde probleem.

Ik heb geprobeerd de functie zelf als ‘Openbaar’ te declareren, maar dat heeft ook geen zin.

Wat moet ik doen om de globale variabele te maken?


Antwoord 1, autoriteit 100%

Je moet de variabelen buiten de functie declareren:

Public iRaw As Integer
Public iColumn As Integer
Function find_results_idle()
    iRaw = 1
    iColumn = 1

Antwoord 2, autoriteit 65%

Dit is een vraag over scope.

Als je wilt dat de variabelen alleen de levensduur van de functie meegaan, gebruik dan dim(afkorting van Dimensie) in de functie of sub om de variabelen te declareren:

p>

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

Een algemenevariabele (zoals SLaks opmerkte) wordt buiten de functie gedeclareerd met het publicsleutelwoord. Deze variabele is beschikbaar gedurende de levensduur van uw actieve toepassing. In het geval van Excel betekent dit dat de variabelen beschikbaar zijn zolang die specifieke Excel-werkmap open is.

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.

Je kunt ook variabelen hebben die alleen toegankelijk zijn binnen een bepaalde module (of klasse) door ze te declareren met het trefwoord Private.

Als je een grote applicatie bouwt en de behoefte voelt om globale variabelen te gebruiken, raad ik aan om een aparte module te maken voor je globale variabelen. Dit zou je moeten helpen om ze op één plek bij te houden.


Antwoord 3, autoriteit 20%

Als u globale variabelen wilt gebruiken, voegt u een nieuwe module toe vanuit de gebruikersinterface van VBA Project en declareert u variabelen met Global

Global iRaw As Integer
Global iColumn As Integer

Antwoord 4, autoriteit 10%

De vraag gaat eigenlijk over reikwijdte, zoals de andere man het uitdrukte.

Kortom, overweeg deze “module”:

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). 

Je kunt deze MSDN-referentie bekijkenvoor meer informatie over variabele declaratie en deze andere Stack Overflow-vraagvoor meer informatie over hoe variabelen buiten het bereik vallen.

Twee andere snelle dingen:

  1. Wees georganiseerd bij het gebruik van variabelen op werkmapniveau, zodat uw code niet verwarrend wordt. Geef de voorkeur aan Functies(met de juiste gegevenstypen) of geef argumenten door ByRef.
  2. Als u wilt dat een variabele zijn waarde tussen aanroepen behoudt, kunt u de instructie Staticgebruiken.

Antwoord 5, autoriteit 7%

Als deze functie zich in een module/klasse bevindt, kun je ze gewoon buiten de functie schrijven, zodat deze Global Scopeheeft. Global Scope betekent dat de variabele toegankelijk is voor een andere functie in dezelfde module/klasse(als u dimgebruikt als declaratieverklaring, gebruik dan publicals u wilt dat de variabelen toegankelijk zijn voor alle functies in alle modules) :

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

Antwoord 6

U kunt ook –

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

Het is getest op kantoor 2010


Antwoord 7

Maak een openbaar geheel getal in de algemene verklaring.

Dan kun je in je functie elke keer de waarde ervan verhogen.
Zie voorbeeld (functie om bijlagen van een e-mail op te slaan 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

Antwoord 8

Een goede manier om openbare/globale variabelen te maken, is door het formulier als een klasseobject te behandelen en eigenschappen te declareren en Public Property Get [variabele] te gebruiken om toegang te krijgen tot de eigenschap/methode. Mogelijk moet u ook verwijzen naar of een verwijzing doorgeven aan de geïnstantieerde formuliermodule. U krijgt fouten als u methoden aanroept naar formulieren/rapporten die gesloten zijn.
Voorbeeld: geef Me.Form.Module.Parent door aan sub/functie niet binnen vorm.

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

Dus in de andere module zou je toegang hebben tot:

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

Als je Late Binding gebruikt zoals ik, controleer dan altijd op Null-waarden en objecten die Niets zijn voordat je probeert om enige verwerking uit te voeren.

Other episodes