Використовуйте наступний модуль для автоматичного впровадження запропонованого рішення Microsofts (використовуючи запит замість таблиці). В якості запобіжних заходів спершу створіть резервну копію бази даних.
Використовуйте, AddWorkaroundForCorruptedQueryIssue()
щоб додати вирішення та RemoveWorkaroundForCorruptedQueryIssue()
видалити його в будь-який час.
Option Compare Database
Option Explicit
Private Const WorkaroundTableSuffix As String = "_Table"
Public Sub AddWorkaroundForCorruptedQueryIssue()
On Error Resume Next
With CurrentDb
Dim tableDef As tableDef
For Each tableDef In .tableDefs
Dim isSystemTable As Boolean
isSystemTable = tableDef.Attributes And dbSystemObject
If Not EndsWith(tableDef.Name, WorkaroundTableSuffix) And Not isSystemTable Then
Dim originalTableName As String
originalTableName = tableDef.Name
tableDef.Name = tableDef.Name & WorkaroundTableSuffix
Call .CreateQueryDef(originalTableName, "select * from [" & tableDef.Name & "]")
Debug.Print "OldTableName/NewQueryName" & vbTab & "[" & originalTableName & "]" & vbTab & _
"NewTableName" & vbTab & "[" & tableDef.Name & "]"
End If
Next
End With
End Sub
Public Sub RemoveWorkaroundForCorruptedQueryIssue()
On Error Resume Next
With CurrentDb
Dim tableDef As tableDef
For Each tableDef In .tableDefs
Dim isSystemTable As Boolean
isSystemTable = tableDef.Attributes And dbSystemObject
If EndsWith(tableDef.Name, WorkaroundTableSuffix) And Not isSystemTable Then
Dim originalTableName As String
originalTableName = Left(tableDef.Name, Len(tableDef.Name) - Len(WorkaroundTableSuffix))
Dim workaroundTableName As String
workaroundTableName = tableDef.Name
Call .QueryDefs.Delete(originalTableName)
tableDef.Name = originalTableName
Debug.Print "OldTableName" & vbTab & "[" & workaroundTableName & "]" & vbTab & _
"NewTableName" & vbTab & "[" & tableDef.Name & "]" & vbTab & "(Query deleted)"
End If
Next
End With
End Sub
'From https://excelrevisited.blogspot.com/2012/06/endswith.html
Private Function EndsWith(str As String, ending As String) As Boolean
Dim endingLen As Integer
endingLen = Len(ending)
EndsWith = (Right(Trim(UCase(str)), endingLen) = UCase(ending))
End Function
Ви можете знайти останній код у моєму сховищі GitHub .
AddWorkaroundForCorruptedQueryIssue()
додасть суфікс _Table
до всіх несистемних таблиць, наприклад, таблицю IceCreams
буде перейменовано вIceCreams_Table
.
Він також створить новий запит, використовуючи оригінальну назву таблиці, яка вибере всі стовпці перейменованої таблиці. У нашому прикладі запит буде названо IceCreams
і виконало б SQL select * from [IceCreams_Table]
.
RemoveWorkaroundForCorruptedQueryIssue()
чинить зворотні дії.
Я перевірив це з усіма типами таблиць, включаючи зовнішні таблиці, що не мають MDB (наприклад, SQL Server). Але майте на увазі, що використання запиту замість таблиці може призвести до неоптимізованих запитів, що виконуються із базовою базою даних у конкретних випадках, особливо якщо ваші оригінальні запити, які використовували таблиці, мають низьку якість або дуже складні.
(І звичайно, залежно від вашого стилю кодування, ви також можете порушити речі у вашій програмі. Тож після перевірки, що виправлення, як правило, працює на вас, ніколи не є поганою ідеєю експортувати всі ваші об’єкти як текст та використовувати замість пошуку магія забезпечити, що будь-які випадки використання імен таблиць будуть запущені проти запитів, а не таблиць.)
У моєму випадку, це виправлення працює в основному без будь - яких побічних ефектів, мені просто потрібно вручну перейменувати USysRibbons_Table
назад USysRibbons
, так як я не помітив його як системну таблицю , коли я створив його в минулому.