2012-01-26 2 views
0

Word 문서를 열 때 자동으로 실행되는 VBA 템플릿 프로젝트가 있습니다. 그러나 여러 문서를 열면 모두 변수 값을 공유합니다. 이러한 변수를 활성 창이나 활성 문서에만 연관되도록 어떻게 선언 할 수 있습니까?VBA 변수가 Word 문서에서 공유되지 않도록하려면 어떻게해야합니까?

클래스 모듈에서 선언을 시도했지만 도움이되지 않았습니다. 열린 문서 간 전환 이러한 변수가 공유되어 있음을 알 수 있습니다. 모든 입력이 감사

...

내 모듈이 무엇인지이 :

Option Private Module 
    Dim CurrentCommand As String 

    Public Function SetCurrentCommand(command) 
    CurrentCommand = command 
    End Function 

    Public Function GetCurrentCommand() 
    GetCurrentCommand = CurrentCommand 
    End Function 

추가 정보 :이 같은 자동 실행에서 코드/매크로 시작 :

Public Sub Main()  
    Set oAppClass.oApp = Word.Application 
    If PollingRate <> "" Then Application.OnTime Now + TimeValue(PollingRate), "CaptureUserViewState" 
End Sub 

CaptureUserViewState는 다른 모듈에있는 Sub이며 모든 값을 검사합니다 (새 값과 마지막 값을 비교). 그리고 이 하위이 검사 수행 방법을 다시 :

If WL_GetterAndSetter.GetLastPageVerticalPercentage <> pageVerticalPercentScrolled Then 
    'Update the last value variable 
    WL_GetterAndSetter.SetLastPageVerticalPercentage (pageVerticalPercentScrolled) 
    'log change 
End If 
+0

처음에 변수를 어떻게 선언했는지 보여주십시오. –

답변

3

당신은 우리에게 많은 정보를 제공하지 않습니다,하지만 난 당신이 같은 모듈 수준에서 공용 변수 선언 가정

Public myString As String 
Public myDouble As Double 

VBA 문서에서을 :

변수는 Public 문을 사용하여 선언가 Option Private Module가에 있지 않는 한 모든 응용 프로그램의 모든 모듈의 모든 프로 시저에 사용할 수 효과; 이 경우 변수는 거주하는 프로젝트 내에서만 공개됩니다.

대답은 Option Private Module입니다.

여러 프로젝트에서 참조를 허용하는 호스트 응용 프로그램에서 사용되는 경우 Option Private Module은 모듈 내용이 프로젝트 외부에서 참조되지 않도록합니다.

[...] 사용하는 경우 절차 전에 모듈 수준에 Option Private 문을 사용해야합니다. 이제 당신은 모듈 수준에서 Dim를 사용하여 변수를 선언 할 것이 분명했다

편집 할 수 있습니다. 이 경우 Option Private Module은 부적합합니다.

모듈 수준에서 Dim으로 선언 된 변수는 모듈 내의 모든 프로 시저에서 사용할 수 있습니다.

즉, Option Private Module을 사용하는지 여부에 관계없이

실행 중에 값이 유지된다는 것을 알게되면 동일한 통합 문서의 동일한 모듈에서 프로 시저를 실행하고 있기 때문에 값이 유지되어야합니다. 당신은 당신이 뭔가를하고 있다고 생각할지도 모르지만, 실제로 이것은 당신이하는 일입니다.클래스 모듈에서

편집, 대신 Dim CurrentCommand As StringPrivate CurrentCommand As String을 시도합니다. 더 많은 정보가 없으면 프로그램을 디버그하기가 어렵습니다. 나는 여기서 무작위로 포착을하고있다.

+0

옵션 개인 모듈을 사용하여 문제가 해결되지 않았습니다. 이 모듈의 변수는 여전히 Word 문서에서 공유됩니다. – Alaa

+0

@Alaa : 클래스 모듈 또는 일반 모듈로 선언 되었습니까? 그들이 공유되고 있음을 어떻게 알 수 있습니까? –

