所以我有一些基本的 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
看起来不错:
是否可以对此进行扩展,以便编辑框只允许输入小数点后两位的数值?或者只是工作量太大?
我知道如何格式化文本本身,例如:Format("1234.5678", "#.00")
。但是实际的编辑控件本身可以进行任何自定义吗?
最佳答案
这里基本上有三个选择......按难度顺序:
<强>1。验证输入
这使用了 native InputBox()
函数,如上面的代码示例中所示。您可以将值返回到字符串变量中,然后在此时进行验证以确保数据的格式符合您想要的方式。如果没有通过,则重新显示输入框。
<强>2。自定义 VBA 表单
如果您创建自己的 VBA 用户表单,则可以自定义文本框以使用特定格式,并在表单接受输入并关闭之前执行验证。这可能是最用户友好的方法,但比第一种方法涉及更多代码。
示例:
创建带有两个输入框和一个命令按钮的示例 VBA 表单。分别将它们命名为 txtDiff1
、txtDiff2
和 cmdOK
。
双击其中一个控件,将以下代码添加到窗体后面的代码模块中:
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()
时,您将在用户表单上看到几种不同的方法。 第一个文本框自动舍入输入,而第二个文本框则不允许用户继续,除非他们将输入更正为使用两位小数或更少。
当然,您会想要添加一些错误处理并使表单看起来不错,但这为您提供了如何使用 VBA 表单获取用户输入的简单示例。它们涉及更多的代码,但显然比简单的 InputBox()
函数提供了巨大的额外灵活性。
<强>3。 Windows API 调用
为了完整起见,有一些方法可以使用 Windows API 调用来实际影响输入框上的控件,但这最终会比前两种方法复杂得多,我不会推荐它用于类似的事情.
关于vba - InputBox编辑控件的高级自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47018439/