Ограничить макрос до активного листа - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть рабочий лист в рабочей книге с несколькими листами Workbook1, который содержит некоторый код VBA, который выполняется при изменении значений определенных вычисляемых ячеек.Все работает хорошо.Однако, если эта рабочая книга активна, и я открываю другую рабочую книгу Workbook2, не связанную с Workbook1, кажется, что код VBA для Workbook1 пытается выполнить, и я получаю окно сообщения с ошибкой времени выполнения:

«9: нижний индекс вне диапазона»

сообщение.Как будто код для Workbook1 выполняется.Если я нажимаю кнопку DEBUG при ошибке во время выполнения, я вижу код для workbook1.

Мне нужно ограничить выполнение определенного кода VBA Workbook1, FEED_ANALYSIS Sheet.

Включен код Workbook1, прикрепленный к листу FEED_ANALYSIS.

Заранее спасибо.

Private Sub Worksheet_Calculate()
    Dim Cost_Per_day
    Dim COST_kg
    Dim COST_GROSS_kg
    Dim AVG_SALES_PRICE
    Dim COST_NET_PURCHASE
    Dim PROFIT_GROSS
    Dim PROFIT_NET
    Dim PROFIT_NET_X
    Dim Flag_set

    Dim dtmTime As Date
    Dim Rw As Long

'If Critical Cells change, move contents to Log sheet

    Dim Xrg As Range
    Set Xrg = Range("E5:I11")
    If Not Intersect(Xrg, Range("E5:I11 ")) Is Nothing Then
        dtmTime = Now()
        Cost_Per_day = Worksheets("FEED_ANALYSIS").Range("E7").Value
        COST_kg = Worksheets("FEED_ANALYSIS").Range("F7").Value
        COST_GROSS_kg = Worksheets("FEED_ANALYSIS").Range("G7").Value
        AVG_SALES_PRICE = Worksheets("FEED_ANALYSIS").Range("I5").Value
        COST_NET_PURCHASE = Worksheets("FEED_ANALYSIS").Range("G11").Value
        PROFIT_GROSS = Worksheets("FEED_ANALYSIS").Range("I7").Value
        PROFIT_NET = Worksheets("FEED_ANALYSIS").Range("I8").Value
        PROFIT_NET_X = Worksheets("FEED_ANALYSIS").Range("I9").Value

        Rw = Sheets("LOG").Range("A" & Rows.Count).End(xlUp).Row + 1

        With Sheets("LOG")
            datcomp = .Cells(Rw - 1, 1)

       ' if the previous entry date is the same as the current date, do not create the entries... one entry per day

            If Year(datcomp) = Year(dtmTime) And Month(datcomp) = Month(dtmTime) And Day(datcomp) = Day(dtmTime) Then GoTo NoUpd

            .Cells(Rw, 1) = dtmTime
            .Cells(Rw, 2) = Cost_Per_day
            .Cells(Rw, 3) = COST_kg
            .Cells(Rw, 4) = COST_GROSS_kg
            .Cells(Rw, 5) = AVG_SALES_PRICE
            .Cells(Rw, 6) = COST_NET_PURCHASE
            .Cells(Rw, 7) = PROFIT_GROSS
            .Cells(Rw, 8) = PROFIT_NET
            .Cells(Rw, 9) = PROFIT_NET_X
            .Cells(Rw, 11) = .Cells(Rw - 1, 1)
NoUpd:
        End With   
    End If
End Sub

1 Ответ

0 голосов
/ 25 ноября 2018

Когда вы запускаете макросы в первый раз, имейте имя рабочей книги в глобальной переменной.Затем используйте эту переменную в квалификации wokbook, в котором вы хотите работать. Если вы сейчас откроете другую рабочую книгу, макрос будет работать на правильном wokbook:

Dim gWorkBookName As String

Private Sub Worksheet_Calculate()
    '...
    If (gWorkBookName = "") Then
        gWorkBookName= ActiveWorkbook.Name
    End If
    '...
    With Workbooks(gWorkBookName)
        Cost_Per_day = .Worksheets("FEED_ANALYSIS").Range("E7").Value
        '...
    End With
    '...
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...