【问题标题】:Excel array and collection passing between modules messing up valuesExcel 数组和集合在模块之间传递会弄乱值
【发布时间】:2012-07-30 18:14:24
【问题描述】:

这真的难倒我。我昨天提出了一个关于模块之间传递集合的问题(see here),但我似乎没有得到更多关于那个的解释,所以我试图以一种通用的方式更清楚地重申这个问题。

我有一个模块 (module1) 和一个用户表单 (userform1)。我在 userform1 中创建了一个集合(或数组)并将工作表对象添加到该数组中。然后我将控制权传递给 module1,它调用 userform1 中名为 addNewFile 的子程序,它应该将新创建的工作簿添加到集合中。但是,每次 module1 调用 addNewFile 时,我都会遇到以下两种情况之一:1)集合已被删除,所有已添加的工作表现在都消失了(对于集合),2)我收到一条错误消息,指出我的类型不匹配(对于一个数组)。我不知道为什么会这样,所以下面的代码可以更好地说明。任何帮助都将不胜感激,即使只是告诉我无法将工作表对象存储在数组中。

用户窗体1

Dim workBooksCollection as New Collection 'can also define as an array
Private Sub CommandButton1_click()

   Dim mainWorkBook as workbook
   Set mainWorkBook = ActiveWorkbook
   Dim testwb As Workbook

   workBooksCollection.Add Item:=mainWorkBook, key:="main" 'Adds successfully
   workBooksCollection.Add Item:=testwb, key:="test" 'Adds successfully
   MsgBox "the size of the array is: " & usedWorkBooks.Count 'Prints off as size 2

   Module1.initialize

   'After running initialize, prints off as size 0, meaning collection has been erased
   MsgBox "the size of the array is: " & usedWorkBooks.Count 'Prints off as size 0

End Sub
Public Sub addNewFile(filepath As String, sheetKey As String)
   Dim newWorkBook As Workbook  
   Set newWorkBook = Workbooks.Open(filepath)

   MsgBox "The name of the workbook is: " & newWorkBook.name  'Prints off name of workbook successfully

   workBooksCollection.Add Item:=newWorkBook, key:=sheetKey
   MsgBox "the size of the array is: " & workBooksCollection.Count 'Prints off as size 1
End Sub

模块1

Public Sub intialize()
   Dim filepath as string
   'The filepath is set to any path of a workbook 

   'This will print out that the array size is 1
   UserForm1.addNewFile filePath, "secondBook"

End Sub

对不起,如果我似乎在这里打败了一匹死马,但我真的不知道这里发生了什么。我习惯于集合和列表是全局的并且在被另一个模块引用时不会改变的想法。任何关于这里发生的事情的帮助都会很棒。

【问题讨论】:

  • 此外,所有数据类型都会发生这种情况,而不仅仅是工作簿。
  • 您似乎没有初始化您的 workBooksCollection 集合对象 (Set workBooksCollection =New collection)。这是在哪里发生的?
  • 抱歉,我忘记在 workBooksCollection 之前添加 New 运算符。它现在显示为 Dim workBooksCollection as New Collection
  • 你的表格是怎么显示的?
  • 目前我只是在 Excel 的开发人员环境中运行它。我还没想好我想怎么展示它。

标签: vba excel automation office-automation


【解决方案1】:

我想发表评论,但我不能发表评论,因为我不得不重做我的帐户,因为我的原件被锁定了。

如果我的回答没有帮助,我会删除一点,但如果你替换-

Dim workBooksCollection as collection 'can also define as an array

从用户窗体模块,进入模块 1:

Public workBooksCollection as collection 'can also define as an array

有帮助吗?

【讨论】:

  • 这一直是个问题。我已经用头撞墙两天了!谢谢,这真的很简单,我知道它必须如此。
  • @derigible - 我有点惊讶这是你问题的答案。如果您的集合变量在用户表单中定义,但只能通过用户表单中的方法访问,则不需要将其声明为 Public。
  • @TimWilliams 这就是我的想法,但我无法让它发挥作用。我对 VBA 中的范围不太熟悉,并且我开始了解到 VBA 中有许多在其他语言中没有的奇怪规则。我只知道这个答案有效。如果您对访问器方法不起作用的原因有解决方案,我很想知道。
  • 原始代码中的“usedWorkbooks”变量指的是什么?我在任何地方都没有看到它的定义......你的子名为“初始化”:看起来像一个错字?修复这些后,您的代码对我来说运行良好。
  • @TimWilliams 是的,对不起,我已经编辑了代码。 Initialize 实际上是 intializeProcess,但我只是缩短了它。现在这里的一切都运行良好。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-03-18
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多