Excel Application.InputBox位置

Nic*_*ash 1 excel vba

使用此功能的顶部和左侧参数是否有中心屏幕选项,或者它始终是一个数字?

我正在使用它而不是常规输入框,因为它更好地处理取消事件,但它总是出现在屏幕的右下角,这不太有用:/

Dou*_*ncy 7

没有中央屏幕选项.你必须计算它.但是,假设您使用的是Excel 2007或更高版本,还有另一个问题......

这对我来说是新闻,但在谷歌搜索和测试中,我看到在Excel 2007和2010 Application.Inputbox中恢复到它的最后位置,忽略了Top和Left设置.即使从新工作表调用新的Inputbox,此问题似乎仍然存在.当我在XL 2​​003中尝试它时它可以正常工作,并且Inputbox被放置在正确的左右坐标上.

您可以将输入框拖动到所需位置,然后保存.除非有人在以后拖动它,否则它将在同一个地方重新打开.

这是一个解决方案链接,可以帮助某人恢复正确的行为,并解决输入框的居中问题.它确实需要API调用,因此请在尝试之前保存您的工作.

编辑 - 根据JMax的评论,这里是上面链接的代码.这是由vbforums.com网站上名为KoolSid的用户:

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

'~~> 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

Dim InputboxTop As Long, InputboxLeft As Long

Sub TestInputBox()
    Dim stringToFind As String, MiddleRow As Long, MiddleCol As Long

    hHook = SetWindowsHookEx(WH_CBT, _
    AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)

    '~~> Get the center cell (keeping the excel menus in mind)
    MiddleRow = ActiveWindow.VisibleRange.Rows.Count / 1.2
    '~~> Get the center column
    MiddleCol = ActiveWindow.VisibleRange.Columns.Count / 2

    InputboxTop = Cells(MiddleRow, MiddleCol).Top
    InputboxLeft = Cells(MiddleRow, MiddleCol).Left

    '~~> Show the InputBox. I have just used "Sample" Change that...
    stringToFind = Application.InputBox("Sample", _
    "Sample", "Sample", InputboxLeft, InputboxTop, , , 2)
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, InputboxLeft, InputboxTop, _
        0, 0, SWP_NOSIZE + SWP_NOZORDER

        '~~> Release the Hook
        UnhookWindowsHookEx hHook
    End If

    MsgBoxHookProc = False
End Function
Run Code Online (Sandbox Code Playgroud)

  • 您可以在引用来源时发布工作代码.这样,即使链接的网站关闭(或更改其网址),答案仍将在此处 (2认同)