我有一个应用程序,可将多维数据集(功能区中的自定义按钮)加载到excel中。更新某行后,它会触发Worksheet_Change
事件,并将此行添加到数组中以写回到多维数据集(而不是重写所有行)
作为业务需求的一部分,进行更改后,存在一个Resort
VBA宏功能,可以按字母顺序将具有NON 0值的所有数据“重新排序”到工作表的顶部。这是通过为按钮分配了宏来完成的。唯一的问题是,当用户在宏运行后编辑另一个单元格时...工作表更改事件处理程序不会触发,因此当我单击保存按钮(功能区中的自定义按钮)将数据写回到多维数据集时。 。修改后的行的数组为null,即使我已经编辑了单元格,我处理的函数也会返回一条消息,指出“未进行任何更改”。
如果需要,我可以发布宏代码,我已经检查了它,并且没有将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
数组中并保存/写入多维数据集。