Palesh1990 Ответов: 1

Как избежать ошибки активация объекта _workbook не удалась


Всем привет,

Я сделал некоторую логику на сервере и скачаю отчет excel со всеми данными, и в файле excel будут некоторые макросы для отображения некоторых диаграмм.

Я попытался загрузить отчет из настольного приложения, позвонив в sevrer, и отчет загрузился и работает нормально.
Теперь я пытаюсь сделать ту же логику из веб-приложения similaraly by calliung server.the excel Скачать и он имеет данные, но при открытии excel, если макросы включены, он дает мне ошибку как:

Ошибка времени выполнения '1004;

метод "активировать" объекта "_Workbook" не удалось.

пожалуйста, предложите, как избежать этой ошибки..Попробовал следующий код

Что я уже пробовал:

 ' Public Sub Workbook_Activate()
'ThisWorkbook.Activate
'End Sub
  'ThisWorkbook.Activate
   'For Each lobjWorkSheet In ThisWorkbook.Worksheets
       ' If lobjWorkSheet.Name = "Summary" Then
        
            
           ' Worksheets("Summary").Activate
           
        '
           ' If ThisWorkbook.Worksheets.Count = 2 Then
               'If ThisWorkbook.Worksheets.Item(1).Name = "ReportTemplate" Then
             '       Exit Sub
                'End If
           ' End If
            
            'If ActiveSheet.ChartObjects.Count = 0 Then
               ' WriteSummarySheet
            'End If
            
            'Exit For
       ' End If
 '   Next
'End Sub

Private Sub Workbook_Open()
 MsgBox ("Worksheet has been oprned")
    On Error Resume Next
    ThisWorkbook.Activate
    On Error GoTo 0

    MsgBox ("after actiavte")

    For Each lobjWorkSheet In ThisWorkbook.Worksheets
        If lobjWorkSheet.Name = "Summary" Then
        
            
            Worksheets("Summary").Activate
           
        
            If ThisWorkbook.Worksheets.Count = 2 Then
                If ThisWorkbook.Worksheets.Item(1).Name = "ReportTemplate" Then
                    Exit Sub
                End If
            End If
          
            If ActiveSheet.ChartObjects.Count = 0 Then
                WriteSummarySheet
            End If
            
            Exit For
        End If
   Next
        
End Sub

Palesh1990

я исправил эту проблему, удалив событие Open и обработав тот же код в событии activate

1 Ответов

Рейтинг:
0

Maciej Los

Лучший способ избежать подобных ошибок-писать код в контексте!

Никогда не использовать Select или Activate метод, если вы не уверены, что делаете! Использование этих методов может быть причиной нескольких проблем, таких как зависание приложения, длительное время выполнения макросов и т. д., И даже сбой приложения, потому что Select/Activate вызов метода запускает несколько событий, например: обновление экрана, вычисление ячеек и многие другие.
На основе документации MSDN (Выбор и активация ячеек | Microsoft Docs[^]):

Цитата:
Регистратор макросов часто создает макрос, который использует метод Select и свойство Selection. Следующая Подпроцедура была создана с помощью регистратора макросов и показывает, как Select и Selection работают вместе.
Sub Macro1() 
    Sheets("Sheet1").Select 
    Range("A1").Select 
    ActiveCell.FormulaR1C1 = "Name" 
    Range("B1").Select 
    ActiveCell.FormulaR1C1 = "Address" 
    Range("A1:B1").Select 
    Selection.Font.Bold = True 
End Sub

В следующем примере выполняется та же задача без активации или выбора листа или ячеек.
Sub Labels() 
    With Worksheets("Sheet1") 
        .Range("A1") = "Name" 
        .Range("B1") = "Address" 
        .Range("A1:B1").Font.Bold = True 
    End With 
End Sub


Но это не избавит вас от ошибок! Почему? Представьте себе, что у вас уже открыты 2 рабочие книги. В каждом из них есть свой человек. "Sheet1Где будут внесены изменения? Это зависит от того, какая рабочая книга в данный момент активна! Итак, как улучшить приведенный выше код, чтобы быть уверенным, что макрос будет ecxecuted в правильной (желаемой) книге? Просто, используйте переменную!
Sub Labels() 
    Dim wbk As Workbook, wsh As Worksheet

    Set wbk = ThisWorkbook 'or Application.Workbooks("ShortName.xlsx") - if you want to refer to the workbook differ than workbook in which macro is executed
    Set wsh = wbk.Worksheets("Sheet1") 'or wbk.Worksheets(1)
    With wsh 
        .Range("A1") = "Name" 
        .Range("B1") = "Address" 
        .Range("A1:B1").Font.Bold = True 
    End With
    Set wsh = Nothing
    Set wbk = Nothing 
End Sub


Для получения дополнительной информации, пожалуйста, смотрите:
Справочник по языку Visual Basic для приложений (VBA) | Microsoft Docs[^]
Excel VBA Performance Coding Best Practices - Microsoft 365 Blog[^]


Palesh1990

Спасибо Лос