【问题标题】:Change inputbox default to the current input将输入框默认更改为当前输入
【发布时间】:2020-05-13 23:10:25
【问题描述】:

我正在尝试编写一个宏,它会将输入框默认值重新设置为最后输入的值,所以如果我在下面的输入框中键入“2”,默认值将更改为 2,下次宏已运行。

只有在我运行宏的工作簿关闭后,才能恢复原来的默认值

(Excel 2007)

    ROWSDOWN = InputBox("enter no.of rows DOWN to move the cells", "VerticalMove", _
            -1) 'default -1 (=1 row up)

我已尝试设置PREV_ROWSDOWN = ROWSDOWN,但我的尝试(如下)不起作用:下次我运行宏时,输入框默认值为 0。宏结束时 PREV_ROWSDOWN(和 ROWSDOWN)的值会丢失吗?

ROWSDOWN = InputBox("enter no.of rows DOWN to move the cells (0=no change, - =move UP)", "VerticalMove", _
            PREV_ROWSDOWN) 'should set default as value entered last time the macro run
        PREV_ROWSDOWN = ROWSDOWN ''NW-not saved after macro finished, default changed to "0"

我怎样才能做到这一点?

【问题讨论】:

    标签: excel vba inputbox


    【解决方案1】:
    1. 为了更好的可读性,我建议不要使用全大写变量名。
    2. 我建议使用Application.InputBox method 而不仅仅是InputBox,因为您可以在那里指定输入的Type。因此,如果您设置Type:=1,则用户只能输入数字。
    3. 确保使用Option Explicit 来强制进行正确的变量声明。我建议始终激活 Option Explicit:在 VBA 编辑器中转到 ToolsOptionsRequire Variable Declaration

    一直持续到工作簿关闭……

    要使您的默认值在工作簿关闭之前保持不变,您需要将其声明为Static(请参阅Static statement)。

    Option Explicit
    
    Public Sub Test()
        Static RowsDown As Long  'Static variables will keep the value until next call
        RowsDown = Application.InputBox(Prompt:="enter no.of rows DOWN to move the cells (0=no change, - =move UP)", Title:="VerticalMove", Default:=RowsDown, Type:=1) 
    End Sub
    

    请注意,如果您关闭并重新打开工作簿,它将再次以 0 开始。如果您希望它有所不同,您需要在您的 Static 行之后添加类似以下内容:

    If RowsDown = 0 Then RowsDown = -1
    

    永远坚持……

    当工作簿关闭时,变量无法保留值。如果即使工作簿关闭并重新打开,您也想让您的价值保持不变,那么您需要将其保存到(可能是隐藏的)工作表的单元格中。

    Option Explicit
    
    Public Sub Test()
        Dim RowsDown As Long
        RowsDown = Application.InputBox(Prompt:="enter no.of rows DOWN to move the cells (0=no change, - =move UP)", Title:="VerticalMove", Default:=ThisWorkbook.Worksheets("hiddensheet").Range("A1").Value, Type:=1) 
        ThisWorkbook.Worksheets("hiddensheet").Range("A1").Value = RowsDown
    End Sub
    

    【讨论】:

    • 谢谢,我将尝试使用静态选项并将其应用于 PREV_ROWSDOWN,因为我只在写一本书时才需要它。我会尝试写,如果 PREV_ROWSDOWN=0 则输入框默认值为 -1,以便下次重置它:) 顺便说一句,我发现所有大写的变量更容易使用,因为它们很容易区分并且脱颖而出其他代码!
    • @Piecevcake 我怀疑你会发现很多人对 ALL CAPS 有同样的看法^^ 我会坚持一个常见的做法,因为如果你必须在一个团队中工作,他们可能不会喜欢你;)
    • 感谢您的好建议 :) 请澄清一点-“直到工作簿关闭”是否意味着直到包含宏的工作簿关闭? (不是宏正在改变的工作簿)所以如果宏在personal.xlsb中,并在另一个工作簿上使用,在另一个工作簿关闭后,该值将保持不变,直到personal.xlsb关闭?
    • @Piecevcake 是的,就像这样。
    • @Piecevcake 如果这回答了您的问题,请点赞/标记为已解决:Accepting Answers: How does it work?
    【解决方案2】:

    需要定义全局变量,这里用输入框定义宏,如:

    Private lastInput
    
    Sub DefaultForInputBox()
        lastInput = InputBox("Enter some value", "InputBox", lastInput)
    End Sub
    

    【讨论】:

    • 只是为了您的兴趣:实际上不需要全局定义它。我会将其保留为局部变量,但将其设为Static(因此它会保留该值直到下一次调用)。为什么?因为我认为将变量尽可能保持在本地是一种很好的做法,所以如果不需要使其成为全局变量,我们为什么要这样做。 • 但您的解决方案仍然有效。
    • @Pᴇʜ 不知道 VBA 中的 Static :) 但我发现它的工作方式与其他编程语言不同。我同意将变量保密。但这也取决于软件架构。
    • 是的,刚刚提到它是因为我认为Static 在 VBA 中很少使用,大多数人都忘记了它。但在某些情况下,它确实很有用,因为您不会用大量全局变量阻塞所有内容。我认为这是一种很酷的方法,可以让事情变得更干净并控制这个过程(没有其他过程可以弄乱这个变量)。
    • 这看起来很有用!我能问一下代码的哪一部分使它成为全球性的,它持续了多长时间?书合上后还能用吗?
    • @Piecevcake 声明的地方使它成为全局的,即在模块级别,而不是在任何函数或子内部。不,它不会在工作簿关闭后持续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2012-05-08
    • 2014-06-03
    • 2018-07-26
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多