Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何使用函数调用的值声明常量变量_Vba_Ms Access_Constants - Fatal编程技术网

Vba 如何使用函数调用的值声明常量变量

Vba 如何使用函数调用的值声明常量变量,vba,ms-access,constants,Vba,Ms Access,Constants,在VBA模块中,我有以下常量声明: Private Const const_abc = 3000 Private Const const_def = 900 Private Const const_etc = 42 ' and so on and so forth 现在,我必须用一次函数调用来初始化这些值,理想情况下是这样 Private Const const_abc = someFunc(18) Private Const const_def = someFunc( 7

在VBA模块中,我有以下常量声明:

Private Const const_abc  =  3000
Private Const const_def  =   900
Private Const const_etc  =    42
'  and so on and so forth
现在,我必须用一次函数调用来初始化这些值,理想情况下是这样

Private Const const_abc = someFunc(18)
Private Const const_def = someFunc( 7)
Private Const const_etc = someFunc( 5)
'  and so on and so forth
当然,这在VBA中不起作用。那么,对于如何处理这样的需求,是否有一个共同的模式

我也许可以这样去

Private const_abc As Double
Private const_def As Double
Private const_etc As Double

sub initConsts()
    const_abc = someFunc(18)
    const_def = someFunc( 7)
    const_etc = someFunc( 5)
end sub
但是我必须确保调用了
initConsts
,我不希望这样做


编辑根据SO的问题,我正在使用MS Access。

创建一个类,该类读取单元格并向值提供一个仅获取的接口

这里有一个名为
ItsMyValueClass

选项显式

Private pMyVal As Integer

Public Property Get MyValue() As Integer
    MyValue = pMyVal
End Property

Private Sub class_initialize()
    'pMyVal = Sheet.Range("somewhere)
    pMyVal = 17
End Sub
下面是您模块中的代码:

Option Explicit

Sub IsItReadOnly()
    Dim valu As ItsMyValueClass
    Dim x As Integer
    Set valu = New ItsMyValueClass
    x = valu.MyValue
    'valu.MyValue = 23   'compile error "Can't assign to read-only property"
End Sub

在一个与模块和类类似的一行程序中,用于纯常量访问:

Public Property Get myConst() As Integer:  myConst = 3:  End Property
您可以这样使用它:

Sub test()
    Debug.Print "myConst: " & myConst  'would print: "myConst: 3"
End Sub
如果必须使用自定义值初始化一次,则可以使用静态属性和一个或多个私有变量:

Private ci As Boolean  'constants initialized

Private myConst1_ As Integer
Private myConst2_ As Integer


Static Property Get myConst1() As Integer
    If Not ci Then init
    myConst1 = myConst1_
End Property


Static Property Get myConst2() As Integer
    If Not ci Then init
    myConst2 = myConst2_
End Property


Private Sub init()
    'these can come from anywhere:
    myConst1_ = 3  
    myConst2_ = 5 
    ci = True 
End Sub
  • 它们在第一次访问第一个“常量”属性时初始化
  • 如果您必须更早地初始化它们,您可以更早地调用
    init
    函数(如果确保属性不被更早地访问,可以选择删除
    ci
    变量和所有相关行)

常量需要在编译时可计算-不能从函数中为其赋值。否则,它们只是规则的全局变量。使用什么样的最佳方法取决于赋值的成本:如果是低成本的,那么最好将它们转换成函数,这样您就总能得到所需的值。常量就是:常量。它的值在代码执行过程中不能更改。根据新的要求-它们需要更改为不再是常量,因为它们不再包含常量值,而是在运行时根据函数调用而更改。@RenéNyffenegger为什么不调用
initConsts
?这似乎是合乎逻辑的方法,“限制”?这不是一个限制;这是有意的设计。常量被设计成-常量,意思是不改变值),变量被设计成使其值改变(改变)。几乎每种语言都有区别,就像英语词典一样。它们是根据它们的预期用途命名的。没有限制-这是一个设计好的结构。