J'ai écrit le code suivant:
Function find_results_idle()
Public iRaw As Integer
Public iColumn As Integer
iRaw = 1
iColumn = 1
Et je reçois le message d'erreur:
"attribut invalide dans Sub ou Function"
Savez-vous ce que j'ai mal fait?
J'ai essayé d'utiliser Global
au lieu de Public
, mais j'ai le même problème.
J'ai essayé de déclarer la fonction elle-même en tant que `Public, mais cela n'a également pas servi.
Que dois-je faire pour créer la variable globale?
Vous devez déclarer les variables en dehors de la fonction:
Public iRaw As Integer
Public iColumn As Integer
Function find_results_idle()
iRaw = 1
iColumn = 1
Ceci est une question à propos de scope .
Si vous voulez seulement que les variables durent toute la vie de la fonction, utilisez Dim
(abréviation de Dimension) à l'intérieur de la fonction ou du sous-objet pour déclarer les variables:
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
Une variable globale (comme indiqué par SLaks) est déclarée en dehors de la fonction à l'aide du mot clé Public
. Cette variable sera disponible pendant la vie de votre application en cours d'exécution. Dans le cas d'Excel, cela signifie que les variables seront disponibles tant que ce classeur Excel est ouvert.
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.
Vous pouvez également avoir des variables uniquement accessibles dans un module (ou une classe) particulier en les déclarant avec le mot clé Private
.
Si vous construisez une grosse application et ressentez le besoin d'utiliser des variables globales, je vous recommande de créer un module séparé uniquement pour vos variables globales. Cela devrait vous aider à les garder au même endroit.
Pour utiliser des variables globales, insérez un nouveau module dans l'interface utilisateur du projet VBA et déclarez les variables à l'aide de Global
Global iRaw As Integer
Global iColumn As Integer
La question concerne vraiment la portée, comme l’a dit l’autre personne.
En bref, considérons ce "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).
Vous pouvez consulter ceci Référence MSDN pour en savoir plus sur la déclaration de variable et cet autre Question de débordement de pile pour en savoir plus sur la manière dont les variables sortent du cadre.
Deux autres choses rapides:
Si cette fonction est dans un module/une classe, vous pouvez simplement les écrire en dehors de la fonction, donc Global Scope
. Global Scope signifie que la variable est accessible par une autre fonction du même module/de la même classe (si vous utilisez dim
comme déclaration, utilisez public
si vous voulez que toutes les fonctions de tous les modules accèdent à la variable)
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
Créez un entier public dans la déclaration générale.
Ensuite, dans votre fonction, vous pouvez augmenter sa valeur à chaque fois ... Voir un exemple (fonction permettant de sauvegarder les pièces jointes d'un courrier électronique au format 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 bon moyen de créer des variables publiques/globales consiste à traiter le formulaire comme un objet de classe, à déclarer des propriétés et à utiliser la propriété publique Get [variable] pour accéder à la propriété/à la méthode. De plus, vous devrez peut-être référencer ou transmettre une référence au module de formulaire instancié. Vous obtiendrez des erreurs si vous appelez des méthodes aux formulaires/rapports fermés.
Exemple: passez Me.Form.Module.Parent à une sous/fonction qui ne soit pas à l'intérieur de la forme.
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
Ainsi, dans l'autre module, vous pourrez accéder à:
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
Si vous utilisez la liaison tardive comme je le fais toujours, vérifiez toujours si les valeurs Null et les objets sont null avant d’essayer d’effectuer un traitement.
Aussi, vous pouvez utiliser -
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
Son testé sur office 2010