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

我使用它而不是常规输入框,因为它可以更好地处理cancel事件,但它始终显示在屏幕的右下角,对您的帮助不大:/

===============>>#1 票数:7

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

这对我来说是个新闻,但是在谷歌搜索和测试中,我发现在Excel 2007和2010 Application.Inputbox中,无论“顶部”和“左侧”设置如何,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

===============>>#2 票数:2 已采纳

您可以测试常规输入框以查看是否按下了取消键,并且它具有始终居中的额外好处。 只需使用StrPtr(variable)= 0对其进行测试。 简单!

避免用户单击“ OK”而不键入任何内容的另一种方法是在输入框内添加一个默认值开始,即您知道如果它返回一个空字符串,则很可能是由于按下了“取消”按钮。

如果选择了取消,StrPtr将返回0(对于vbNullString,btw也返回0)。 请注意,StrPtr可在VB5,VB6和VBA中使用,但由于尚未得到官方的支持,因此可能会在几年后变得无用。 我非常怀疑他们会摆脱它,但是如果您打算分发该应用程序,则值得考虑。

Sub CancelTest()

Dim temp As String

temp = InputBox("Enter your name", "Cancel Test")
If StrPtr(temp) = 0 Then
    ' You pressed cancel
Else
    If temp = "" Then
        'You pressed OK but entered nothing
    Else
        'Do your thing
    End If
End If

End Sub

有关strptr的更多信息: StrPtr(S)返回指向当前存储在S中的实际字符串数据的指针。这是将字符串传递给Unicode API调用时所需的。 您获得的指针指向数据字符串字段,而不是长度前缀字段。 在COM术语中,StrPtr返回BSTR指针的值。 (来自出色的网站: http : //www.aivosto.com/vbtips/stringopt2.html

===============>>#3 票数:0

' assume normal screen  else go through GetDeviceCaps(hDCDesk, LOGPIXELSX) etc etc
' 1440 twips / inch  pts / pix = 3/4  inch 100 pts
'  so twips / pixel = 15

Sub GetRaXy(Ra As Range, X&, Y&)    ' in twips
    Dim ppz!
    ppz = ActiveWindow.Zoom / 75  '  zoom is %   so   100 * 3/4  =>75
' only  the pixels of rows and columns are zoomed 
  X = (ActiveWindow.PointsToScreenPixelsX(0) + Ra.Left * ppz) * 15
  Y = (ActiveWindow.PointsToScreenPixelsY(0) + Ra.Top * ppz) * 15
End Sub

Function InputRealVal!(Optional RaTAdd$ = "K11")
Dim IStr$, RAt As Range, X&, Y&
Set RAt = Range(RaTAdd)
    GetRaXy RAt, X, Y
    IStr = InputBox(" Value ", "ENTER The Value ", 25, X, Y)
    If StrPtr(IStr) = 0 Then
        MsgBox "Cancel Pressed"
        Exit Function
    End If
    If IsNumeric(IStr) Then
        InputRealVal = CDec(IStr)
    Else
        MsgBox "Bad data entry"
        Exit Function
    End If
End Function

  ask by NickSlash translate from so

未解决问题?本站智能推荐:

2回复

Excel VBA application.inputbox工作簿

我试图从excel中的Application.InputBox命令获取工作簿和工作表的名称,以便可以在Active Workbook和已从使用应用程序选择值的工作簿之间进行切换。 我的代码可以很好地选择值作为范围,所以我不想更改它。 这是我所拥有的: 我不确定要为“ ???”
1回复

Excel 2007中的Application.InputBox方法

几年前,使用Excel 97,我编写了一个使用它的VBA程序 用户在打开的工作簿/工作表中选择单元格的方法。 这当然没有问题,但现在我正在修改Excel 2007的程序,它只在用户输入A1格式地址时才有效。 它不允许用户在打开的工作簿和工作表中移动,或滚动工作表,以找到他想要的单元格
1回复

LibreCalc等效于Excel Application.InputBox的函数

我最近已转换为通过MS Excel使用LibreCalc。 我想在LibreCalc中使用许多Excel宏,其中一些使用Application.InputBox函数。 我已在LibreCalc中启用了VBA支持,但不幸的是该功能无法识别。 这是代码示例- 在MSExcel中,类型为
2回复

Application.Inputbox [LEFT]和[TOP]无法在Excel Vba中运行。为什么?

我的VBA代码中有一个简单的输入框。 我想设定它的起始位置。 我知道参数[LEFT]和[TOP]应该这样做,但它们不起作用。 这是我有的: 这是函数语法 (我将第三个参数[DEFAULT]留空)。 无论我使用什么数字用于LEFT和TOP,输入框总是从同一个地方开始
1回复

Application.InputBox的枚举

每当我使用Application.InputBox()我都会弹出VBA帮助以提醒我要使用哪种Type : 是否存在,或者我可以为Type创建一个Enumeration,所以可以这样编码: 对我来说,记住枚举而不是任意整数会更容易。
2回复

Excel VBA从通过application.inputbox定义的范围返回单元格值

用户可以通过Application.InputBox方法选择一个范围。 然后,我想检查该范围内第一个单元格中的值。 以下代码产生错误。 有什么帮助吗?
1回复

限制从Application.Inputbox输出

我有一个用户输入框作为excel vba宏的一部分。 我需要用户能够在其中键入11位数字,然后将其输入到单元格中。 但是,任何大于10位数字的值都将返回0值。如何解决这个问题? 我的代码是:
2回复

防御性地使用application.inputbox()

我有以下几点: 如果用户Set colRange =取消”,则Set colRange =失败,因为它正在试图将对象分配给该变量。 我是否必须使用“出错时”结构来防御此错误,还是有更优雅的方法?
1回复

如何使用Application.InputBox选择列?

如何使用InputBox选择一个单元格并使用该列的值? 我修剪了大部分代码以使其适合,因此某些变量将不作声明。 子MacroForTransfers() 结束子
1回复

Application.inputbox缺少提示

我了解到OSX上的Excel VBA已陷入困境,但这是我的代码或OSX的VBA中的问题吗? 下一行: 给我一个输入框,但没有提示。 有任何想法吗? 如果我使用inputbox函数而不是方法,则提示会起作用,但是取消按钮的错误处理似乎是不可能的。