これは本当に私を困惑させています。モジュール間で受け渡されるコレクションに関して昨日質問をしましたが (こちらを参照)、それについての説明がもう得られていないようです。
モジュール (module1) とユーザーフォーム (userform1) があります。userform1 にコレクション (または配列) を作成し、この配列にワークシート オブジェクトを追加します。次に、新しく作成されたワークブックをコレクションに追加することになっている addNewFile という userform1 のサブルーチンを呼び出す module1 に制御を渡します。ただし、module1 が addNewFile を呼び出すたびに、次の 2 つのシナリオのいずれかが発生します。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
ここで死んだ馬を打ち負かしているように見えたら申し訳ありませんが、ここで何が起こっているのか本当にわかりません. 私は、コレクションとリストがグローバルであり、別のモジュールから参照されても変化しないという考えに慣れています。ここで何が起こっているかについての助けは素晴らしいでしょう。