Запуск макроса, открывающего другие книги, дает #ИМЯ! ошибка в ячейках, которые напрямую ссылаются на эту книгу

#excel #vba

Вопрос:

У меня есть макрос в сводной книге, который открывает серию исходных книг, а затем вручную вычисляет мою сводную книгу. Каждая ячейка вызывает функцию для вычисления ее суммарного значения (код ниже). Это прекрасно работает. Однако, когда я запускаю это, оно дает мне #ИМЯ! ошибка в любых ячейках, которые напрямую ссылаются на именованные диапазоны в исходных файлах. Почему?

Это мой код:

 Sub UpdateLinks_Click1()

Dim ws As Worksheet
Dim vbasheet As Worksheet
Dim fileInputTable As ListObject
Dim i As Long
Dim filePath As String
Dim openWorkbook As Workbook
Dim tableRow As Range
Dim tableCol As Long
Dim currTableRow As Range
'Dim openWkbs() As Workbook

Application.ScreenUpdating = False
Application.EnableEvents = False
'Application.DisplayAlerts = False

Set vbasheet = ThisWorkbook.Worksheets("VBAData")
Set ws = ThisWorkbook.Worksheets("Score Card")
Set fileInputTable = vbasheet.ListObjects("MetricsFileLocations")


vbaDataArray = fileInputTable.DataBodyRange
ReDim openWkbs(UBound(vbaDataArray))
Application.Calculation = xlCalculationManual

For i = 1 To UBound(vbaDataArray)

    Set openWkbs(i) = Workbooks.Open(vbaDataArray(i, 2))
    ThisWorkbook.Activate
Next i
     
ThisWorkbook.Application.Calculate

For i = 1 To UBound(vbaDataArray)
    openWkbs(i).Close
Next i

   
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
 

Функция, вызываемая из каждой ячейки:

 Public Function NewValueFunction(refCell As Range) As Variant

Dim cellCalc As Variant
Dim activeCellVal As Variant
Dim activeWS As Variant
Dim i As Long
Dim activeCell As String

activeCell = refCell.Address
activeWS = refCell.Worksheet.Name


cellCalc = ""


'loop through wbks
For i = 1 To UBound(openWkbs)

   With openWkbs(i)
    'if value of currwb.currentsheetname.currentcell  is "" then ignore it
        activeCellVal = .Worksheets(activeWS).Range(activeCell).Value
        If Not (activeCellVal = "") And Not (IsError(activeCellVal)) Then
            If cellCalc = "" Then
                cellCalc = activeCellVal
            Else
                cellCalc = cellCalc   activeCellVal
            End If
        End If
    End With
Next i

NewValueFunction = cellCalc


End Function
 

Синтаксис ячеек, которые получают #ИМЯ! ошибка заключается в следующем:

 ='\stupid long directory name[FileName.xlsm]Utilization'!Curr_DataCol_1
 

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

 ThisWorkbook.Worksheets("Utilization").Calculate
 

Я сбит с толку. Пожалуйста, посоветуйте.
Спасибо!

Комментарии:

1. Кроме того, если я войду в каждую ячейку с ИМЕНЕМ#! ошибка и нажмите ВВОД, ячейка заполняется просто отлично. Так что синтаксис правильный. Просто что-то мешает работе, когда я запускаю макрос.

2.Попробуй бежать Application.CalculateFullRebuild docs.microsoft.com/en-us/office/vba/api/…

3. Если я поставлю это вместо моего другого оператора Calculate, никаких изменений не произойдет. Если я помещу его после того, как закрою все свои входные файлы, это не исправит ошибки #NAME и нарушит все остальное, потому что другие вызовы функций сводки требуют, чтобы файлы были открыты.

4. Мое решение закончилось так: ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources ThisWorkbook.Worksheets("Utilization").Calculate ThisWorkbook.Worksheets("Summary").Calculate