+0

클래스 모듈과 일반 모듈을 모두 시험해 보았습니다. 설명해 드리겠습니다. 수직 스크롤 위치를 추적하고 마지막 위치를 기록합니다. 문서 A와 B가 열렸다고합시다. 문서 A를 아래로 스크롤하면 마지막 및 현재 세로 스크롤 위치가있는 MsgBox가 표시됩니다. 이제는 값이 (마지막 위치 : 0 - 현재 위치 : 7)라고합시다. 이제 문서 B로 이동합니다. 문서 B에서 스크롤하지 않았더라도 MsgBox가 표시됩니다 (마지막 위치 : 7 - 현재 위치 : 0). 따라서 마지막 스크롤 위치와 현재 스크롤 위치가 모두 0이어야합니다. – Alaa

0

당신이해야 할 일은 여러 버전의 변수를 저장하는 것입니다. 문서 당 하나씩 설정하십시오. 그래서 다른 값을 보유 할 간단한 클래스를 만드는 것이 좋습니다. 그런 다음 데이터 세트를 문서 이름 또는 유사한 키와 매핑하는 컬렉션에 저장합니다.

classmodule에서

(MyData로)는 공공으로 표시 :

경우-핸들러 모듈에서
Public data1 as String 
Public data2 as Integer 

: 다음

Dim c as new Collection 'module global declaration 

Sub AddData() 
    Dim d as new MyData 'Your data set 
    d.data1 = "Some value" 
    d.data2 = 42 
    c.add Value:=d, Key:=ActiveDocument.name 
End Sub 

당신이 데이터 사용을 검색하려면 이벤트 핸들러를 입력 현재 액티브 한 문서의 특정 세트

Sub EventHandler() 
    Dim d as MyData 
    set d = c.item(ActiveDocument.name) 
    'use data 
    'd.data1... 
End Sub 

이 코드는 개념적 수준에 불과하지 않습니다. 그것은 작동하지 않습니다, 당신은 당신의 문제에 그것을 적용해야하지만 그것은 당신에게 당신이해야 할 일에 대한 아이디어를 줄 것입니다. 아이템을 이미 콜렉션에 넣었는지 확인하는 등 많은 오류 처리 기능을 추가해야하지만, 계속 시도해 보는 것이 좋겠다.

이유는 귀하의 질문에서 상황을 이해하기 때문에 스크립트의 한 버전 만 실행하고 여러 개의 문서가 있기 때문입니다. 따라서 스크립트는 모든 다른 문서에 대해 알아야합니다.

한편, 각 문서에 고유 한 코드/이벤트 핸들러가 있고 스크립트의 여러 버전이 실행 중이면 위에 제공된 솔루션이 필요하지 않습니다. 대신 스크립트에서 참조하는 문서 인스턴스를주의해야합니다. "ActiveDocument"대신 항상 "ThisDocument"를 사용하면 열려있는 각 문서에 코드가 있으면 격리 할 수 ​​있습니다.

그러나 필자가 이해 하듯이 열려있는 문서와는 별도로 한 버전의 스크립트 만 실행하므로 첫 번째 해결 방법이 적용됩니다.

행운을 빈다.

0

당신은 Document.CustomDocumentProperties 재산권 http://msdn.microsoft.com/en-us/library/office/aa212718(v=office.11).aspx

이것은 당신이 다음

Document.CustomDocumentProperties.Add(PropertyName, LinkToContent, Value, Type) 

그리고 사용에 새로운 속성을 추가 할 수 있습니다 를 DocumentProperties 컬렉션 를 반환를 사용하여 특정 문서 내용을 저장 할 수 있습니다 읽기 사용에서

Document.CustomDocumentProperties.Item(PropertyName) 

단점이나 보너스는 속성을 삭제하지 않는 한 문서에 저장되어 있다는 것입니다.

이것은 좋은 것일 수도 있고 나쁜 것일 수도 있습니다.

관련 문제