Excel 2016 VBA код падает после того, как пара использует - PullRequest
1 голос
/ 05 февраля 2020

edit Проблема в том, что Microsoft KB4484218 удалена, и все, кажется, работает как обычно <_ <. </p>

Первый постер, но долгое время скрывается. Долгая публикация впереди.

У нас есть инструмент цитирования в Excel, который использует код VBA для сравнения введенных кодов продуктов с базой данных Access, база данных basi c ничего необычного, а затем обновляет другой лист с данными, необходимыми для нашего CRM система. Это временное решение, пока не станет доступным более постоянное. Проблема заключается в том, что мы можем захватить 5 цитат, сгенерировать лист CRM, и все в порядке, но на 6-й цитате, когда вы генерируете лист CRM, появляется следующая ошибка VBA.

System Error & H8000FFF ( -2147418113)

Google не сильно помог, и мой уровень кодирования - базовый c, поэтому я снимаю в темноте с исправлениями, которые я пробовал, увеличьте размер буфера, очистите буфер обмена - основные исправления я уже пробовал. Удаление буфера в целом приводит к ошибке почти сразу.

Что я нашел с помощью процесса отладки Step Into, так это то, что cra sh будет происходить в части кода cn.Open, поэтому он пытается чтобы открыть соединение с Access.

Function CRM_Update(PROD As String)
Application.ScreenUpdating = False

    If PROD = "" Then
        emptyline = emptyline + 1
        Exit Function
    Else
            emptyline = 0
    End If
    Set cn = New ADODB.Connection
    cn.ConnectionString = "DSN=MS Access Database;DBQ=C:\database\CRMSA.accdb;DriverId=25;FIL=MS Access;MaxBufferSize=4096;PageTimeout=5;"
    cn.Open
    Set rs = New ADODB.Recordset**
    rs.Open "select * from ARTGROUP WHERE  ART = '" & PROD & "';", cn, adOpenStatic
    If rs.RecordCount = 0 Then
        MsgBox (PROD & "  " & " not found in article group")
        Exit Function
    End If

Это похоже на использование памяти, потому что вы можете углубиться в процесс генерации, если у вас очень мало открытых, но как только у вас открыто много элементов : Chrome, Outlook и другие приложения, которые вы можете получить, возможно, 5 попыток генерации. На виртуальной машине с 4 ГБ ОЗУ я смог выполнить этот процесс более 40 раз без единого крейса sh. На моем рабочем ноутбуке с 16 ГБ ОЗУ и только этим открытым я смог генерировать около 16 раз, прежде чем эта ошибка возникнет. Другая интересная информация - это то, что показывает журнал событий:

The system has called a custom component and that component has failed
and generated an exception. This indicates a problem with the custom
component. Notify the developer of this component that a failure has
occurred and provide them with the information below. Component Prog
ID: SC.Pool 455 1 Method Name: IDispenserDriver::CreateResource
Process Name: EXCEL.EXE Exception: c0000005 Address: 0X58101018

Я удалил все пользовательские надстройки и все еще получаю этот cra sh. У меня есть только следующие ссылки на MS на листе, а именно:

VB for Applications
MS Excel 16.0 Object Library
OLE Automation
MS Office 16.0 Object Library
MS Access 16.0 Object Library
Microsoft ActiveX Data Objects 2.8 Library

У кого-нибудь есть идеи относительно того, что происходит? Я также попытался перестроить базу данных, сжать, восстановить и декомпилировать, но это не имеет никакого эффекта. Я белый список базы данных в AV-программе без изменений.

edit

Хорошо. Итак, я попытаюсь разбить это редактирование на 3 части для удобства чтения. Модуль 1 - первый скрипт VB, который, я думаю, открывает базу данных Access. Модуль 2 - это сценарий VB, в котором ячейка A на рабочем листе A отправляется в ячейку A на рабочем листе B, он также открывает соединение с базой данных Access, но я не включил формулу для движущейся части. Есть третий модуль, который сравнивает данные из листа Excel с базой данных Access, а затем назначает коды продуктов, которые, я не думаю, что это проблема, но я опубликую, если два других ничего не обнаружат.


Модуль 1:

Public Function CRM_shortDescr(PROD As String)
Application.ScreenUpdating = False
    Set cn = New ADODB.Connection
    cn.ConnectionString = "DSN=MS Access Database;DBQ=C:\database\CRMSA.accdb;DriverId=25;FIL=MS Access;MaxBufferSize=4096;PageTimeout=5;"
    '   The database name was set incorrectly here. Changed to correct name.
    cn.Open
    Set rs = New ADODB.Recordset
    rs.Open "select * from ARTGROUP WHERE  ART = '" & PROD & "';", cn, adOpenStatic
    If rs.RecordCount = 0 Then
        MsgBox (PROD & "  " & " not found in article group")
        Exit Function
    End If
    PRGR = rs!crm
    rs.Close
    rs.Open "select * from PRGR WHERE  PRGR = '" & Left(PRGR, 2) & "';", cn, adOpenStatic
    If rs.RecordCount = 0 Then
        MsgBox (PRGR & "  " & " not found in article group")
        Exit Function
    End If
    CRM_shortDescr = rs!Descr
    rs.Close
End Function

На самом деле модуль 2 - это тот, который указан выше в начале запроса о помощи, отсутствующие строки:

    italyrow = 19 + emptyline
        linenumber = ActiveCell.Row
        linenumbercrm = linenumber - italyrow
    <Formual starts to move from Sheet A to Sheet B but looks like the following
`Worksheets("CRM").Cells(linenumbercrm, 1).Value = Worksheets("Local Quotation").Range("COUNTRY")>
    rs.Close
    End Function

Надеюсь, это поможет:).

1 Ответ

1 голос
/ 18 февраля 2020

Проблема, похоже, решена и не имеет ничего общего с кодом <_ <. <a href="https://support.microsoft.com/en-za/help/4484218/january-7-2020-update-for-office-2016-kb4484218" rel="nofollow noreferrer"> KB4484218 - виновник, который каким-то образом все ломает.

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