从c#打开文件时Excel宏无法正确执行

时间:2010-12-22 10:30:23

标签: c# excel excel-vba vba

我有一个基于条件格式化单元格的宏。 这是代码:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Set MyPlage = Sheets("Report").Range("E13:E1500")
For Each Cell In MyPlage
    If Cell.Value = "L" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 3
    ElseIf Cell.Value = "K" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 44
    ElseIf Cell.Value = "J" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 10
    ElseIf Cell.Value = "ü" Then
        Cell.Borders.ColorIndex = 1
    ElseIf Cell.Value = "" And Cell.Offset(0, 1).Value <> "" Then
        Cell.Borders.ColorIndex = 1
    Else
    Cell.Borders.ColorIndex = 2
End If

Next

宏在保存工作簿之前执行。 它非常适合excel。

我的问题是我有一个C#应用程序打开这个excel文件并用数据更新它。

当我保存文件(从代码中)并打开文件(从桌面或任何地方)时,我看到宏已经运行但是某些单元格的颜色(格式化)不正确。

例如,如果单元格值为“OK”,则单元格的宏格式应为“红色”。 当我从Excel保存工作簿时,所有具有“OK”值的单元格都是红色。太好了!

但是当我运行打开文件的应用程序,进行更改并保存时,一些“OK”单元格为“红色”(太棒了!)但其他单元格为“绿色”(不好!)。

有没有人有想法?

谢谢

2 个答案:

答案 0 :(得分:0)

可能值得尝试的一个建议:将VBA代码移动到新的例程中,例如

Public Sub UpdateFormats
    Set MyPlage = Sheets("Report").Range("E13:E1500")
    For Each Cell In MyPlage
    ....
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  call UpdateFormats
End Sub

然后在保存和关闭工作表之前从C#显式调用例程。您也可以从BeforeSave处理程序中调用相同的例程。

这可能允许您在纸张仍然打开时观察被调用的例程 - 这是在关闭后打开纸张的改进。

答案 1 :(得分:0)

否我无法从代码中调用宏,因为appli是一个将MPP任务报告给XLS文件的应用程序,XLS文件格式可能会根据使用它的人而改变。有些时候XLS文件没有宏。

我找到了答案。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Set MyPlage = Sheets("Report").Range("E13:E1500")
For Each Cell In MyPlage
    If Cell.Value = "L" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 3
    ElseIf Cell.Value = "K" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 44
    ElseIf Cell.Value = "J" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 10
    ElseIf Cell.Value = "ü" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 1
    ElseIf Cell.Value = "" And Cell.Offset(0, 1).Value <> "" Then
        Cell.Borders.ColorIndex = 1
        Cell.Font.ColorIndex = 1
    Else
    Cell.Borders.ColorIndex = 2
End If

Next

End Sub  使用此代码,格式每次都会更改,即使是我没有指定值的黑色字体。这就是为什么当一个值发生变化时,带有绿色字体的单元格之后仍然是一个应该有黑色字体的单元格。