Не отображается в списке ошибок после замены Chr (), но добавлен в список правильно - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть несколько комбинированных списков с кодом для добавления новых элементов в исходную таблицу с формой, когда она не существует.

Код заменит Chr (47) / и Chr (92) \ на Chr (45) - если присутствует. Это сделано потому, что имя файла создается с использованием конкатенации позже.

Проблема в том, что если заменить символ, я получаю сообщение об ошибке Access, что элемент отсутствует в списке. Этого не происходит, если персонаж не заменен. В обоих случаях правильные позиции добавляются в соответствующие таблицы.

Я пытался заменить символ перед передачей его в OpenArgs, AfterUpdate, в форме после его открытия и т. Д. Ошибка не прерывается, поэтому программа работает, я просто хочу удалить ненужное всплывающее сообщение.

Любая помощь очень ценится.

Private Sub cboManual_NotInList(NewData As String, Response As Integer)
    Dim MyMessage As String
    Dim myButtons As Integer
    Dim myTitle As String
    Dim strSQL As String

On Error GoTo ErrHandler

MyMessage = "This Manual does not exist. Create it?"
myButtons = vbYesNo + vbDefaultButton1 + vbQuestion + vbApplicationModal
myTitle = "Add Manual?"
MyChoice = MsgBox(MyMessage, myButtons, myTitle)

If MyChoice = 6 Then
    If Not DBAuthority = "Admin" And Not DBAuthority = "Data Entry" Then
        Response = acDataErrContinue
        MsgBox "Sorry, authorized access only", _
               vbOKOnly, "Important Information"
        Exit Sub
    Else
        Response = acDataErrAdded
        CallerField = "Manual"
        CallerForm = "NewDocument"
        NewData = Replace(NewData, Chr(47), Chr(45))
        NewData = Replace(NewData, Chr(92), Chr(45))
        DoCmd.OpenForm "AddManual", windowmode:=acDialog, OpenArgs:=NewData
        Me.cboManual.RowSource = Me.cboManual.RowSource
        Me.cboManual.value = strAddManual
        strManual = Me.cboManual.value
        strAddManual = vbNullString
        Me.cboSection.value = strAddSection
        strSection = Me.cboSection.value
        strAddSection = vbNullString
        Me.cboEngine.value = strAddEngine
        strEngine = Me.cboEngine.value
        strAddEngine = vbNullString
    End If
ElseIf MyChoice = 7 Then
    Response = acDataErrContinue
    MsgBox "Select Manual from list.", vbOKOnly, "Select Manual"
    Me.cboManual.Undo
    Me.cboManual.SetFocus
    Exit Sub
End If
Exit Sub

ErrHandler:
    If Err = 20 Then
        Response = acDataErrContinue
    ElseIf Err = 94 Then
        Response = acDataErrContinue
        Resume Next
    ElseIf Err = 2237 Then
        Response = acDataErrContinue
        Resume Next
    ElseIf Err = 0 Then
        Response = acDataErrContinue
    Else
        MsgBox "cboManual.NotInList Err = " & Err.Number & " :" &     Err.Description
        Exit Sub
    End If
    Exit Sub
End Sub

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вариант один Заменить при наборе

Select Case KeyCode
        Case vbKeyDown
            Me![cboNewPart].Dropdown
        Case 220, 191 ' / and \
            KeyCode = 189 ' with -
        Case Else
    End Select

Вариант два после добавления нового значения в таблицу. сделать

me.combo.undo, me.combo.requery. me.combo.value = newValue

, за которым следует acDataErrContinue таким образом, вы не получите сообщение об ошибке, но список будет мигать, и это просто взлом.

0 голосов
/ 14 ноября 2018

Попробуйте использовать другое имя переменной (отличное от NewData), чтобы сохранить измененную версию значения, переданного аргументу NewData, т. Е .:

Dim NewString as String
NewString = NewData
NewString = Replace(NewString, Chr(47), Chr(45))
NewString = Replace(NewString, Chr(92), Chr(45))
DoCmd.OpenForm "AddManual", windowmode:=acDialog, OpenArgs:=NewString

Поскольку аргументы VBA передаются ByRef, если не указано иное, любая модификация значения аргумента будет модифицировать исходное значение, передаваемое в ваш cboManual_NotInList обработчик события.


Учитывая вышесказанное, вы можете альтернативно попробовать изменить аргумент NewData, передаваемый по значению (ByVal):

Private Sub cboManual_NotInList(ByVal NewData As String, Response As Integer)
...