仅在VBA宏运行后,Excel工作表更改事件才在单元格更改上不触发

时间:2018-12-21 17:11:10

标签: c# excel vba visual-studio excel-vba

我有一个应用程序,可将多维数据集(功能区中的自定义按钮)加载到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数组中并保存/写入多维数据集。

0 个答案:

没有答案