VBA - CommandButton单击子 - 每次创建新工作表时

时间:2017-07-19 14:18:29

标签: excel vba excel-vba

这感觉就像一个愚蠢的问题,但我无法弄明白,所以这里......

我有一个工作簿,根据输入到userform的内容,每次单击userform上的命令按钮时都会创建一个新的工作表,并删除旧的工作表。

这意味着,虽然新工作表始终具有相同的名称(“结果”),但每次都会增加工作表编号;它现在称自己为Sheet48,下次我运行时它将是Sheet49。

我想要做的是在“结果”表单上添加一个命令按钮,用户可以单击该按钮将它们带到另一个工作表。我已经在userform中添加了一些代码,这些代码在“结果”工作表上创建了命令按钮。我还没有编写可以告诉它将用户带到另一个工作表的子程序,但我相信我可以毫不费力地做到这一点。

我的问题是如何将子分配给按钮,考虑到它所在的工作表不是永久性的?我认为sub应该进入一个标准模块,但我看到的所有这些例子都以“CommandButton1_Click”或“CommandButton2_Click”开头,并存储在表单对象本身中。看起来这些数字1和2指的是命令按钮在给定工作表上的顺序,但可能是标准模块上的子程序不知道要查看哪个工作表。

我希望这是有道理的 - 任何有用的解释都将非常感谢!感谢。

编辑: 这是我用来创建命令按钮并(尝试)将子分配给它的代码:

'Add a command button, which will allow users to jump to the full report

ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
        , DisplayAsIcon:=False, Left:=1025, Top:=130.5, Width:=160, Height:= _
        400).Select

ActiveSheet.CommandButton1.Caption = "Click here to see the original report"
ActiveSheet.CommandButton1.WordWrap = True
ActiveSheet.CommandButton1.OnAction = "Module1.ButtonForOriginal" 'the sub works in isolation, but this line isn't assigning it.

有人能看到任何问题吗? ButtonForOriginal子过程是孤立的,所以看起来我只是没有正确调用它?

编辑2 - 我现在用不同的方法取得了正确的效果 - 如果您有兴趣,请参阅下面的答案。感谢那些帮助我并使我走上正确道路的人!

3 个答案:

答案 0 :(得分:0)

据我所知,您正在尝试使用新按钮添加新工作表,我建议使用带有超链接的非依赖按钮来运行您的模块。

点击插入形状 - 矩形左右 - 并使用Selection.OnAction =“YourWorkBook'!YOURSUB”

答案 1 :(得分:0)

" CommandButton1_Click"应该是一个事件程序。它们进入与对象所在的工作表连接的模块页面。因此,当您点击它时,它知道要运行的程序,它是连接到按钮所在的工作表的程序。

答案 2 :(得分:0)

好吧,我有点想通了。我出于某种原因决定使用ActiveX命令按钮,而不是普通的旧Form。这似乎使事情变得更加困难。我不了解细节,但是我已经取得了这样的效果:

public virtual ObjectResult<Card> CreateCards(Nullable<int> numberOfCards, Nullable<int> customerID)
{
    var numberOfCardsParameter = numberOfCards.HasValue ?
            new ObjectParameter("NumberOfCards", numberOfCards) :
            new ObjectParameter("NumberOfCards", typeof(int));

    var customerIDParameter = customerID.HasValue ?
            new ObjectParameter("CustomerID", customerID) :
            new ObjectParameter("CustomerID", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Card>("CreateCards", numberOfCardsParameter, customerIDParameter);
}