У меня есть приложение, которое загружает (пользовательская кнопка на ленте) данные из куба в 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
и сохраненным / записанным в куб.