【问题标题】:InputBox confusing Decimal entries with stringsInputBox 将 Decimal 条目与字符串混淆
【发布时间】:2019-03-06 16:16:10
【问题描述】:

我正在尝试使用 InputBox 函数来获得用户输入数据。但是,数据主要由十进制值组成。当我测试我的程序并减去两个从 InputBox 输入的值时,它不执行数学运算。

thckmax = InputBox("What is the maximum nominal thickness?", "Enter Max Nominal Thickness Measurement")
thckmin = InputBox("What is the minimum nominal thickness?", "Enter Min Nominal Thickness Measurement")
thcknom = (thckmax + thckmin)

如果我分别输入 .05 和 .04,它会显示前面的代码:

thcknom is .05.04

我正在尝试对两个变量进行数学运算,即加法;但是,它只是并排“添加”两个字符串。我该如何解决这个问题?

【问题讨论】:

  • 您是否将变量声明为 Double 或 Single?如果您没有声明它们,这可能会发生。认为用户应该输入 0.05 而不是 .05
  • @damian 我将它们声明为应该允许我输入任何数据类型的变体,但我可以看到它可能会变得混乱,特别是如果小数点前没有零的话。跨度>
  • 我假设使用Variant,当使用InputBox() 时,它会假设它是String,这就是+ 只是将两者连接起来的原因。此外,一些令人惊讶的好讨论来自这个问题,干得好!编辑:是的,Dim tst as Variant // tst = InputBox("What?") // debug.print TypeName(tst)Hi30.03 的输入返回String

标签: excel vba


【解决方案1】:

您需要将变量声明为DoubleSingle,具体取决于预期的输入:

Sub t()
Dim thckmax As Double, thckmin As Double, thcknom As Double
thckmax = InputBox("What is the maximum nominal thickness?", "Enter Max Nominal Thickness Measurement")
thckmin = InputBox("What is the minimum nominal thickness?", "Enter Min Nominal Thickness Measurement")
thcknom = (thckmax + thckmin)
Debug.Print thcknom
End Sub

请参阅VBA's data types 了解更多信息。

另外,我建议将Option Explicit 添加到模块的最顶部,这会强制您声明所有变量。

【讨论】:

  • @A.Jones - 养成一个好习惯。仅供参考,您可以让 VBA 自动添加它,请参阅this page。它还有助于防止任何拼写错误,因此如果您稍后在代码中不小心输入了thickmax,它会提醒您它未声明,而不是运行代码,然后在到达该行时抛出错误。
  • not 明确指定选项的问题在于它not 会在那行 上抛出错误,而是其他完全不相关的地方(如果有的话) - 因为隐含的Variant 可以保存任何东西,所以代码可以愉快地使用无效数据继续运行,并且错误可能会在离源很远的地方弹出,这使得问题更难调试比它应该的 - 而使用 Option Explicit,而不是在运行时某处失败,它在编译时失败,甚至在单个语句开始运行之前。早点失败总是好的! (抄送@A.Jones)
  • 更不用说,花 3 个小时挠头,才意识到“哦,这是一个错字” =)
  • @A.Jones 如果一个空值是合法输入并且您需要从取消中告诉它,请使用 VBA 标准库(不是 Excel 的)中的 InputBox,返回的字符串将有一个StrPtr 如果取消,则值为 0。如果您不需要从空输入中判断取消,则与类型的默认初始值(“”/0)进行比较
  • @A.Jones 您试图将返回值强制转换为双精度,但该函数返回的字符串可能会或可能不会隐式转换为双精度;类型不匹配是在分配上,而不是在比较上。将输入框包装到它自己的双返回函数中,以抽象出接收字符串、验证它是否是数字、尝试 cdbl 转换的管道,......还有......我会假装我没有看到 GoTo = )
【解决方案2】:

InputBox 允许您define the input type。由于您没有指定一个,因此使用默认值,即 TEXT。

thckmax = Application.InputBox(Prompt:="What is the maximum nominal thickness?", Type:=1)

保证你得到一个数字,最终防止十进制符号混淆。

【讨论】:

  • 除了 OP 使用 InputBox,它解析为 VBA.Interaction.InputBox 函数,而不是 Excel.Application.InputBox。如果你想要Application.InputBox,它必须是明确限定的。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 2011-03-14
  • 2013-11-28
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 2018-02-04
  • 2014-04-15
相关资源
最近更新 更多