【问题标题】:Calling an Array Upon User Form Terminate/Close VBA在用户表单终止/关闭 VBA 时调用数组
【发布时间】:2016-05-29 06:07:03
【问题描述】:

我有一个问题,我想在用户窗体关闭时将用户窗体的内容存储在一个数组中。我以为我的语法是正确的,但它似乎没有在用户窗体初始化时重新填充。我尝试将数组放在它自己的模块中,但这也不起作用。有没有大神赐教?

示例代码:

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 

【问题讨论】:

  • 有没有办法保存在内存中?我希望避免输入到工作表然后输出到用户表单。
  • 我认为要记住的一件重要事情是,当没有运行 VBA 代码时,您存储在内存中的所有信息都消失了。因此,如果您在表单关闭后没有运行任何代码,则您的设置已丢失。例如,您可以选择将该信息存储在临时文件夹中的文本文件中。但是,检索设置变得更加困难。
  • @Tom 您能否删除您的评论,或进行编辑以反映这样一个事实,即当代码停止后 Dim'd 变量丢失时,只要工作簿打开,Public'd 变量就会保持[并且模块代码未经编辑]?有关详细信息,请参阅下面的答案。

标签: arrays excel vba userform


【解决方案1】:

特别是对于用户表单

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

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

您可以在 sub 运行后维护变量,方法是在模块级别将该变量声明为 Public,然后再声明 Sub。例如,下面的模块代码在工作簿的整个过程中保存 i 的值,每次单击任一按钮时,都会对 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 在启动时将其拉入一个数组中。这样做的好处是可以使您的原始文件更小,如果需要保密,您可以将附加文件存储在只有某些用户可以访问的网络位置。

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

【讨论】:

  • 所以回到我原来的帖子,如果将数组的值存储为公共变量(在子之外),那么这可能真的有效吗?超酷。我会试试看是否可行。
  • 也许您想(甚至更多)详细说明您的答案并在顶部声明 Doug 可以通过隐藏而不卸载它来保留表单的内容。此外,他将不得不删除“初始化”子。但我相信这本质上就是他要找的东西(只要excel文件保持打开状态,不发生错误,表格不改变)。
  • 谢谢大家,我确实研究了与这个问题相关的一般细节(在询问之前),并且玩过隐藏/取消隐藏选项,但我也对这个解决方案感到好奇。
  • @DougCoats 关闭用户表单可能是有原因的,但如果你可以让它不可见,那可能是最简单的 - 请记住,即使这样,当文件被删除时,用户表单也会丢失关闭。
【解决方案2】:

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

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

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

【讨论】:

  • 请注意,当 sub 完成执行时,如果变量已被声明为 public,则数据仍然可用;但是,当工作簿关闭时,即使公开声明的变量也会被清除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多