Получите доступ к ошибке выполнения VBA 3078 или Несоответствие типов в функции DCount - PullRequest
0 голосов
/ 11 сентября 2018

Цель: я создаю код VBA для фильтрации через таблицу адресов SunstarAccountsInWebir_SarahTest . Я хочу сначала пройтись по нему и посмотреть, является ли адрес «действительным».

  • Если это не верно - экспортировать в другую таблицу.
  • Если он действителен - он вводит другой вложенный if / then в «допустимые» строки адреса:
    • Если их идентификатор external_nmad_id совпадает с идентификатором второй таблицы 1042s_FinalOutput_7 , я хочу обновить один из столбцов во второй таблице box13c_Address .
    • Если он не совпадает с идентификатором второй таблицы - он будет экспортирован в другую таблицу.

Моя проблема в том, что когда я запускаю свой код, он возвращает

Ошибка выполнения 3078: не удается найти таблицу или запрос

(это разрыв в строке, где я сравниваю значение ячейки (в виде строки) с DCount таблицы 2). Если я удаляю кавычки вокруг него, я получаю другую ошибку:

Несоответствие типов с DCount

Я чувствую, что упускаю что-то простое, но не могу сказать, что. Как я могу получить свой код для сопоставления строкового значения, вызываемого в !external_nmad_id, с остальной частью таблицы, вызываемой в моей строке? DCount("[ID]", StrSQL1)

Public Sub EditFinalOutput2()

'set variables
Dim i As Long
Dim qs As DAO.Recordset
Dim ss As DAO.Recordset
Dim StrSQL1 As DAO.Recordset
Dim IRSfileFormatKey As String
Dim external_nmad_id As String
Dim nmad_address_1 As String
Dim nmad_address_2 As String
Dim nmad_address_3 As String
Dim mytestwrite As String

'open reference set
Set db = CurrentDb
Set qs = db.OpenRecordset("SunstarAccountsInWebir_SarahTest")
'Set ss = db.OpenRecordset("1042s_FinalOutput_7")
'Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID 
'FROM 1042s_FinalOutput_7;")

With qs.Fields
intCount = qs.RecordCount - 1
For i = 0 To intCount

    If (IsNull(!nmad_address_1) Or (!nmad_address_1 = !nmad_city) Or (!nmad_address_1 = !Webir_Country) And IsNull(!nmad_address_2) Or (!nmad_address_2 = !nmad_city) Or (!nmad_address_2 = !Webir_Country) And IsNull(!nmad_address_3) Or (!nmad_address_3 = !nmad_city) Or (!nmad_address_3 = !Webir_Country)) Then
    DoCmd.RunSQL "INSERT INTO Addresses_ToBeReviewed SELECT SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & qs!external_nmad_id & "'));"

    Else:
        Set ss = db.OpenRecordset("1042s_FinalOutput_7")
        Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;")
        If !external_nmad_id = DCount("[ID]", StrSQL1) Then
                ss.Edit
                ss.Fields("box13c_Address") = qs.Fields("nmad_address_1") & qs.Fields("nmad_address_2") & qs.Fields("nmad_address_3")
                ss.Update

        Else:   DoCmd.SetWarnings False
                DoCmd.RunSQL "INSERT INTO Addresses_NotUsed SELECT SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & qs!external_nmad_id & "'));"
                DoCmd.SetWarnings True
        End If

    End If

qs.MoveNext
Next i

End With

'close reference set
qs.Close
Set qs = Nothing
ss.Close
Set ss = Nothing

End Sub

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Проблема в том, что функция DCount не может работать напрямую с набором записей.

Вы объявляете StrSQL1 в качестве объекта RecordSet и устанавливаете его в RecordSet на основе вашего оператора Select.

Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;")

Затем вы пытаетесь передать этот RecordSet в функцию DCount, которая не может принять объект RecordSet в качестве параметра Domain. Как вы можете видеть в MSDN, функция DCount требует параметр String во второй позиции, чтобы определить «запрос», который вы хотите «считать». Отсюда ошибка 3078. Когда вы удаляете кавычки вокруг [ID] в вашей строке DCount, вы получаете Несоответствие типов как ошибку компиляции, потому что [ID] не является строковой или строковой переменной.

После того, как вы решите это, вы можете пересмотреть свое заявление If. Вы не предоставили пример того, какое значение будет содержать !external_nmad_id, кроме того факта, что это строковое значение. Функция DCount будет возвращать количество строк, найденных в Домене (запрос), которое вы сказали ему подсчитать, так что, похоже, вы будете сравнивать строку (которая может содержать буквенные символы) с числом. Access неявно преобразует числовой результат DCount в строку для сравнения, но если ваша строка !external_nmad_id действительно 10 символов или содержит буквенные символы, они никогда не будут совпадать.

0 голосов
/ 11 сентября 2018

Нельзя использовать набор записей VBA внутри агрегата домена, например DCount, поскольку строковый литерал требуется для аргумента имени таблицы / запроса.Просто сохраните ваш запрос и затем укажите его по имени в DCount.

SQL (сохранить как запрос)

SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;

VBA

If !external_nmad_id = DCount("[ID]", "mySavedQuery") Then
   ...
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...