为使用VBA创建的多个命令按钮分配唯一代码

时间:2013-11-06 16:45:08

标签: excel vba commandbutton

美好的一天, 首先发帖给我!我找不到任何问题的答案,即使stackoverflow社区在过去一周帮助了我很多次来编写这个项目。

这是我想要做的: 我是一家生产私人飞机的大公司的实习生,我被要求找到一种简单的方法来查找特定表格中的信息。该表重新组合了公司出售的所有飞机,并提供了有关每一架飞机的特定信息。

正如我所说,由于这个网站,我设法做了很多,但现在我有一件非常特别的事情要做。

当用户知道要查找哪架飞机时,它会打开一个标签(“结果”),其中包含有关该飞机的所有信息。这是第一个搜索选项。它就像一个魅力!

这是我的excel界面:http://i.stack.imgur.com/TXcpY.jpg

但是当用户不知道要查找哪种飞机时,他可以选择通过用户界面(“搜索”选项卡)搜索模型或内部所有者(或两者)。 代码执行,工作表“RESULTS2”在搜索栏中列出所有具有命令按钮的飞机。我用OLEObjects.add创建了这些按钮,一切运行良好。

现在,我需要为这些对象中的每一个分配代码(Commandbutton1,Commandbutton2,...,CommandbuttonN)。 每当用户点击命令按钮时,它就会执行第一次搜索的代码(当用户知道飞机编号时的代码),并且飞机号码在同一行上。

我想为每个按钮执行我想要执行的代码,这些代码将被放入“RESULTS2”选项卡中:

Private Sub CommandButton1_Click()

'Variables
Dim avion As String
Dim lRow2 As Long

'Settings
Set sourceBook = ActiveWorkbook
Set sourceSheet = sourceBook.Sheets("SEARCH")
Set sourceSheet1 = sourceBook.Sheets("TABLE")
Set sourceSheet2 = sourceBook.Sheets("RESULTS")
Set sourceSheet3 = sourceBook.Sheets("RESULTS2")

'Set "avion" as the aircraft number on the button row ("RESULTS2" tab)
avion = sourceSheet3.Cells(6, "B").Value

'Set the aircraft number on the "SEARCH" tab (User interface) as "avion"
sourceSheet.Cells(5, "E").Value = avion

'Calls the macro to execute search
Call sourceSheet.Searchaircraft

End Sub

此特定情况下的结果仅适用于第一行的按钮(Commandbutton1)。

有没有办法为ALL命令按钮创建一个Private Sub? 或者也许用:

创建一个for循环
For i=1 To LastRow

    Private Sub "Commandbutton" & i & "_click()"
    [...]
    avion = sourceSheet3.Cells(i+5, "B").Value
    [...]
    End Sub

Next i

有关您的信息,以下是“搜索”选项卡中代码的一部分,它创建了命令按钮(它位于for循环中以创建每一行):

'Bouton
            Set rng = sourceSheet3.Range("G" & n)
            Set mybutton = sourceSheet3.OLEObjects.Add(ClassType:="Forms.CommandButton.1")
            rng.Borders.LineStyle = xlContinuous
            With mybutton
                .Object.Caption = "<->"
                .Object.Font.Size = 3
                .Left = rng.Left + 1
                .Top = rng.Top + 1
                .Height = 11.75
                .Width = 60
            End With

非常感谢您的任何帮助! 这件事让我疯了几个小时......!

谢谢你,祝你有愉快的一天, 亚历


编辑:

Nutsch的回答是那个!

以下是我在模块中编写的代码:

`Public Sub WhichButton()

On Error GoTo Err_cmdNewTerm_Click

'Variables
Dim avion As String
Dim ButtonText As String
Dim b As Object
Dim Ligne As Integer


'Settings
Set sourceBook = ActiveWorkbook
Set sourceSheet = sourceBook.Sheets("SEARCH")
Set sourceSheet1 = sourceBook.Sheets("TABLE")
Set sourceSheet2 = sourceBook.Sheets("RESULTS")
Set sourceSheet3 = sourceBook.Sheets("RESULTS2")


'Vérification de quel bouton a été appuyé
Set b = sourceSheet3.Buttons(Application.Caller)
    With b.TopLeftCell
        Ligne = .Row
    End With


' Récupération du numéro de l'avion
avion = sourceSheet3.Cells(Ligne, "B").Text

' Inscription du numéro dans la page SEARCH
sourceSheet.Cells(5, "E").Value = avion

'Calls the macro to execute search
Call sourceSheet.Searchaircraft


' Fenêtre en cas d'erreur de programmation
GoTo Exit_cmdNewTerm_Click

Err_cmdNewTerm_Click:
MsgBox Err.Description
Resume Exit_cmdNewTerm_Click

Exit_cmdNewTerm_Click:

End Sub

以下是我的工作表中添加按钮的代码:

'Bouton
Set rng = sourceSheet3.Range("G" & n)
sourceSheet3.Buttons.Add(rng.Left + 1, rng.Top + 1, 60, 11.75).OnAction = "WhichButton"
sourceSheet3.Buttons.Caption = "Search"

希望有一天能帮助别人。 谢谢! 亚历

1 个答案:

答案 0 :(得分:1)

对所有按钮使用相同的宏,并使用application.caller查找按下了哪个按钮。