访问 VBA 弹出子表单以提交条目
Posted
技术标签:
【中文标题】访问 VBA 弹出子表单以提交条目【英文标题】:Access VBA Pop Up Sub Form for Submission of Entries 【发布时间】:2017-11-15 21:34:22 【问题描述】:这是我得到的: 我有一个接受条目的 Access 表单,并在单击 ENTER 按钮时将它们放入表中。目前,当单击按钮时,我会弹出一个消息框,要求他们确认他们的条目是否正常(您的标准弹出框,带有 OK 和 CANCEL 选项)。这个弹出框出现在用户输入的数据中间,用户处理起来很不方便。
代替这个弹出消息框,我想出了使用弹出 SUB-FORM 的想法,它会在 ENTER 按钮下方不可见,并且在单击 ENTER 时会出现。 (与消息框等选项相同,只是位置不同。制作“物理”子表单设计是不费吹灰之力)。由于这是一个新的表单/子表单,我将如何对其进行编码以使其像消息框一样工作?旧代码不起作用。这是我能想到的最好的主意。如果有更好的方法来实现这一点,我愿意接受建议......
【问题讨论】:
创建一个普通表单,将其弹出和模式属性设置为yes,在加载时移动它DoCmd.MoveSize
并处理OK - Cancel 按钮事件。互联网上有大量示例可以帮助您入门。
【参考方案1】:
这是一种非典型的方法,但不一定是错误的。我不明白为什么你需要 sub_form 的开销。也许只是创建一个普通表单(模态,没有菜单控件,没有边框等,无论您看起来如何)作为您的确认对话框,使用您的保存按钮中的 DoCmd.OpenForm 打开(使用模态属性集) ,然后是一个 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
【讨论】:
这似乎是要走的路。非典型的,正如你所说,是的。但如果它有效,我很好。谢谢!【参考方案2】:如果您觉得有必要走这条路,我强烈建议您使用模式弹出式表单,我相信您可以指定其坐标,以便它在特定区域打开。根据用户的屏幕分辨率可能会有细微差别,但我很确定这会解决您的问题。您提出的子表单解决方案听起来很不稳定。
【讨论】:
【参考方案3】:试试这个功能:
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
【讨论】:
以上是关于访问 VBA 弹出子表单以提交条目的主要内容,如果未能解决你的问题,请参考以下文章
通过弹出子表单 (2) 添加新子表单 (1) 记录后重新查询子表单 (1) - Access 2007
为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?