Макрос Excel не выполняется правильно при открытии файла из C # - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть макрос, который форматирует ячейки в зависимости от условия. Вот код:

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 и обновляет его данными.

Когда я сохраняю файл (из кода) и открываю файл (с рабочего стола или из любого места), я вижу, что макрос запущен, но цвета (форматирование) не подходят для определенных ячеек.

Например, если значение ячейки «ОК», формат макроса ячейки должен иметь цвет «красный». Когда я сохраняю книгу из Excel, все ячейки со значением «ОК» имеют красный цвет. Отлично!

Но когда я запускаю свое приложение, которое открывает файл, вносит изменения и сохраняет его, некоторые ячейки «ОК» имеют «красный» (отлично!), А другие «зеленый» (плохо!).

У кого-нибудь есть идея?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 декабря 2010

Нет Я не могу вызвать макрос из кода, потому что приложение является приложением, которое сообщает о задачах 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 С этим кодом формат меняется каждый раз даже для черного шрифта, для которого я не указал значение. Вот почему при изменении значения ячейка с зеленым шрифтом до этого оставалась grenn после для ячейки, которая должна иметь черный шрифт.

0 голосов
/ 22 декабря 2010

Одно предложение, которое, возможно, стоит попробовать: переместить код 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.

Это может позволить вам наблюдать, как вызывается подпрограмма, пока лист еще открыт - улучшение по сравнению с необходимостью открывать лист после его закрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...