#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