2013-10-10 2 views
2

У меня есть объект VBA в Excel 2003, который запускает три простых макроса, когда определенные значения достигаются с помощью потоковых данных. Это работает хорошо. Я хотел бы открыть дубликат рабочего листа, но с различными потоковыми данными, а также запускать макросы на своих соответствующих листах. Он работает сейчас, но только на листе, который я сейчас выбрал. На каждом листе есть объект и макросы.Макросы VBA на двух листах

Объект отслеживает три ячейки, и когда первая ячейка запускается, продолжает следить за следующей ячейкой, а при срабатывании контролирует следующую ячейку, затем повторяет.

Я бы помог им одновременно запустить их на своих электронных таблицах одновременно.

Вот объект 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 

И вот три макроса - они, по существу, то же самое - они копируют с того же места, но вставить в разных местах. 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

Причина, по которой ваш код не работает, заключается в том, что вы используете функцию Range. Использование Range только для Application.Range.

Файлы справки Excel сказать о нем:

При использовании без объекта классификатором, это свойство является аббревиатурой для ActiveSheet.Range (она возвращает диапазон от активного листа, если активного листа ISN Это листок, свойство не работает).

Сохранение этого в событии Worksheet_Calculate блокирует его на данном рабочем листе.

Я бы предложил переместить код, который находится в вашем Worksheet_Calculate, в модуль в отдельной функции с ячейками, представляющими интерес в качестве параметров. Это позволит вам СУЩЕСТВУЮТ ваш код и позволить вам поместить вызов функции в событие Worksheet_Activate.

Если вы не хотите, чтобы переписать код, просто бросить вызов Worksheet_Calculate в Worksheet_Activate события:

Private Sub Worksheet_Activate() 
    Worksheet_Calculate 
End Sub 

Это запустит ваш код при входе в рабочий лист.

Смежные вопросы