【问题标题】:VBA input Box- cancel and Variable SettingVBA输入框-取消和变量设置
【发布时间】:2018-01-10 18:21:54
【问题描述】:

下面是我的代码。我正在编写一个宏来打开 Excel 报告第一页上的一个按钮,该按钮将根据用户使用的数字将用户带到报告中的不同选项卡。问题是如果我使用整数变量,如果用户取消该框或点击 x 则会发生错误。这些数字在这张纸上工作得很好。但是,如果我将其调暗为 Variant,则不再发生错误,但是输入的数字不再起作用。例如。 3 即使工作簿中有 8 张工作表,也会显示无效工作表框。我认为该变体导致输入数字的格式与整数不同?我想我可以使用 on error resume,但我只是想知道那会是什么样子。或者如果有另一种方法可以做到这一点而不使用该方法

Public Sub Summary_select()

     Dim x As Integer


     x = InputBox("Please Input The Sheet Number")


     If Not (IsNumeric(x)) Then
     MsgBox ("User Cancelled")
     ElseIf x = 0 Then
     MsgBox ("User Entered an Invalid Number of sheets")
     ElseIf x > Sheets.Count Then
     MsgBox ("User Entered an Invalid Number of sheets")
     Else
     Sheets(x).Activate
     Range("A1").Select
     End If

     End Sub

【问题讨论】:

标签: vba excel


【解决方案1】:

InputBox 返回一个String,所以Dim x as String

然后,一旦您确认它是数字并且在正确的范围内,就可以将其用作这样的数字:

Worksheets(Val(x)).Activate

对你的检查也做同样的事情:

ElseIf Val(x) = 0 Then

另外,稍微批评一下你的代码,如果用户输入 -1 会发生什么?从技术上讲,这是数字,但无效。

你应该使用 ElseIf Val(x) = 0 Then 而不是

ElseIf Val(x) < 1 Then

如果他们进入 1.5 会怎样?您可能还需要检查它是否为整数:

If IsNumeric(x) Then
  If Val(x) <> Int(x) Then
    MsgBox "Please enter an Integer"
  End If
End If

【讨论】:

  • 感谢这就像一个魅力。我是 VBA 的新手,如果您在这种情况下使用输入框,希望返回的数字稍后在代码中使用,您是否总是需要做这样的事情?
  • 如果您询问InputBox 是否总是返回String,答案是肯定的。如果您需要一个数值,则由您来验证它。
  • 不错的答案,赞成。此外,“用户取消”框具有误导性。 If StrPtr(x) = 0 Then 将是显示此类 msgbox 的正确条件。
  • 我对所有验证和可能的极端情况的研究越多,这就越像是一个专门的、经过适当单元测试的功能的工作......
  • @Mat'sMug 我根本不会使用 InputBox。我会制作一个带有组合框的用户表单,并用所有有效的工作表编号填充它,或者更好的是工作表名称。
【解决方案2】:

您收到错误的原因是,当用户单击输入框上的取消时,输入框输出一个空 字符串 - 但问题是您的 @987654321 @ 声明不能接受字符串。

所以你可以按照以下方式做一些事情:

On Error Resume Next
x = InputBox("Please Input The Sheet Number")
On Error Goto 0

如果将输入框传递给x时发生错误,则x = 0

【讨论】:

    【解决方案3】:

    虽然我对 vba 核心功能知之甚少,但我已尝试修改您现有的代码以按照您想要的方式工作。试一试:

    Public Sub Summary_select()
         Dim x As String
    
         x = InputBox("Please Input The Sheet Number")
    
         If Not IsNumeric(x) Then
            MsgBox ("User Cancelled")
         ElseIf x = 0 Then
            MsgBox ("User Entered an Invalid Number of sheets")
         ElseIf x > Sheets.Count Then
            MsgBox ("User Entered an Invalid Number of sheets")
         Else
            Sheets("Sheet" & x).Activate
            Range("A1").Select
         End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多