2012-08-01 1 views
1

이것은 정말 저를 곤두박질칩니다. 어제 모듈 (see here) 사이에 전달되는 컬렉션에 관한 질문을했지만, 더 이상 설명을 듣지 않는 것처럼 보입니다. 따라서 일반적인 방법으로 문제를보다 명확하게 다시 말하려고 시도하고 있습니다.엑셀 배열과 컬렉션 사이에 전달되는 컬렉션이 값을 엉망으로 만들었습니다.

모듈 (module1)과 사용자 정의 (userform1)가 있습니다. 나는 userform1에 콜렉션 (또는 배열)을 만들고이 배열에 워크 시트 객체를 추가합니다. 그런 다음 addNewFile이라는 userform1의 하위를 호출하는 module1에 컨트롤을 전달합니다. addNewFile은 새로 만든 통합 문서를 컬렉션에 추가해야합니다. 그러나 module1이 addNewFile을 호출 할 때마다 다음과 같은 두 가지 시나리오 중 하나가 발생합니다. 1) 콜렉션이 지워지고 추가 된 모든 워크 시트가 이제 콜렉션에 대해 사라졌습니다. 2) 유형이 일치하지 않는다는 오류가 발생합니다. (배열의 경우). 왜 이런 일이 일어나고 있는지 모르겠으니 아래 코드는 더 잘 설명합니다. 배열에 워크 시트 개체를 저장할 수 없다고 말하는 경우에도 도움이 될 것입니다.

UserForm1을

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 

Module1의

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 

미안 내가 여기 죽은 말을 치는 것 같다,하지만 난 정말 여기에서 무슨 일이 일어나고 있는지 어떤 생각이없는 경우. 나는 컬렉션과리스트가 글로벌이면서 다른 모듈에 의해 참조 될 때 변경되지 않는다는 생각에 익숙하다. 여기서 무슨 일이 일어나고 있는지에 대한 도움은 아주 좋습니다.

+0

또한이 문제는 통합 문서가 아닌 모든 데이터 형식에서 발생합니다. – derigible

+2

당신은'workBooksCollection' 컬렉션 객체를 초기화하지 않는 것 같습니다 ('Set workBooksCollection = New collection'). 그게 어디서 일어난거야? –

+0

죄송합니다. workBooksCollection 앞에 New 연산자를 추가하는 것을 잊었습니다. 이제는'Dim workBooksCollection as New Collection'을 읽습니다. – derigible

답변

2

본인은 원래 본 계정에 액세스 할 수 없으므로 계정을 다시 실행해야하므로 주석을 달고 싶습니다. 내 대답은 도움이되지 않으면

, 나는 비트에 삭제합니다,하지만 당신은 무엇을 바꿀 경우 - 사용자 정의 폼 모듈에서

Dim workBooksCollection as collection 'can also define as an array 

를, 모듈 1로 같이

Public workBooksCollection as collection 'can also define as an array 

합니까 도움이 되니?

+0

이것은 모두 문제였습니다. 나는 이틀 동안 내 머리를 벽에 치고있다! 고마워요. 그건 정말 간단했고,해야한다는 것을 알았습니다. – derigible

+0

@ 우수 - 귀하의 문제에 대한 답변이라는 점에 놀랐습니다. 콜렉션 변수가 userform에 정의되어 있지만 * userform *에서도 메소드를 통해서만 접근 할 수 있다면 public으로 선언 할 필요는 없습니다. –

+0

@TimWilliams 그게 내가 생각한 것인데, 작동시키지 못했습니다. 나는 VBA의 범위에 너무 익숙하지 않으며 다른 언어에서는 찾을 수없는 VBA의 이상한 규칙이 있음을 알게되었습니다. 나는이 대답이 작동한다는 것을 알고 있습니다. 접근 자 메서드가 작동하지 않는 이유에 대한 해결책이 있다면 알고 싶습니다. – derigible