Как предотвратить потерю «ссылки» для встроенных чартданных - PullRequest
0 голосов
/ 06 апреля 2020

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

Для поддержки этого проекта я пытался найти способ, с помощью которого я могу обновлять данные диаграммы в Word, используя VBA, избегая при этом метода ChartData.Activate ( в конечном итоге приводит к сбою программы из-за бремени последовательных действий открытия / закрытия [context: у меня около 300 диаграмм в самый большой из этих отчетов] ).

Я попытался обновить данные с помощью прямого вызова ChartData.Workbook и ChartData.ActivateChartDataWindow , оба из которых позволяют мне успешно обновлять данные. Однако после успешного обновления я получаю следующую ошибку при попытке доступа к набору данных вручную и больше не могу получить к нему доступ через макрос:

Связанный файл недоступен

Я знаю, что, возможно, я упускаю что-то простое или, возможно, неправильно подхожу к этому, перебирая Word, но хотел выкинуть его туда, чтобы посмотреть, есть ли у кого-нибудь решение, которое может решить / объяснить, что вызывает потерю этих «ссылок» к встроенным наборам данных?

Снимок экрана с диаграммой (спереди)

Снимок экрана с диаграммой (данные)

Чтобы попытаться оптимизировать тестирование; Я создал урезанную версию общего кода, который я использовал для устранения неполадок:

Dim x As Integer 'Counter used to breakout of routine once 1 chart updated.

Dim strChartTitle As String
Dim objChart As InlineShape
Dim objTargetWorkbook As Workbook
Dim objTargetWorksheet As Worksheet

x = 0

For Each objChart In ActiveDocument.InlineShapes

    strChartTitle = objChart.Chart.ChartTitle.Text

    If x = 1 Then

        Exit Sub

    ElseIf strChartTitle Like "EHR Transactions Summary (By Endpoint)*" Then

        'objChart.Chart.ChartData.Activate
        objChart.Chart.ChartData.ActivateChartDataWindow

        Set objTargetWorkbook = objChart.Chart.ChartData.Workbook
        Set objTargetWorksheet = objTargetWorkbook.ActiveSheet

        objTargetWorksheet.Range("C1:D11").Copy objTargetWorksheet.Range("B1")
        objTargetWorksheet.Range("D1").Value = DateAdd("m", 1, objTargetWorksheet.Range("C1").Value)

        x = 1
        objTargetWorkbook.close

    End If

Next objChart

1 Ответ

1 голос
/ 07 апреля 2020

Проблема:

Не удалось найти способ обновления данных на большом количестве диаграмм с использованием vba без использования команд Chart.ChartData.Activate или Chart.ChartData.ActivateChartDataWindow, которые либо вызывали cra sh из-за загрузки процессора при последовательной загрузке / выгрузке (прежний метод) или разрыву связей между встроенными диаграммами и их таблицами данных (последний метод).

Решение:

Решение было частично предоставлено @Slightly Snarky в комментарии к исходному сообщению о проблеме / проблеме. Несмотря на документацию Microsoft, можно обновлять данные в рабочих книгах диаграммы без необходимости вызывать команду активации путем прямой ссылки на рабочую книгу и рабочую таблицу. Переписал сценарий для использования нового метода и подтвердил, что это не только позволило мне редактировать данные; это удалось сделать, избегая при этом снижения производительности, связанного с повторяющимися событиями открытия / закрытия, вызванными двумя вышеуказанными методами.

При тестировании; возникла одна проблема - MS-Word запускал новый подпроцесс Excel каждый раз, когда код ссылался на другую диаграмму, не убивая предыдущий подпроцесс. Учитывая, что в этих отчетах содержится до 300 диаграмм, это неизбежно приводило к тому, что подпрограмма создавала sh после того, как на ЦП было создано достаточное количество подпроцессов.

Чтобы решить эту проблему, я настроил код для включения ChartData Команда .Workbook.Close после завершения каждого обновления диаграммы, что помогло свести нагрузку на процессор к минимуму и предотвратить сбои из-за перегрузки подпроцессами Excel.

Dim strChartTitle As String
Dim objChart As InlineShape

For Each objChart In ActiveDocument.InlineShapes

 strChartTitle = objChart.Chart.ChartTitle.Text

 If strChartTitle Like "EHR Transactions Summary (By Endpoint)*" Then

     With objChart.Chart.ChartData.Workbook.Worksheets(1)

        .Range("C1:D11").Copy objChart.Chart.ChartData.Workbook.Worksheets(1).Range("B1")
        .Range("D1").Value = objChart.Chart.ChartData.Workbook.Worksheets(1).Range("D1").Value = DateAdd("m", 1, objChart.Chart.ChartData.Workbook.Worksheets(1).Range("C1").Value)

    End With

    objChart.Chart.ChartData.Workbook.close

End If

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