用于提交条目的Access VBA弹出子窗体



以下是我得到的:我有一个Access表单,它接受条目,并在单击ENTER按钮时将它们放入表中。目前,我有一个弹出消息框,当点击按钮时会出现,要求他们确认他们的输入是否正常(你的标准弹出框,有ok和CANCEL选项)。这个弹出框出现在用户输入的数据的中间,对用户来说很不方便处理。

代替这个弹出消息框,我想出了使用弹出SUB-FORM的想法,它在ENTER按钮下是不可见的,并且在单击ENTER时会显示出来。(与消息框等选项相同,只是位置不同。制作"物理"子表单设计很容易)。既然这是一个新的表单/子表单,我该如何对其进行编码,使其像消息框一样工作?旧代码不起作用。这是我能想到的最好的主意。如果有更好的方法来实现这一点,我愿意接受建议。。。

这是一种非典型的方法,但不一定是错误的。我不明白你为什么需要sub_form的开销。也许只需创建一个普通表单(模态、无菜单控件、无边框等,只要你觉得合适)作为你的确认对话框,就可以使用DoCmd。从Save按钮打开Form(设置了模态属性),然后输入DoCmd。MoveSize可移动它,参数来源于按钮的位置。

DoCmd.MoveSize cmdSaveButton.Left + cmdSaveButton.Height + 10, etc.

主保存可以通过Popup表单调用原始表单中的方法,然后关闭自身来实现。

https://msdn.microsoft.com/en-us/vba/access-vba/articles/docmd-movesize-method-access

或者使用表单本身:

Form.Move Left:=11500, Top:=6500, Width:=7000, Height:=6000

如果您觉得有必要走这条路,我强烈建议您使用模式弹出窗体,我相信您可以指定其坐标,以便它在特定区域打开。根据用户屏幕分辨率的不同,可能会有细微差别,但我确信这会解决你的问题。您提出的子表单解决方案听起来非常不稳定。

尝试在中找到的此函数

http://www.excely.com/excel-vba/define-a-position-of-messagebox.shtml

Option Explicit
' Import
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function SetWindowPos Lib "user32" _
(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
' Handle to the Hook procedure
Private hHook As Long
' Position
Private msgbox_x As Long
Private msgbox_y As Long
' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1      ' Retains the current size
Private Const SWP_NOZORDER = &H4    ' Retains the current Z order
Sub TestMsgBox()
MsgBoxPos "Set non-Center Position", _
vbOKOnly, _
"Message Box Hooking", _
400, 300
End Sub
Public Sub MsgBoxPos(strPromt As String, _
vbButtons As VbMsgBoxStyle, _
strTitle As String, _
xPos As Long, _
yPos As Long)
' Store position
msgbox_x = xPos
msgbox_y = yPos
' Set Hook
hHook = SetWindowsHookEx(WH_CBT, _
AddressOf MsgBoxHookProc, _
0, _
GetCurrentThreadId)
' Run MessageBox
MsgBox strPromt, vbButtons, strTitle
End Sub
Private Function MsgBoxHookProc(ByVal lMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
If lMsg = HCBT_ACTIVATE Then
' Change position
SetWindowPos wParam, 0, msgbox_x, msgbox_y, _
0, 0, SWP_NOSIZE + SWP_NOZORDER
' Release the Hook
UnhookWindowsHookEx hHook
End If
MsgBoxHookProc = False
End Function

最新更新