在用户表单上调用数组终止/关闭VBA

时间:2016-02-17 13:41:51

标签: arrays excel vba userform

我有一个问题,我想在关闭用户窗体时将用户窗体的内容存储在数组中。我以为我的语法正确但似乎没有重新填充userform initialize。我尝试将数组放在自己的模块中,这也不起作用。有人想开导我吗?

示例代码:

Public Sub DPArrayStuff()

Dim DP(2)
DP(0) = Block1
DP(1) = Block2
DP(2) = Block3

End Sub

Private Sub userform_terminate()

If Block1.Value <> vbNullString Then Call DPArrayStuff

End Sub

Private Sub userform_Initialize()

If DP(0) <> vbNUllString Then 
    Block1 = DP(0)
    Block2 = DP(1)
    Block3 = DP(2)
End If

End Sub 

2 个答案:

答案 0 :(得分:3)

特别针对用户形式

正如@Ralph所指出的,不是关闭用户窗体,而是只能使用户窗体不可见。这将保留表单上的所有信息,而无需将数据传输到其他变量,并且可能是最简单的选项,假设不需要关闭表单。

如果您的变量只需要在工作簿打开时存活:

通过在声明Sub之前在模块级别将该变量声明为Public,可以在子运行后维护变量。例如,下面的模块代码在整个工作簿的持续时间内保存i的值,并且每次单击任一按钮时,我都会被操纵并保留以供进一步使用。

Public i As Integer

Sub Button1_Click()
    i = i + 1
    Range("A1").Value = i
End Sub

Sub Button2_Click()
    i = i + 1
    Range("A1").Value = i
End Sub

请注意,尽可能长时间限制公共变量的使用通常被视为良好做法;坚持在子例程级别声明的变量允许用户更容易地识别要运行的代码实际需要哪些变量,特别是因为在VBA中使用尚未声明的变量是常见的(尽管做法不佳)。不必要地使用公共变量可能会导致懒惰。

如果您的变量需要在工作簿结束和打开时继续存在:

如果您希望在打开和关闭工作簿之间存储这样的数据,您可以选择一些选项,以便用户看不到数据[出于各种原因]:

- 您可以保留一个在数组值中删除的空白页,然后隐藏并保护该表。这是存储数据数组的最简单方法之一,只要机密性不是问题[因为存储在工作表中的数据可以由提交的用户轻易访问,无论工作簿是否受密码保护]

- 您可以将数据存储在另一个文件中,Excel然后在启动时将其拉入数组。这样做的好处是可以保持原始文件更小,如果需要保密,可以将其他文件存储在只有部分用户可以访问的网络位置。

- 您可以创建不可见的形状并编辑这些形状的内部属性,例如它们的标题。这些数据可能是可访问的,但对用户来说并不引人注目;可能不是数据数组的一个很好的选择,但它可能是。

答案 1 :(得分:1)

不幸的是,当代码超出范围(例如,子程序完成执行)时,VBA不支持持久存储器存储。有一些非常古老的方法可以直接将值写入内存,但对于那些不熟悉该方法的人来说,这些方法既麻烦又危险。

我能想到的可能的解决方案是直接或通过数组从表单中获取数据,并将其写入Excel中的隐藏工作表。您还可以将数据存储在数据库中或将其写入文本文件。

隐藏的工作表更容易编码,因为您已经在Excel参考库中工作了。写入数据库或文本文件意味着设置或创建对适用参考库的引用,并了解如何执行这些操作的语法。