Код в этом проекте должен быть обновлен для использования на 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