Я попробую это в понедельник. Благодарю.

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

Я хотел бы знать, как программно с помощью VBA-кода перевести файл accdb или accde в это недоступное состояние.

Причина: я хотел бы распространить файл accde, который защищает себя от любого, кто крадет информацию о соединении odbc, например, пользователя и пароля сервера MySQL. Но таблицу Msysobjects можно импортировать в другой файл доступа.
Я могу создавать таблицы и запросы при запуске и удалять их при закрытии приложения, но как предотвратить импорт таблиц и запросов из него во время его работы?
Это недосягаемое состояние пригодится.
Если есть другой способ заблокировать импорт таблицы в другие файлы доступа, пожалуйста, дайте мне знать.

* Отредактированный раздел: *
Трюк с дизайном:

DoCmd.OpenForm "frmUnused",acDesign,,,,acHidden  

Работает с accdb, импорт таблиц заблокирован во время редактирования. Как и ожидалось, не работает с Accde.

Подход кеша соединений:
Работает с запросами.
ИСПРАВЛЕНО: Как бы я ни старался, пользователь и пароль были сохранены вместе с таблицей. Я предоставил строку подключения без имени пользователя и пароля, но она появилась в строке подключения после добавления tabledef к коллекции.
Метод A сохранил необеспеченный пароль, метод B работает только при ручном входе.

Примечания: Я знаю, что хранение имени пользователя и пароля в VBA внутри accde - не самый безопасный вариант, но ... 1. Создание нового пользователя на стороне сервера и назначение роли может быть мучительно медленным. (см. также: бюрократия) 2. Кроме того, передача учетных данных сервера нескольким тысячам пользователей упрощает социальную инженерию.
Const-значения, даже Private Const-значения, доступны для просмотра, если вы откроете файл accde в текстовом редакторе. Вместо этого используйте функции для отображения значений.

Фактический пользователь и пароль были заменены в тексте ниже.
LOGON PASS / FAIL и .Connect до / после копирования строк из вывода debug.print.

Я попробовал два варианта:

A: / предложено Альбертом Д. Каллалом /
* Удалите все таблицы и запросы, сожмите и восстановите, затем перезапустите приложение.
*? tabletest: testlogon с пользователем и pwd, затем AddOneTable (MyCon) без.
* LOGON PASS
* .Connect before = ODBC; DRIVER = {MySQL ODBC 5.3 Unicode Driver}; Сервер = localhost; База данных = mesterlista
* .Connect после = ODBC; DRIVER = {MySQL ODBC 5.3 Драйвер Unicode}; Сервер = localhost; База данных = mesterlista; пользователь =; Пароль =;
* >>Пользователь и пароль хранятся.
* Исправлено: после .append, заново отредактируйте .Connect & relink.

B: / работает с ручным входом в систему /
* Удалите все таблицы и запросы, сожмите и восстановите, затем перезапустите приложение.
* Окно конфигурации источника данных AddOneTable (MyCon) + MySQL, Connector / ODBC
* .Connect before = ODBC; DRIVER = {MySQL ODBC 5.3 Unicode Driver}; Сервер = localhost; База данных = mesterlista
* .Connect после = ODBC; Драйвер = MySQL ODBC 5.3 Драйвер Unicode; SERVER = localhost; DATABASE = mesterlista; PORT = 3306
* >>Обратите внимание, что {} исчез в имени драйвера, также появился PORT.
* перезапуск приложения
*? TestLogon ("ODBC; Драйвер = MySQL ODBC 5.3 Драйвер Unicode; SERVER = localhost; DATABASE = mesterlista; PORT = 3306" & "; user =; Пароль =«)
* Правда
* Таблица не работает, всплывающее окно конфигурации источника данных MySQL Connector / ODBC.
*? TestLogon ("ODBC; Драйвер = MySQL ODBC 5.3 Драйвер Unicode; SERVER = localhost; DATABASE = mesterlista; PORT = 3306") + Окно конфигурации источника данных MySQL Connector / ODBC, вход в систему вручную
* Правда
* Стол работает.
* >> Так что этот метод хорош, если вы хотите войти в систему вручную, но не работает с автоматическим входом.

Код VBA, используемый для тестирования:

Public Function tabletest()

  Dim MyConWithPassWord   As String
  Dim MyCon               As String

  MyCon = "ODBC;DRIVER={MySQL ODBC 5.3 Unicode Driver};Server=localhost;Database=mesterlista"
  MyConWithPassWord = MyCon & ";user=***;password=***"

   If TestLogon(MyConWithPassWord) = False Then
      Debug.Print "LOGON FAIL"
      Exit Function
   End If

   Debug.Print "LOGON PASS"
   AddOneTable (MyCon)

End Function

Public Function TestLogon(strCon As String) As Boolean

   On Error GoTo TestError

   Dim dbs          As DAO.Database
   Dim qdf          As DAO.QueryDef

   Set dbs = CurrentDb()
   Set qdf = dbs.CreateQueryDef("")

   qdf.Connect = strCon
   qdf.ReturnsRecords = False

   'Any VALID SQL statement that runs on server will work below.
   qdf.SQL = "SELECT 1;"
   qdf.Execute

   TestLogon = True

Exit Function

TestError:
   TestLogon = False

   Debug.Print Err.Number, Err.Description
   Debug.Print strCon

End Function


Public Function AddOneTable(strCon As String)
   On Error GoTo myerr

  Dim tdfcurrent As DAO.TableDef

  Dim LocalTable    As String      ' name of local table link
  Dim ServerTable   As String      ' name of table on SQL server

  LocalTable = "cimke"
  ServerTable = "cimke"

  Set tdfcurrent = CurrentDb.CreateTableDef(LocalTable)

  tdfcurrent.SourceTableName = ServerTable
  tdfcurrent.Connect = strCon

  Debug.Print ".Connect before = " & tdfcurrent.Connect

  CurrentDb.TableDefs.Append tdfcurrent

  CurrentDb.TableDefs.Refresh
  Debug.Print ".Connect after = " & CurrentDb.TableDefs(LocalTable).Connect

  ' fix: removing user / password from tabledef.connect:
  Set tdfcurrent = CurrentDb.TableDefs(LocalTable)
  tdfcurrent.Connect = strCon
  tdfcurrent.RefreshLink

  Debug.Print ".Connect after RELINK = " & CurrentDb.TableDefs(LocalTable).Connect



Exit Function

myerr:
   Debug.Print Err.Number, Err.Description
   Debug.Print strCon

End Function   

Ответы на вопрос(2)

Ваш ответ на вопрос