访问VBA弹出子表单以提交参赛作品

时间:2017-11-15 21:34:22

标签: vba ms-access

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

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

3 个答案:

答案 0 :(得分:0)

如果您认为有必要采用这种方式,我强烈建议您使用模式弹出窗体,我认为您可以指定其坐标,以便在特定区域打开。可能会有细微差别取决于用户的屏幕分辨率,但我很确定这将解决您的问题。你提出的子窗体解决方案听起来非常摇摇晃晃。

答案 1 :(得分:0)

尝试使用以下功能:

  

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

答案 2 :(得分:0)

这是一种非典型的方法,但不一定是错误的方法。我不明白为什么你需要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