Я написал следующий код:
Function find_results_idle()
Public iRaw As Integer
Public iColumn As Integer
iRaw = 1
iColumn = 1
И я получаю сообщение об ошибке:
"недопустимый атрибут в Sub или Function"
Вы знаете, что я сделал неправильно?
Я пытался использовать Global
вместо Public
, но получил ту же проблему.
Я попытался объявить саму функцию как Public
, но это тоже не помогло.
Что мне нужно сделать, чтобы создать глобальную переменную?
Это вопрос о scope.
Если вы хотите, чтобы переменные действовали только в течение жизни функции, используйте Dim
(сокращение от Dimension) внутри функции или подфункции для объявления переменных:
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
Переменная global (как отметил SLaks) объявляется вне функции с помощью ключевого слова Public
. Эта переменная будет доступна в течение всего времени работы приложения. В случае с Excel это означает, что переменные будут доступны до тех пор, пока открыта данная рабочая книга Excel.
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.
Вы также можете иметь переменные, доступные только в пределах определенного модуля (или класса), объявив их с помощью ключевого слова Private
.
Если вы создаете большое приложение и чувствуете необходимость в использовании глобальных переменных, я бы рекомендовал создать отдельный модуль только для ваших глобальных переменных. Это поможет вам отслеживать их в одном месте.
Вопрос действительно о том, как другой парень положил его.
Короче, считай это на "модуля":
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).
Вы можете проверить это [ссылка на MSDN](https://msdn.microsoft.com/en-us/library/office/gg264241.aspx на "объявление переменных и") Подробнее о переменной и другой переполнение стека вопрос Подробнее о том, как переменные выйдут из области видимости.
Два других простых вещей:
Если эта функция находится в модуле класса, вы могли бы просто оставить их за пределами функции, поэтому она имеет глобальную область видимости. Глобальном уровне означает, что переменная может быть доступна еще одна функция **в один и тот же модуль/класс** (если вы используете
Дим` как декларацию, использовать "общественность", если вы хотите, чтобы переменные могут быть доступны все функции во всех модулях) :
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
Создать общественное целое число в генеральной декларации.
Тогда в вашей функции вы можете увеличить его значение каждый раз. См. пример (функция сохранения приложений по электронной почте, как 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
Хороший способ, чтобы создать общественные/глобальные переменные-это относиться к форме как объект класса и объявлять свойства и использование государственного имущества Вам [переменная] получить доступ к свойству/методу. Также может потребоваться справка или передать ссылку на экземпляр модуля. Вы получите ошибки, если вы вызываете методы формы/отчеты, закрытые. Пример: проходит мимо меня.Форма.Модуль.Родитель в функция Sub/не в форме.
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
Так в других модулях можно получить доступ к:
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
Если вы используете позднее связывание, как я всегда делаю проверку на NULL значения и объекты, которые ничего, прежде чем делать какой-либо обработки.
Также вы можете использовать -
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
Его испытания в Office 2010