必须更新此项目中的代码以在64位系统上使用

时间:2019-06-16 14:45:02

标签: vba ms-access access-vba office-2007

很长一段时间以来,我们一直在Windows 7中使用MS Access数据库(Office 2007,32位),但是最近我们切换到了64位Office 2016。

现在每个表格都显示以下消息,这确实很烦人:

this message

此外,“访问”窗口没有最小化。我不是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位中它已完全打开。请帮助我隐藏64位版本的MS Access窗口。

2 个答案:

答案 0 :(得分:2)

未经广泛测试即可升级公司软件是业余的!

但是,如果该错误消息是唯一的问题,那么您很幸运。您需要将api参数声明转换为x64,这通常意味着将所有Long句柄和指针的声明更改为LongPtr,并在声明后添加PtrSafe。

对于条件编译器(#If VBA7 Then),Office 2010和更高版本使用第一部分,因为它们支持VBA7(LongPtr),Office 2007和更低版本将else部分与旧的声明一起使用。

#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

可以在Declaring API Functions In 64 Bit Office上找到它。 似乎您不使用x86 ActiveX控件或ODBC连接,因为它们也会引起麻烦。

您应该阅读Compatibility Inspector user's guide来为更多的麻烦做准备;)

答案 1 :(得分:1)

我同意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