vba - InputBox编辑控件的高级自定义

标签 vba

所以我有一些基本的 VBA 代码:

Sub Test()
    ' Set error handler
    On Error GoTo ErrorHandler

    Dim strElevation As String
    strElevation = InputBox("Enter elevation difference:", "Create Cross Lines", 0.5)

    Exit Sub

ErrorHandler:
    Call ReportError("Test")
End Sub

看起来不错:

InputBox

是否可以对此进行扩展,以便编辑框只允许输入小数点后两位的数值?或者只是工作量太大?

我知道如何格式化文本本身,例如:Format("1234.5678", "#.00")。但是实际的编辑控件本身可以进行任何自定义吗?

最佳答案

这里基本上有三个选择......按难度顺序:

<强>1。验证输入

这使用了 native InputBox() 函数,如上面的代码示例中所示。您可以将值返回到字符串变量中,然后在此时进行验证以确保数据的格式符合您想要的方式。如果没有通过,则重新显示输入框。

<强>2。自定义 VBA 表单

如果您创建自己的 VBA 用户表单,则可以自定义文本框以使用特定格式,并在表单接受输入并关闭之前执行验证。这可能是最用户友好的方法,但比第一种方法涉及更多代码。

示例:

创建带有两个输入框和一个命令按钮的示例 VBA 表单。分别将它们命名为 txtDiff1txtDiff2cmdOK

enter image description here

双击其中一个控件,将以下代码添加到窗体后面的代码模块中:

Option Explicit

Private Sub cmdOK_Click()
    MyElevationDifference = txtDiff1 ' (or txtDiff2)
    Unload Me
End Sub

Private Sub txtDiff1_AfterUpdate()

    Dim dblValue As Double

    If IsNumeric(txtDiff1) Then
        ' Determine rounded amount
        dblValue = Round(txtDiff1, 2)
        ' Automatically round the value
        If dblValue <> CDbl(txtDiff1) Then txtDiff1 = dblValue
    Else
        MsgBox "Please enter a numeric value", vbExclamation
    End If

End Sub


Private Sub txtDiff2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

    Dim dblValue As Double

    If IsNumeric(txtDiff2) Then
        ' Determine rounded amount
        dblValue = Round(txtDiff2, 2)
        ' Require a max of 2 decimal places
        If dblValue <> CDbl(txtDiff2) Then
            Cancel = True
            MsgBox "Please only use 2 decimal places", vbExclamation
        End If
    Else
        MsgBox "Please enter a numeric value", vbExclamation
        ' Cancel change
        Cancel = True
    End If

End Sub

将以下内容粘贴到常规代码模块中。 (这就是您如何通过自定义表单获取主代码中的输入。本质上,表单为全局变量分配一个值,并在显示表单后引用该值。)

Option Explicit

Public MyElevationDifference As Double

Public Sub GetElevationDifference()
    UserForm1.Show
    MsgBox "Elevation difference: " & MyElevationDifference, vbInformation
End Sub

现在,当您运行 GetElevationDifference() 时,您将在用户表单上看到几种不同的方法。 第一个文本框自动舍入输入,而第二个文本框不允许用户继续,除非他们将输入更正为使用两位小数或更少。

enter image description here

当然,您会想要添加一些错误处理并使表单看起来不错,但这为您提供了如何使用 VBA 表单获取用户输入的简单示例。它们涉及更多的代码,但显然比简单的 InputBox() 函数提供了巨大的额外灵活性。

<强>3。 Windows API 调用

为了完整起见,有一些方法可以使用 Windows API 调用来实际影响输入框上的控件,但这最终会比前两种方法复杂得多,我不会推荐它用于类似的事情.

关于vba - InputBox编辑控件的高级自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47018439/

相关文章:

vba - 如何附加或组合范围?

vba - 使用VBA将十进制数转换为分钟和秒

vba - 副水平X轴VBA最大刻度

Excel VBA从表中复制单列并转置

mysql - 类型不匹配,打开记录集

javascript - 非 IE WebBrowser ActiveX 控件

vba - 设置自动过滤多个通配符

excel - 在工作表之间高效复制和粘贴信息

vba - MS Word 扩展性 : VBA macro versus .Net VSTO?

excel - 打开文件时在新的 Excel 实例中打开特定的 Excel 文件