Событие изменения листа Excel не запускается при изменении ячейки ТОЛЬКО после запуска макроса VBA - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение, которое загружает (пользовательская кнопка на ленте) данные из куба в Excel.Когда строка обновляется, она запускает событие Worksheet_Change и добавляет эту строку в массив для обратной записи в куб (вместо перезаписи всех строк)

В рамках бизнес-требований после внесения изменений, * Макропрограмма Resort VBA существует для «преобразования» всех данных, имеющих значения NON 0, в верхнюю часть листа в алфавитном порядке.Это делается кнопкой с назначенным ей макросом.Единственная проблема заключается в том, что когда пользователь редактирует другую ячейку ПОСЛЕ запуска макроса ... Обработчик события изменения рабочего листа не запускается, поэтому, когда я нажимаю кнопку сохранения (пользовательскую кнопку на ленте), чтобы записать данные обратно в куб ... массив измененных строк равен нулю, и моя функция для обработки возвращает сообщение «Никаких изменений не было», даже если я отредактировал ячейку.

Я могу опубликовать свой код макроса, если хотите, яЯ уже проверил это, и я не устанавливаю Application.EnableEvents в false.

Моя теория такова, поскольку код для загрузки / сохранения данных находится на ленте, а код для функции курортав VBA, это вызывает некоторую проблему с областью действия и ссылками, поэтому приложение не знает, что оно обновило ячейку.Не совсем уверен.

Я пытался отладить все решение и поместить точки останова в мои обработчики событий для событий смены листа, но они просто не запускаются ... Я думаю, что решение, которое я попробую следующим, переписать Resort код из VBA, чтобы включить его в ленту в C #, и посмотреть, если это волшебным образом решает эту проблему.Просто хотел узнать, знает ли кто-нибудь, была ли проблема в чем-то другом, о чем я не знал.

Sub Resort()
'
' Macro1 Macro
'

Dim LastRow As Long
ActiveSheet.Unprotect "hello"

Application.ScreenUpdating = False
Application.Calculation = xlAutomatic
Sheets("Hidden_Lookup").Visible = True

Sheets("Input").UsedRange
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=1
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=2
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=3
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=4
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=5
Sheets("Input").Range("$D$14:$I$1000000").AutoFilter Field:=6
LastRow = Sheets("Input").Cells(Sheets("Input").Rows.Count,                 
"D").End(xlUp).Row


Sheets("Hidden_Lookup").Activate

    Columns("A:E").Select
    Selection.Delete Shift:=xlToLeft


'Sub Cat
Range("A15").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(IFERROR(IF(AND(Input!RC[8] = ""Working"", Input!RC[7] =     
""Demand Dollars"", Input!RC[21] <>0), 1,0),0)=1,Input!RC[4],"""")"

    'Brand ID
    Range("B15").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(IFERROR(IF(AND(Input!RC[7] = ""Working"", Input!RC[6] =     
""Demand Dollars"", Input!RC[20] <>0), 1,0),0)=1,Input!RC[-1],"""")"

    'Demand Type
    Range("C15").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(IFERROR(IF(AND(Input!RC[6] = ""Working"", Input!RC[5] =     
""Demand Dollars"", Input!RC[19] <>0), 1,0),0)=1,Input!RC[4],"""")"


    'Concat
    Range("D15").Select
    ActiveCell.FormulaR1C1 = _
        "=RC[-3]&""-""&RC[-2]&""-""&RC[-1]"



        'Flag
    Range("E15").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(IF(AND(Input!RC[4] = ""Working"", Input!RC[3] = ""Demand     
Dollars"", Input!RC[17] <>0), 1,0),0)"



ActiveSheet.Range("A15:E15").Select
Selection.AutoFill Destination:=Range("A15:E" & LastRow),     
Type:=xlFillDefault
Calculate

Sheets("Input").Activate


    Columns("AD:AD").Select
    Selection.ClearContents


Range("AD15").Select
ActiveCell.FormulaR1C1 = _
"=IFERROR(VLOOKUP(RC[-25]&""-""& RC[-29]&""-    ""&RC[-23],Hidden_Lookup!C[-26]:C[-25],2,FALSE),0)"

Selection.AutoFill Destination:=Range("AD15:AD" & LastRow),     Type:=xlFillDefault
Calculate


ActiveWorkbook.Worksheets("Input").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add Key:=Range( _
        "AD15:AD" & LastRow), SortOn:=xlSortOnValues, Order:=xlDescending,     DataOption:= _
        xlSortNormal

    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("E15:E" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("F15:F" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal

    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("A15:A" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("G15:G" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("H15:H" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Input").Sort.SortFields.Add     Key:=Range("I15:I" & LastRow _
        ), SortOn:=xlSortOnValues, Order:=xlAscending,     DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Input").Sort
        .SetRange Range("A14:AD" & LastRow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ActiveSheet.Range("$D$14:$I$" & LastRow).AutoFilter Field:=5,     Criteria1:=Array( _
        "Demand Dollars", "GM %", "GM Dollars", "Hours", "TS Count"),     Operator:= _
        xlFilterValues

    Columns("AD:AD").Select
    Selection.ClearContents



Sheets("Hidden_Lookup").Activate

    Columns("A:E").Select
    Selection.Delete Shift:=xlToLeft


Sheets("Hidden_Lookup").Visible = False






Sheets("Input").Activate

ActiveWindow.ScrollColumn = 10
Range("E14").Select
Application.ScreenUpdating = True

  ActiveSheet.Protect Password:="hello", AllowFiltering:=True,     AllowFormattingColumns:=True

End Sub

После запуска функции Resort она все равно должна разрешать обработчики событий изменения рабочего листа в моем коде C #быть запущенным и, следовательно, добавленным в массив modifiedRows и сохраненным / записанным в куб.

...