【问题标题】:How to stop vba after user cancels input box用户取消输入框后如何停止vba
【发布时间】:2016-04-29 06:12:21
【问题描述】:

我编写了 vba 代码,它会弹出一个输入框,然后打印一个范围。如果用户按下“取消”按钮,我想停止代码。到目前为止,无论用户的操作如何,它都会打印它并且浪费了大量的纸张。代码如下:

Sub Form()
ThisWorkbook.Sheets("FAQs").Activate
ActiveSheet.Range("A1048306").Select
ActiveCell.FormulaR1C1 = InputBox("SrNo1")
ThisWorkbook.Sheets("FAQs").Activate
ActiveSheet.Range("B1048306").Select
ActiveCell.FormulaR1C1 = InputBox("SrNo2")
ThisWorkbook.Sheets("FAQs").Activate
ActiveSheet.Range("C1048306").Select
ActiveCell.FormulaR1C1 = InputBox("SrNo3")
ThisWorkbook.Sheets("FAQs").Activate
ActiveSheet.Range("D1048306").Select
ActiveCell.FormulaR1C1 = InputBox("SrNo4")
ThisWorkbook.Sheets("FAQs").Activate
ActiveSheet.Range("E1048306").Select
ActiveCell.FormulaR1C1 = InputBox("SrNo5")
Columns("A:D").EntireColumn.Hidden = False
Range("A1048308:B1048359").PrintOut
Columns("A:D").EntireColumn.Hidden = True
ActiveSheet.Range("A1").Select
ThisWorkbook.Sheets("Spends Tracker").Activate
ActiveSheet.Range("A1").Select
End Sub

编辑:

这是我的新代码,它不更新单元格 A1048306,但仍继续使用 vba 并更新单元格 B1048306、C1048306、D1048306、E1048306 并打印范围。

Sub Form()
Dim strVale As String

Dim ws As Excel.Worksheet
Set ws = ActiveWorkbook.Sheets("FAQs")

strVale = InputBox("SrNo1")
If strVale = vbNullString Then
    MsgBox ("User canceled!")
    ThisWorkbook.Sheets("Spends Tracker").Activate
    ActiveSheet.Range("A1").Select
    Exit Sub
Else
    'Here we can use the objects range to set the formula.
    ws.Range("A1048306").FormulaR1C1 = strValue
End If

ws.Range("B1048306").FormulaR1C1 = InputBox("SrNo2")
ws.Range("C1048306").FormulaR1C1 = InputBox("SrNo3")
ws.Range("D1048306").FormulaR1C1 = InputBox("SrNo4")
ws.Range("E1048306").FormulaR1C1 = InputBox("SrNo5")
ws.Columns("A:D").EntireColumn.Hidden = False
ws.Range("A1048308:B1048359").PrintOut
ws.Columns("A:D").EntireColumn.Hidden = True
ActiveSheet.Range("A1").Select
ThisWorkbook.Sheets("Spends Tracker").Activate
ActiveSheet.Range("A1").Select

结束子

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    计算返回值,而不是将其放入单元格公式中。

    改变

    ActiveCell.FormulaR1C1 = InputBox("SrNo1")
    

    这样的事情

    Dim strVale as string
    strVale = InputBox("SrNo1")
    
    If strVale = vbNullString Then
        MsgBox ("User canceled!")
        Exit Sub
    Else
        ActiveCell.FormulaR1C1 = strValue
    End If
    

    将此应用于每个 InputBox。

    编辑:第二个问题

    我稍微更改了您的代码。试试看吧。

    选择和激活可能会导致事情变得混乱。看这里。 How to avoid using Select in Excel VBA macros

    最好避开它们。

    我取出所有ThisWorkbook.Sheets("FAQs").Activate 并为工作表声明了一个对象。然后就可以使用对象了。

    Option Explicit
    
    Sub Form()
        Dim strValue As String
    
        'Here we are declaring and setting the object = to your FAQs worksheet
        Dim ws As Excel.Worksheet
        Set ws = ActiveWorkbook.Sheets("FAQs")
    
        strValue = InputBox("SrNo1")
        If strValue = vbNullString Then
            MsgBox ("User canceled!")
            ThisWorkbook.Sheets("Spends Tracker").Activate
            ActiveSheet.Range("A1").Select
            Exit Sub
        Else
            'Here we can use the objects range to set the formula.
            ws.Range("A1048306").FormulaR1C1 = strValue
        End If
    
        ActiveSheet.Range("B1048306").Select
        ActiveCell.FormulaR1C1 = InputBox("SrNo2")
        ActiveSheet.Range("C1048306").Select
        ActiveCell.FormulaR1C1 = InputBox("SrNo3")
        ActiveSheet.Range("D1048306").Select
        ActiveCell.FormulaR1C1 = InputBox("SrNo4")
        ActiveSheet.Range("E1048306").Select
        ActiveCell.FormulaR1C1 = InputBox("SrNo5")
        Columns("A:D").EntireColumn.Hidden = False
        Range("A1048308:B1048359").PrintOut
        Columns("A:D").EntireColumn.Hidden = True
        ActiveSheet.Range("A1").Select
        ThisWorkbook.Sheets("Spends Tracker").Activate
        ActiveSheet.Range("A1").Select
    End Sub
    

    主要变化是

    ActiveCell.FormulaR1C1 = strValue
    

    成为

    ws.Range("A1048306").FormulaR1C1 = strValue
    

    这样您就不必担心活动或选定的单元格是什么。

    【讨论】:

    • 很高兴为您提供帮助。继续学习,让 SO 社区知道您何时需要指导。
    • 嗨,马修,我还有一个问题。我玩了一下代码。现在发生的情况是,如果用户在第一个框中输入任何值,它会转到下一个框而不更新单元格“A1048306”。
    • 我无法在此处粘贴我的代码。你能告诉我如何添加我的代码吗?我尝试在代码前输入 4 个空格,但它只是说您已超出字符数限制。谢谢!
    • @user1778266 在您最初的问题下,您是否看到共享编辑关闭标志链接?单击编辑,您可以将新问题附加到旧问题的底部。
    • 请注意,strVale 可以声明为 as VbMsgBoxResult,这是 MessageBox 对象的正确返回类型。 String(显然)也有效,但它实际上返回一个长整型常量,如 vbYesvbNovbCancel 等。
    【解决方案2】:

    这是您的代码,已收紧。我建议阅读avoiding using .Select,这有助于提高可读性和速度。

    Sub Form()
    Dim srOkCancel$
    Dim i&
    
    With ThisWorkbook.Sheets("FAQs")
        For i = 1 To 5
            srOkCancel = InputBox("SrNo" & i, vbOKCancel)
            If srOkCancel = vbNullString Then Exit Sub
            .Range(.Cells(1048306, .Columns(i)), .Cells(1048306, .Columns(i))).FormulaR1C1 = srOkCancel
        Next i
    
        .Columns("A:D").EntireColumn.Hidden = False
        .Range("A1048308:B1048359").PrintOut
        .Columns("A:D").EntireColumn.Hidden = True
        .Range("A1").Select
    End With
    
    ThisWorkbook.Sheets("Spends Tracker").Range("A1").Select
    
    End Sub
    

    唯一的问题是,我不知道您期望的输入是什么 - 它会是一个公式吗?如果您使用 like "=r1c1+1" 作为输入字符串,这不会真正起作用。请告诉我您希望输入什么样的数据,我会修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2015-07-08
      • 2019-08-22
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多