【问题标题】:Loop to ensure inputbox entry is eight characters long and numeric循环以确保输入框条目为八个字符长且为数字
【发布时间】:2022-02-16 18:43:01
【问题描述】:

在我的一个每周文件中,我遇到了一个循环问题,该循环会提供文件名的日期部分。

文件可以在一周中的任何一天或相关后一周的前几天生成,具体取决于源数据何时准备好,但必须以它包含数据的最后日期的 yyyymmdd 格式的日期作为前缀.

执行此操作的最简单方法是通过宏开头的输入框进行设置,然后在将组件报告保存到其文件夹中时可以调用该输入框。

我的问题是用户可以将任何内容放入输入框中(我认为需要将其格式化为其他元素的字符串,因为我对 VBA 的了解不够了解如何将数字变量调用到我的保存名称中) .

我想添加一个循环,说明它是否为 8 个字符长,如果是数字则继续,否则重新输入日期。

Dim svdate As String
Sub inpt()
Do
    svdate = InputBox("date")
    If Len(svdate) = 8 And IsNumeric(svdate) Then
        MsgBox svdate
    Else
        MsgBox ("the value should be a number in format yyyymmdd please try inputting the date again")
    End If
Loop Until True

我一直在一个单独的子程序中测试上述代码,因此 if true 部分的 msgbox 将替换为正确输入日期后将运行的其余子程序。

我已将 svdate 变量定义为模块级别的项目,因为它在所有工作的更广泛的宏中的许多其他阶段都被调用。我只想确保用户在组合代码之前只能输入适当的日期。

就代码而言,它会要求我在框中输入日期,然后显示 2 个 msgbox 之一,但如果为 false 则不会返回到输入框阶段。

【问题讨论】:

  • 问题:为什么你认为循环应该再次运行?目前它循环直到 true = true。 ...当 svdate 正常时,您需要一个为 true 的变量,否则为 false。然后你的loop until 检查必须评估这个变量。顺便说一句@ChristoferWeber:在 else 之后有一个冒号是可以的,因为它就像一行中的两个命令。
  • 感谢编辑,因为它只是我的 vba 编辑器的副本转储,我自己从未添加冒号,所以不知道为什么它仍然没有循环
  • 嗨,我没有放一个循环,说是 if stement true if yes end loop if not go back until to the start to make it true (kloop until代码末尾的真实行)。如果不是,我该怎么做,因为我试图确保用户收到错误消息,解释为什么输入框需要重新填充,然后再次弹出,直到输入有效值
  • 就像If 后面跟着一个返回真或假的语句一样,Loop until 的作用完全一样。在您的情况下,语句是 true,这就像在 If 等效项中说 If True Then,因为它将始终返回 true。正如艾克所说,真=真。虽然你基本上想要Loop Until Len(svdate) = 8 And IsNumeric(svdate)

标签: excel vba


【解决方案1】:

正确循环:

Dim svdate As String
Sub inpt()
dim isOK as boolean
Do
    svdate = InputBox("date")
    If Len(svdate) = 8 And IsNumeric(svdate) Then
       isOK = true
      MsgBox svdate
    Else
       isOK = false
       MsgBox ("the value should be a number in format yyyymmdd please try inputting the date again")
    End If
Loop Until isOK = true
End Sub

在您的代码中,If-loop 位于 Do-loop 内 - 因此 Do-loop 不“知道”检查结果。

我的代码isOKIf-loop 设置,do-loop 可以评估它。

【讨论】:

  • 谢谢你,这样我才明白出了什么问题的逻辑,然后我的代码最初是在我放入循环语句时,没有什么可以告诉 vba 有一个真假值依次通过。那是对的吗?我猜布尔部分只是提供了一个循环函数可以理解的值,对吗?
  • 见我添加的解释。
【解决方案2】:

为了完整起见,您也可以使用Exit do

Dim svdate As String
Sub inpt()
Do
    svdate = InputBox("date")
    If Len(svdate) = 8 And IsNumeric(svdate) Then
        MsgBox svdate
        Exit do     'exit the loop
    Else
        MsgBox ("the value should be a number in format yyyymmdd please try inputting the date again")
    End If
Loop Until True
....

【讨论】:

  • 我已经很长时间没有查看这段代码了,因为它在我手中表现得足够好,尽管我创建了宏,但我不需要将工作交给其他团队成员。您可能是对的,它应该包含 exit do 部分。所以下次我在文件中时会整理一下,让它看起来更完整
猜你喜欢
  • 2021-08-12
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2020-04-27
  • 2011-10-23
  • 2021-12-30
  • 2014-07-17
相关资源
最近更新 更多