【问题标题】:Excel macro doesn't execute correctly when opening file from c#从 c# 打开文件时 Excel 宏无法正确执行
【发布时间】:2015-02-24 03:24:56
【问题描述】:

我有一个宏,可以根据条件格式化单元格。 这是代码:

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”值的单元格都是红色的。太好了!

但是当我运行打开文件、进行更改并保存它的应用程序时,一些“正常”单元格是“红色”(很好!),而其他是“绿色”(糟糕!)。

有人有想法吗?

谢谢

【问题讨论】:

    标签: c# excel vba


    【解决方案1】:

    一个可能值得尝试的建议:将 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 处理程序调用相同的例程。

    这可能允许您在工作表仍处于打开状态时观察正在调用的例程 - 与在工作表关闭后必须打开工作表相比有所改进。

    【讨论】:

      【解决方案2】:

      不,我不能从代码中调用宏,因为该应用程序是一个将 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
      

      结束子 使用此代码,即使对于我没有指定值的黑色字体,格式也会每次都发生变化。这就是为什么当一个值改变时,之前的绿色字体的单元格在一个应该有黑色字体的单元格之后保持绿色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        相关资源
        最近更新 更多