Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft Access |
![]() ![]() |
Павел Фурсов Member Откуда: Украина Сообщений: 111 |
Всем привет. В очередной раз столкнулся с ошибками после обновления Windows. На этот раз "зацепило" массивы, а именно пустые массивы ParamArray. Для примера сформируем такой массив с помощью простой функции: Private Function ParamArray_Variant(ParamArray Params()) ParamArray_Variant = Params End FunctionКонечно можно работать с Params напрямую. Но я буду использовть эту функцию только для того, чтобы сформировать нужный массив. Пусть далее будет:
Dim v
v = ParamArray_Variant
Для v:
Теперь определим простой массив и попробуем сделать то же самое действие: Dim a() a = ParamArray_Variant 'Здесь нас ждет сюрприз в виде ошибки 5 "Invalid procedure call or argument". Но если ParamArray массив не пустой, то все хорошо: Dim b() b = ParamArray_Variant(1) 'ОК Теперь нельзя просто взять и присвоить обычному массиву значение произвольного массива ParamArray. Нужно обязательно проверять на IsMissing. Например так: Dim a() Dim v: v = ParamArray_Variant If Not VBA.IsMissing(v) Then a = v Проблемные обновления вышли 13.08.2019 на всех платформах, включая Windows 10. Скорее всего был затронут код в oleaut32.dll. С уважением, Павел |
15 авг 19, 11:52 [21949947] Ответить | Цитировать Сообщить модератору |
MrShin Member Откуда: Сообщений: 1293 |
До меня, скорее всего, обновление еще не дошло, поэтому все работает. Для работы с массивами параметров использую такую функцию, она всегда возвращает массивPublic Function ParamArrayDelegated(ParamArray prms() As Variant) As Variant Dim arrPrms() As Variant, arrWrk() As Variant 'When prms(0) is Array, supposed is delegated from another function On Error GoTo ErrorHandler arrPrms = prms If UBound(arrPrms) >= 0 Then Do While VarType(arrPrms(0)) >= vbArray And UBound(arrPrms) < 1 arrWrk = arrPrms(0) arrPrms = arrWrk If UBound(arrPrms) < 0 Then Exit Do End If Loop End If ParamArrayDelegated = arrPrms ExitHere: Exit Function ErrorHandler: Debug.Assert Not (STOP_AT_ERROR And IS_DEV) '>> remove in release Err.Raise Err.Number, "ParamArrayDelegated of bas_Utilities", Err.Description & vbCrLf & "in ParamArrayDelegated of bas_Utilities at " & Erl Resume '>> remove in release End Function |
16 авг 19, 05:42 [21950644] Ответить | Цитировать Сообщить модератору |
an45liz Member Откуда: Сообщений: 3 |
https://support.microsoft.com/ru-ru/help/4512506/windows-7-update-kb4512506 изучают проблему: After installing this update, applications that were made using Visual Basic 6 (VB6), macros using Visual Basic for Applications (VBA), and scripts or apps using Visual Basic Scripting Edition (VBScript) may stop responding and you may receive an "invalid procedure call error." |
16 авг 19, 06:32 [21950648] Ответить | Цитировать Сообщить модератору |
Павел Фурсов Member Откуда: Украина Сообщений: 111 |
Здравствуйте. В статье Sudden “Invalid procedure call or argument” error in VBA описаны различные варианты использования пустых массивов в VBA, которые после обновлений Windows перестали работать. Также есть есть ссылки на патчи. Windows 10 1903 патча пока не имеет. Основные рекомендации - откатить обновления, подождать новые версии обновлений без этих ошибок. Также вы можете установить доступные патчи, которые уже выпущены. В моем случае ошибку можно обойти, внеся изменение в исходный код. Но чтобы не остановились рабочие процессы, пришлось сразу откатить обновления Windows. С уважением, Павел |
29 авг 19, 17:36 [21960037] Ответить | Цитировать Сообщить модератору |
Павел Фурсов Member Откуда: Украина Сообщений: 111 |
Здравствуйте, Наконец-то выпущено обновление и под Windows 10 1903. August 30, 2019—KB4512941 (OS Build 18362.329) С уважением, Павел |
30 авг 19, 23:20 [21960959] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft Access | ![]() |