У меня была пользовательская функция рабочего листа (UDF), которая вернула массив значений, который был отображен на диаграмме.
UDF установил некоторые из этих значений на значение невозможного 2.69653970229349E + 308 (видимо, dll возвращалось 1. # QNAN, который Excel превратился в 2.69653970229349E + 308).
Удивительно, что Excel позволил сохранить это значение в ячейке и сохранить книгу. Однако при открытии книги полученная ошибка была получена, а диаграмма нарушения была удалена во время «восстановления».
Исключение заключалось в том, чтобы на диаграмме отображались только реалистичные значения.
Вот код, отредактированный из довольно большого проекта VBA.
'Global array, Values returned by the UDF
Public MainReturnValues(1 To 57, 1 To 2) As Variant
Public Function MainWorksheetFunction(_
i_rRangeWithInputData As Range _
) As Variant
'[... Process input data ...]
'Load global array MainReturnValues(,), i.e., values returned by the UDF
LoadMainWorksheetFunctionReturnValues
'Now load UDF return values
MainWorksheetFunction = MainReturnValues
End Function
'Load global array MainReturnValues(,), i.e., values returned by the UDF
Private Function LoadMainWorksheetFunctionReturnValues(_
) As Boolean
Dim l_vErrNull As Variant
Dim l_dChartXs(1 To 57) As Double, _
l_dChartYs(1 To 57) As Double
Dim c As Long, _
r As Long
'~~~~~~~ First fill area with xlErrNull to Prevent Log Chart Graphing 0 Errors
'~~~~~~~ Excel will "pick up the pen" when cells contain CVErr(xlErrNull)
l_vErrNull = CVErr(xlErrNull)
For r = LBound(MainReturnValues, 1) To UBound(MainReturnValues, 1)
For c = LBound(MainReturnValues, 2) To UBound(MainReturnValues, 2)
MainReturnValues(r, c) = l_vErrNull
Next c
Next r
'~~~~~~~ End First fill area with xlErrNull ~~~~~~~
'[... Load values into l_dChartXs() and l_dChartYs() using C# dll ...]
For r = 1 To 57
'Don't try to plot ridiculous values. I suspect this causes this error:
'"We found a problem with some content in 'aaa.xlsb'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes."
On Error Resume Next 'Catch 1.#QNAN
If ((l_dChartXs(r) > 1E+308) Or (l_dChartYs(r) > 1E+308)) Then
Else 'Value is not ridiculous
On Error GoTo 0
'Xs in first column
MainReturnValues(r, 1) = l_dChartXs(r)
'Ys in second column
MainReturnValues(r, 2) = l_dChartYs(r)
End If
Next r
LoadMainWorksheetFunctionReturnValues = True
Exit Function
Я надеюсь, что это кому-то поможет.
Существует много ситуаций, когда excel смущает и позволяет однократно использовать значение vba, которое не допускает его таким же образом в WB, но есть, поэтому при попытке открыть его появляется ошибка. OT: для меня произошло, когда VBA, я добавляю более 255 символов в список проверки, просто убедитесь, что вы не потеряете эти данные - при появлении ошибки он скажет вам, что, скорее всего, будет скомпрометировано. – Sgdva