Извините, если это слишком расплывчато, но я сталкиваюсь с ошибкой сценариев VBA, которая, кажется, только что появилась на прошлой неделе, и я волнуюсь, связано с обновлением, выдвинутым корпоративными ИТ-специалистами в этот период.
По сути, у меня есть панель управления Excel со сценариями VBA, которая просит пользователя указать папку, а затем просматривает все файлы в этой папке (и любую подпапку). Он открывает каждый файл, затем копирует набор данных из именованных диапазонов в таблицу в агрегаторе и затем закрывает файл. По сути, он собирает финансовые прогнозы и информацию о состоянии из ряда файлов в панель управления всего портфеля.
На прошлой неделе все работало нормально. Как я уже сказал, я получил обновление для O365 в конце прошлой недели, и теперь оно кажется потерянным. Когда я запускаю его, частично, Excel внезапно закрывается (все открытые файлы). Если я перебираю код, он делает это при закрытии файла, используя стандартную строку кода wb.close savechanges:=true
(я пытался не сохранять, это не имеет значения).
Однако, это не делает это для всех трекеров, только для некоторых. Все файлы были созданы по одному и тому же шаблону, но ни один из них не поврежден, хотя я периодически получаю сообщение об ошибке «Не удается найти проект или библиотеку» при открытии некоторых файлов, хотя и не всегда. Разница только в , которую я вижу, состоит в том, что, если я добавлю часы в переменную объекта Workbook, которая используется для открытия каждого файла, те, которые работают нормально, имеют значение Type Workbook / ThisWorkbook и те, которые приводят к закрытию Excel, имеют тип Рабочая книга / Рабочая тетрадь
Любая помощь вообще очень ценится, спасибо!
Пример кода:
Dim wb As Workbook
Dim tbl As ListObject
Set wb = Workbooks.Open(filePath, False, False)
Set tbl = sht_projOverview.ListObjects("tbl_projectInfo")
If nameExistsWb(wb, "projInfo_ProjID") Then
'This makes the assumption that any Excel file with the named range "projInfo_projID" is a financial tracker
tbl.ListRows.Add AlwaysInsert:=True
tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "Unique ID")).Value = wb.Names("projInfo_ProjID").RefersToRange(1, 1).Value 'We know theprojID field exists, so we can add that
'Now add all the other data fields
'BASIC INFO FIELDS
If nameExistsWb(wb, "projInfo_Programme") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "Programme")).Value = wb.Names("projInfo_Programme").RefersToRange(1, 1).Value
If nameExistsWb(wb, "projInfo_Project") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "Project")).Value = wb.Names("projInfo_Project").RefersToRange(1, 1).Value
If nameExistsWb(wb, "projInfo_Pillar") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "BU/Pillar")).Value = wb.Names("projInfo_Pillar").RefersToRange(1, 1).Value
If nameExistsWb(wb, "projInfo_ITTower") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "IT Tower")).Value = wb.Names("projInfo_ITTower").RefersToRange(1, 1).Value
If nameExistsWb(wb, "projInfo_Status") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "Project Status")).Value = wb.Names("projInfo_Status").RefersToRange(1, 1).Value
If nameExistsWb(wb, "projInfo_Stage") Then tbl.DataBodyRange.Cells(tbl.DataBodyRange.Rows.Count, tableColumnIndex(tbl, "Project Stage")).Value = wb.Names("projInfo_Stage").RefersToRange(1, 1).Value
'This continues on, copying over a number of other fields
importTrackerData = 1
Else
importTrackerData = 0
End If
wb.Close savechanges:=True
End Function