Come si dichiara una variabile globale in VBA?

Ho scritto il seguente codice:

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

E ottengo il messaggio di errore:

“attributo non valido in Sub o Funzione”

Sai cosa ho fatto di sbagliato?

Ho provato a utilizzare Global anziché Public , ma ho avuto lo stesso problema.

Ho provato a dichiarare la funzione stessa come pubblica, ma anche questo non ha funzionato.

Cosa devo fare per creare la variabile globale?

Devi dichiarare le variabili al di fuori della funzione:

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

Questa è una domanda sulla portata .

Se si desidera solo che le variabili durino per tutta la durata della funzione, utilizzare Dim (abbreviazione di Dimension ) all’interno della funzione o sub per dichiarare le variabili:

 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 

Una variabile globale (come sottolineato da SLaks) viene dichiarata al di fuori della funzione utilizzando la parola chiave Public . Questa variabile sarà disponibile durante la vita della tua applicazione in esecuzione. Nel caso di Excel, ciò significa che le variabili saranno disponibili fino a quando quella determinata cartella di lavoro Excel è aperta.

 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. 

Puoi anche avere variabili accessibili solo all’interno di un particolare modulo (o class) dichiarandole con la parola chiave Private .

Se stai costruendo una grande applicazione e senti la necessità di utilizzare variabili globali, ti consiglio di creare un modulo separato solo per le tue variabili globali. Questo dovrebbe aiutarti a tenere traccia di loro in un unico posto.

Per utilizzare le variabili globali, inserisci Nuovo modulo dall’interfaccia utente del progetto VBA e dichiara le variabili utilizzando Global

 Global iRaw As Integer Global iColumn As Integer 

Se questa funzione è in un modulo / class, puoi semplicemente scriverli al di fuori della funzione, quindi ha Global Scope . Global Scope indica che la variabile può essere utilizzata da un’altra funzione nello stesso modulo / class (se si utilizza dim come dichiarazione, utilizzare public se si desidera che le variabili siano accessibili da tutte le funzioni in tutti i moduli):

 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 

La domanda riguarda davvero lo scopo, come l’ha detto l’altro ragazzo.

In breve, considera questo “modulo”:

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

È ansible controllare questo riferimento MSDN per ulteriori informazioni sulla dichiarazione delle variabili e questa altra domanda di overflow dello stack per ulteriori informazioni su come le variabili escono dall’ambito.

Altre due cose veloci:

  1. Organizzarsi quando si utilizzano le variabili di livello della cartella di lavoro, quindi il codice non crea confusione. Preferisci funzioni (con tipi di dati appropriati) o argomenti di passaggio ByRef .
  2. Se si desidera che una variabile mantenga il suo valore tra le chiamate, è ansible utilizzare l’istruzione statica .

Creare un numero intero pubblico nella dichiarazione generale.

Quindi nella tua funzione puoi aumentarne il valore ogni volta. Vedere l’esempio (funzione per salvare gli allegati di un’e-mail come 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 

Un buon modo per creare variabili pubbliche / globali consiste nel trattare il modulo come un object di class e dichiarare proprietà e utilizzare la proprietà pubblica [variabile] per accedere alla proprietà / metodo. Potrebbe anche essere necessario fare riferimento o passare un riferimento al modulo Modulo istanziato. Riceverai errori se chiami metodi per moduli / rapporti che sono chiusi.
Esempio: passare Me.Form.Module.Parent in sub / function non all’interno di 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 

Quindi nell’altro modulo potreste accedere a:

 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 

Se usi Late Binding come faccio sempre a verificare i valori Null e gli oggetti che sono Nothing prima di tentare di eseguire qualsiasi elaborazione.