用户取消输入框后如何停止vba

Posted

技术标签:

【中文标题】用户取消输入框后如何停止vba【英文标题】:How to stop vba after user cancels input box 【发布时间】: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

结束子

【问题讨论】:

【参考方案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" 作为输入字符串,这不会真正起作用。请告诉我您希望输入什么样的数据,我会修复它。

【讨论】:

以上是关于用户取消输入框后如何停止vba的主要内容,如果未能解决你的问题,请参考以下文章

vba:用户表单功能

js信息输错后输入框后提示红字代码如何编写

vba 输入框维护取消

填充另一个输入框后如何使输入框变暗?

VBA输入框(InputBox)

VBA:输入框和取消按钮