Назначение уникального кода нескольким командным кнопкам, созданным с помощью VBA

Добрый день, Первый пост здесь для меня! Я не смог найти ответа на свою проблему, даже несмотря на то, что сообщество stackoverflow много раз помогало мне на прошлой неделе кодировать этот проект.

Вот что я хочу сделать: я работаю стажером в крупной компании, производящей частные самолеты, и меня попросили найти простой способ найти информацию в определенной таблице. В этой таблице собраны все самолеты, проданные компанией, с конкретной информацией о каждом из них.

Как я уже сказал, мне многое удается сделать благодаря этому сайту, но теперь у меня есть действительно особая задача.

Когда пользователь знает, какой самолет искать, он открывает вкладку ("РЕЗУЛЬТАТЫ") со всей информацией об этом самолете. Это первый вариант поиска. Работает как часы!

Вот мой интерфейс Excel: http://i.stack.imgur.com/TXcpY.jpg

Но когда пользователь не знает, какой самолет искать, у него есть возможность поиска модели или владельца салона (или того и другого) через Пользовательский интерфейс (вкладка «ПОИСК»). Код выполняется, и на листе «РЕЗУЛЬТАТЫ2» перечислены все самолеты с кнопкой управления в столбце поиска. Я создал эти кнопки с помощью OLEObjects.add, и все работало хорошо.

Теперь мне нужно присвоить код каждому из этих объектов (Commandbutton1, Commandbutton2, ..., CommandbuttonN). Каждый раз, когда пользователь нажимает на командную кнопку, выполняется код первого поиска (тот, когда пользователь знает номер самолета) с номером самолета в той же строке.

У меня есть код, который я хочу выполнить для каждой кнопки, которая будет помещена на вкладку «РЕЗУЛЬТАТЫ2»:

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).

Есть ли способ создать приватный сабвуфер для ВСЕХ командных кнопок? Или, может быть, создать цикл 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

Любая помощь от вас будет очень признательна! Эта штука сводит меня с ума уже несколько часов...!

Спасибо и хорошего дня, Алекс


РЕДАКТИРОВАТЬ :

Ответ Нутча был единственным!

Вот код, который я написал в модуле:

`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"

Надеюсь, это поможет кому-то однажды. Спасибо! Алекс


person Canadalex    schedule 06.11.2013    source источник


Ответы (1)


Используйте один и тот же макрос для всех кнопок и используйте application.caller, чтобы узнать, какая кнопка была нажата.

person nutsch    schedule 06.11.2013
comment
Хорошо, я думаю, что теперь понял, что вы предлагаете, я попробую это прямо сейчас! Спасибо! - person Canadalex; 06.11.2013