0

開いているすべてのワークブックをより簡単に追跡できるようにするワークブックのコレクションを作成しようとしています。ブックの名前は毎回異なるため、Excelで他のブックが開いていないことを前提とせずにこのブックを作成する必要があるため、インデックスを使用できません。そのため、コレクションを使用することにしました。ただし、2つ目のブックを入力するとエラーが発生し続け、何が起こっているのかわかりません。コードを2つのモジュールに設定しましたが(それが問題になるかどうかはわかりません)、読みやすいように関連するコードを提供しました。

Sub run()
   Dim usedWorkbooks As New Collection
   Dim mainWorkBook As Workbook
   Set mainWorkBook = ActiveWorkbook
   Dim testwb As Workbook

   usedWorkbooks.Add Item:=mainWorkBook, key:="main" 'Added successfully
   usedWorkbooks.Add Item:=testwb, key:="test" 'Added successsfully
   addNewFile(usedWorkBooks)
End Sub

'In a separate module
Public Sub addNewFile(ByRef usedWorkBooks as Collection) 
   Dim ptCsv As String
   ptCsv = someFilePath
   'Filegrabber.grab simply returns the path of the desired workbook and works correctly
   'This is not the problem, can be substituted with any file path string
   ptCsv = FileGrabber.grab(ptCsv) 
   Dim ptCsvWorkBook As Workbook
   Set ptCsvWorkBook = Workbooks.Open(ptCsv) 'Successfully opens workbook

   'Prints out the type of object as "Workbook"
   MsgBox "the object is: " & TypeName(ptCsvWorkBook)
   'Fails to add. Says I need an object  
   usedWorkbooks.Add Item:=ptCsvWorkBook, key:="ptCsv"
End Sub 

コレクションが別のモジュールにあるためか、上記のコードに問題があるかどうかはわかりません。私は完全に途方に暮れています。どんな助けでも素晴らしいでしょう。

アップデート

それ以来、私はこの質問に答えましたが、関連するメモでは、コレクションを参照するたびに、コレクションの以前の部分がすべて消去されているようです。私はこのコードを私の答えに以下に配置しましたが、参照用に変更してここに追加しています:

'UserForm to login to system
Dim usedWorkbooks As New Collection 
Private Sub login_Click()
   Dim mainWorkBook As Workbook
   Set mainWorkBook = ActiveWorkbook

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

   intializeProcess 'a worksheet is added to the array here
   'This will print out as saying there are 0 worksheets
   MsgBox "the size of the array is: " & usedWorkBooks.Count
End Sub

Public Sub addNewFile(filepath As String, sheetKey As String)
   Dim newWorkBook As Workbook

   Set newWorkBook = Workbooks.Open(filepath)

   usedWorkBooks.Add Item:=newWorkBook, key:=sheetKey
   MsgBox "the size of the array is: " & usedWorkBooks.Count

End Sub

'Part of the initialize Module
Public Sub intializeProcess()
   Call LoginModule.login(username, password, "pt", ie)
   ptCsv = FileGrabber.grab(ptCsv) 'ptcsv is set to some filepath by the grab sub

   'This will print out that the array size is 1
   UserLogin.addNewFile ptCsv, "ptCsv"  
End Sub

何が起こっているのかわかりません。VBAのコレクションの参照を渡すことができないようですか?New操作が実際にオブジェクトを作成しない方法についての投稿を読んだことがありますが、それは私にはわかりませんでした。これが別の質問であると思われる場合は、私に知らせてください。そうします。ありがとう。

4

1 に答える 1

0

上記のコードは、ページにコードが多すぎないように書き直されました。どのような変更を加えて問題が修正されたかわからないため、誰かが元の問題を解決したい場合に備えて、以前に持っていた元のコードをここに追加しました。将来問題が発生した場合は、おそらくコード全体を投稿する必要があります。

'UserForm to login to system
Dim usedWorkbooks As New Collection 'Correct placement of collection
Private Sub login_Click()
   Dim usedWorkbooks As New Collection 'Should be defined outside of this sub
   Dim mainWorkBook As Workbook
   Set mainWorkBook = ActiveWorkbook

   usedWorkbooks.Add Item:=mainWorkBook, key:="main"
   intializeProcess
End Sub

Public Sub addToWorkbookCollection(obj As Workbook, name As String)
   usedWorkBooks.Add Item:=obj, key:=name
End Sub

'Part of the initialize Module
Public Sub intializeProcess()
   ptCsv = FileGrabber.grab(ptCsv)
   Dim ptCsvWorkBook As Workbook

   Set ptCsvWorkBook = Workbooks.Open(ptCsv)

   MsgBox "the object is: " & TypeName(ptCsvWorkBook)
   UserLogin.addToWorkbookCollection ptCsvWorkBook, "ptCsv"

End Sub

上で入力したコードを読んだ後、login_click()サブ内にコレクションを作成していることに気付き、スコープの問題が発生します。質問については申し訳ありませんが、少なくともそれは私の問題を解決するのに役立ちました。

于 2012-07-31T17:31:26.787 に答える