2013-10-10 2 views
2

스트리밍 데이터를 통해 특정 값을 얻으면 세 개의 간단한 매크로를 트리거하는 VBA 개체가 Excel 2003에 있습니다. 그것은 잘 실행됩니다. 중복 워크 시트를 열고 싶지만 다른 스트리밍 데이터를 사용하고 각 시트에 매크로 트리거가 있어야합니다. 현재 작동하지만 현재 선택한 워크 시트에서만 작동합니다. 각 워크 시트에는 객체와 매크로가 있습니다.VBA 두 워크 시트의 매크로

개체는 세 개의 셀을 모니터링하고 첫 번째 셀이 트리거되면 다음 셀을 모니터링하고 트리거되면 다음 셀을 모니터링 한 다음 반복합니다.

둘 다 각각의 스프레드 시트에서 동시에 실행되도록하는 데 도움이됩니다. 여기에 세 가지 매크로입니다,

Private Sub Worksheet_Calculate() 

Static oldval1 
Static oldval2 
Static oldval3 

Static LastAction As Integer 
' Initial state will be 0, neither Fast nor Slow 
Const Fast As Integer = 1 
Const Fast2 As Integer = 2 
Const Slow As Integer = 3 

Application.EnableEvents = False 

If Range("I1").Value = "1" And oldval1 <> "1" And LastAction <> Fast Then 
    PasteFast 
    LastAction = Fast 
ElseIf Range("Q1").Value = "1" And oldval2 <> "1" And LastAction <> Slow Then 
    PasteFast2 
    LastAction = Fast2 
ElseIf Range("Y1").Value = "1" And oldval3 <> "1" And LastAction <> Slow Then 
    PasteSlow 
    LastAction = Slow 
End If 

oldval1 = Range("I1").Value 
oldval2 = Range("Q1").Value 
oldval3 = Range("Y1").Value 

Application.EnableEvents = True 

End Sub 

그리고 - 그들은 본질적으로 동일합니다 - 서로 다른 위치에 같은 위치에 복사 만 붙여 넣습니다

다음은 VBA 개체입니다. PasteSlow와 PasteFast는 하나의 모듈에 있고 PasteFast2는 두 번째 모듈에 있습니다 (아무 이유없이).

Sub PasteSlow() 
' 
' PasteSlow Macro 
' 

' 
Application.ScreenUpdating = False 
Range("G5:G57").Select 
Selection.Copy 
Range("H5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("K5:K57").Select 
Application.CutCopyMode = False 
Selection.Copy 
Range("L5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("A1").Select 
End Sub 

Sub PasteFast() 
' 
' PasteFast Macro 
' 

' 
Application.ScreenUpdating = False 
Range("g5:g57").Select 
Selection.Copy 
Range("P5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("k5:k57").Select 
Application.CutCopyMode = False 
Selection.Copy 
Range("T5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("A1").Select 
End Sub 


Sub PasteFast2() 
' 
' PasteFast2 Macro 
' 

' 
Application.ScreenUpdating = False 
Range("g5:g57").Select 
Selection.Copy 
Range("x5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("k5:k57").Select 
Application.CutCopyMode = False 
Selection.Copy 
Range("ab5").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Range("A1").Select 
End Sub 

모든 코드 서식 오류에 대해 사과합니다.

+1

다른 Excel 인스턴스에서 열어보십시오. –

+1

VBA는 멀티 스레딩을 지원하지 않습니다. 그래서 @SiddharthRout이 제안한 것처럼, 별도의 Excel 인스턴스에서 시트를 열거 나 매크로가 어느 것이 실행되고 있는지를 매크로로 가져 오게 할 수도 있습니다. – ARich

답변

0

코드가 작동하지 않는 이유는 범위 기능을 사용하는 방식에 있습니다. 범위 만 사용하면 Application.Range의 약자입니다.

엑셀 도움말 파일

그것에 대해 이런 말 :

객체 한정자없이 사용

,이 속성이 ActiveSheet.Range (가 활성 시트의 범위를 반환에 대한 바로 가기입니다, 활성 시트 ISN 경우 워크 시트가 아닌 경우 속성이 실패 함).

이 내용을 Worksheet_Calculate 이벤트에 보관하면 주어진 워크 시트에 잠급니다.

Worksheet_Calculate에있는 코드를 매개 변수로 관심있는 셀이있는 별도의 기능으로 모듈로 옮기는 것이 좋습니다. 이렇게하면 코드가 건조 해지고 Worksheet_Activate 이벤트에 함수 호출을 허용 할 수 있습니다.

그냥 Worksheet_Activate 이벤트에 Worksheet_Calculate에 전화를 던져 코드를 다시 작성하지 않으려면

:

Private Sub Worksheet_Activate() 
    Worksheet_Calculate 
End Sub 

이 워크 시트를 입력 할 때 코드를 시작합니다.

관련 문제