访问 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 弹出子表单以提交条目的主要内容,如果未能解决你的问题,请参考以下文章

提交表单时VBA访问新记录

通过弹出子表单 (2) 添加新子表单 (1) 记录后重新查询子表单 (1) - Access 2007

为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?

更改数据库数据或重新查询后访问 2007 VBA 列表框滞后

访问VBA:从另一个表单获取复选框的价值

访问 VBA。检测记录集条目是不是会溢出