Код в этом проекте должен быть обновлен для использования на 64-битных системах

Мы давно используем базу данных MS Access (Office 2007, 32bit) в Windows 7, но недавно мы перешли на Office 2016, 64 bit.

Теперь каждая форма отображает следующее сообщение, и это действительно раздражает:

это сообщение

Кроме того, окно доступа не становится свернутым. Я не эксперт в VBA и не знаю, что делать. Я вставляю коды. Пожалуйста, не предлагайте какую-либо статью или документацию, предоставленную Microsoft. Я пытался понять это много и потерпел неудачу.

Используемый код:

Option Compare Database
Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

А также:

Private Sub Form_Load()
    Application.RunCommand (acCmdAppRestore)
    SetWindowPos Application.hWndAccessApp, 0, 0, 0, 0, 0, 0
    Application.DoCmd.MoveSize 0, 0
End Sub

Ранее (в 32-битном офисе) окно доступа раньше было скрыто при загрузке формы, но теперь в 64-битном оно широко открыто. Пожалуйста, помогите мне скрыть окно MS Access в 64-битной версии.

2 ответа

Модернизация программного обеспечения компаний без обширного тестирования является дилетантской!

Но если это сообщение об ошибке является единственной проблемой, вам повезло. Вам нужно преобразовать объявление аргументов API в x64, что обычно означает изменить всеLongобъявления ручек и указателей на LongPtrи добавить PtrSafe после объявления.

С условным компилятором (#If VBA7 Then) Office 2010 и более поздние версии используют первую часть, поскольку они поддерживают VBA7 (LongPtr), Office 2007 и более ранние версии, а остальную часть используют со старым объявлением.

#If VBA7 Then
    Private Declare PtrSafe Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#Else
    Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#End If

Это можно найти в разделе Объявление функций API в 64-разрядной версии Office. Похоже, вы не используете элементы управления x86 ActiveX или соединения ODBC, потому что они тоже вызывают проблемы.

Вы должны прочитать руководство пользователя Инспектора совместимости, чтобы подготовиться к новым неприятностям;)

Я согласен с ComputerVersteher для первой части, поэтому я отвечу на вторую часть вашего вопроса. Вы можете сделать форму невидимой, сделав это:

Private Sub Form_Load()
    'this turns the forms timer event on every 1 milisecond
    Me.TimerInterval = 1
End Sub

Private Sub Form_Timer()
    Me.Visible = False
    'this turns the timer event off so you don't waste CPU power
    Me.TimerInterval = 0
End Sub
Другие вопросы по тегам