динамически удалять строки из каждой таблицы внутри цикла for в доступе VBA - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь сопоставить файлы Excel, которые помещены в папку, с таблицами, которые существуют в базе данных доступа (с тем же именем, что и мои файлы Excel), и пытаюсь импортировать данные, к которым у Excel есть доступ.

Sub import()

Dim blnHasFieldNames As Boolean
Dim strWorksheet As String, strTable As String
Dim strPath As String, strPathFile As String

blnHasFieldNames = True


strPath = "D:\PersonalData\working_table\"

strWorksheet = "Sheet1"

' Import the data from each workbook file in the folder
strFile = Dir(strPath & "*.xlsx")
Do While Len(strFile) > 0
      strPathFile = strPath & strFile
      strTable = Left(strFile, InStrRev(strFile, ".xlsx") - 1)

      DoCmd.TransferSpreadsheet acImport, _
            acSpreadsheetTypeExcel9, strTable, strPathFile, _
            blnHasFieldNames, strWorksheet & "$"

      DoCmd.RunSQL ("DELETE * FROM " & strTable & " WHERE SPEC_ID = 'Specification ID'")



      strFile = Dir()
Loop



End Sub

Я успешно могу получить данные в свои таблицы базы данных доступа, однако мое требование состоит в том, чтобы удалить строку из всех таких таблиц, где SPEC_ID = 'Specification ID'. Я получаю сообщение об ошибке:

DoCmd.RunSQL ("DELETE * FROM " & strTable & " WHERE SPEC_ID = 'Specification ID'")

которая гласит:

Ошибка времени выполнения: «3131» Синтаксическая ошибка в предложении FROM.

Пожалуйста, объясните мне, что я, возможно, делал неправильно.

Заранее спасибо.

Ответы [ 2 ]

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

Использование DoCmd.SetWarnings - рецепт неприятностей. Что если в sql есть ошибка, и ваш код завершает работу, не устанавливая предупреждения обратно в true? Происходит всякое странное. Вместо этого используйте более простой и простой

CurrentDb.Execute "DELETE * FROM [" & strTable & "] WHERE SPEC_ID = 'Specification ID'"

Вам все равно нужно будет проверить, что в имени strTable нет [ или ] в имени (в противном случае брекетинг не будет действовать), и вам придется либо удалить их, либо экранировать их (в зависимости от о том, как называется ваша фактическая таблица).

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

делай так

Docmd.SetWarnings False

DoCmd.RunSQL ("DELETE * FROM [" & strTable & "] WHERE SPEC_ID = 'Specification ID'")

Docmd.SetWarnings True
...