2016-12-13 81 views
0

当我的方法/子程序执行后发生事件时,如何将变量传递给VBA中的事件?执行后将变量传递给VBA事件处理程序

详情:

'My Sub'''''''''''''''''''''''''' 
Private Sub mySub() 
    structCalculateDateValues 'calculates a number of dates that I want to be unlocked on my form 
    fnCreateTable 'create a table will all dates form my database 
End Sub 

'Event handler for continous form''''''''''''''' 
Private Sub Form_Current() 
    'Some code to get the value of my Struct - structCalculateDateValues 
    'Lock records that do not fall within of the date parameters of the values in structCalculateDateValues 
End Sub 

这里的概念是我想一个形式展现在一个临时表中的所有日期的记录,但只允许其中的一些记录可编辑。这发生在MS Access 2013年我有它设置的方法是:

  1. 创建一个结构包含所有日期计算基于这些计算
  2. 连续的形式,是
  3. 负载值到临时表绑定到该表已存在
  4. 执行通常会在这里结束
  5. 作为形式打开它触发Form_Current事件处理程序
  6. 通行证结构值,该处理程序以某种方式??????

这是一个比其他任何事情都更有效率的问题,一个大问题就是如何触发该事件。我也想避免一个答案,导致我写我的结构成员值到数据库(将是一个cop-out)。我认为在VBA中必须有一种方法来暂停执行来检测事件吗?

感谢,

+0

将它设置为模块变量,其中我的子项是私有的myStruct,因为xyz然后分配和使用。使用structCalculateDateValues作为函数返回你的结构也可能 –

+0

如果我明白这一点,你建议我在事件处理程序中重新计算我的结构。这很容易做到,而且我的结构是按照您的建议设置的模块。但是,如果可能的话,我想尽我所能保存处理器。基本上我会重复工作(如果我在这里理解你)。 –

+0

所以只是使用它,如果你有顶部的私人结构,那么你可以在当前使用 –

回答

1

你需要一个模块级变量。这样你就可以从模块中的任何地方访问它:

Option Explicit 
Private MyValue As MyValueType '<--- 

Private Sub Some_ParameterlessEventHandler() 
    MyValue.SomeMember = 42 
End Sub 

Private Sub SomeProcedureThatRunsAfterTheHandler() 
    Debug.Print MyValue.SomeMember 'outputs 42 
End Sub 
+0

全局或模块级别的变量不会丢失垃圾收集?我相信在我的Main Sub结束后,VBA会释放引用,并且所有变量都是垃圾回收,对吗?另外,对于连续形式的事件处理程序我没有任何限制。它们位于自己的访问对象内部的独立模块中。 –

+0

VBA没有垃圾回收,它是引用计数的,它不会“重置”,直到遇到'End'关键字或者你的宏突然冒出火焰。 –

+1

@JamieMarshall注意:'End'是指实际的'End'指令,而不是'End Sub'标记的'End'部分。只要宿主应用程序处于活动状态,模块变量就会存活,除非你用'End'核杀死了'em。 –

相关问题