Как инициализировать строку с разными именами VBA Combo Box - PullRequest
0 голосов
/ 08 июля 2019

Работая в Excel, у меня есть 10 таблиц, и у каждого из них есть тот же ActiveX Combo Box. Поле со списком перечисляет подмножество других рабочих листов в рабочей книге.

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

Моя проблема заключается в том, что в настоящее время существует один модуль, который инициализирует имя рабочего листа, ссылаясь на имя поля со списком, которое отличается на каждом листе (т.е. от ComboBox1 до Combox10).

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

Есть ли способ отредактировать эту ссылку поля со списком в модуле, используя подстановочный знак, или есть другой способ решить эту проблему?

Я пытался добавить общедоступный саб в частный саб для каждого листа, но потом я сталкиваюсь с ошибкой 400. Я также пытался бросить * после ComboBox (т.е. ComboBox *), но это тоже явно не правильно.

Sub FillTable()

Dim lastrow, lastrow2, i As Integer
Dim Searchfor, j, candnumArr, MarksArr As Variant
Dim wsName As String

    'Worksheet selected in Combobox which differs across worksheets
    ' This is the reference that needs to be changed from 1 to 2/3/etc
    wsName = ActiveSheet.ComboBox1.Text

    With Sheets(wsName)
        lastrow = .Cells(Rows.Count, "B").End(xlUp).Row
        candnumArr = Range(.Cells(6, 2), .Cells(lastrow, 14))
    End With

    'Arrays to be filled sheet
    With ActiveSheet
        lastrow2 = .Cells(Rows.Count, "H").End(xlUp).Row
        ' load variant array with search variables
        searcharr = Range(.Cells(6, 8), .Cells(lastrow2, 8))
        ' define an output aray
        PartNumArr = Range(.Cells(6, 13), .Cells(lastrow2, 13))
        MarksArr = Range(.Cells(6, 17), .Cells(lastrow2, 26))
    End With

    On Error Resume Next

    For i = 1 To lastrow2

        For j = 1 To lastrow
            Searchfor = searcharr(i, 1)
                If candnumArr(j, 1) = Searchfor Then
                    For kk = 1 To 13
                        PartNumArr(i, kk - 1) = candnumArr(j, kk)
                        MarksArr(i, kk - 2) = candnumArr(j, kk)
                    Next kk
                    Exit For
                End If

        Next j

    Next i

    ' writeout the output arrays
    With ActiveSheet
            Range(.Cells(6, 13), .Cells(lastrow2, 13)) = PartNumArr
            Range(.Cells(6, 17), .Cells(lastrow2, 26)) = MarksArr
    End With

End Sub

Хотя код работает для первого листа и использует его поле со списком, я не знаю, как его изменить, чтобы он работал на всех 10 листах с этим списком.

1 Ответ

0 голосов
/ 10 июля 2019

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

Если это ActiveX Control, вы можете использовать один из этих 3-х методов (там даже больше):

Sub testBox()
    Dim ws As Worksheet

    For Each ws In ActiveWorkbook.Worksheets

        'If they have the same name
        Debug.Print ws.OLEObjects("ComboBox1").Object.Value

        'If you only have one ActiveX object per Page
        Debug.Print ws.OLEObjects(1).Object.Value

        'If you want to loop it and check by name....
        Dim cb As OLEObject
        For Each cb In ws.OLEObjects
            If Left(cb.Name, 8) = "ComboBox" Then Debug.Print cb.Object.Value
        Next cb

    Next ws
End Sub

Пример более или менее взят непосредственно из Официальной документации Microsoft! https://docs.microsoft.com/en-us/office/vba/excel/concepts/controls-dialogboxes-forms/using-activex-controls-on-sheets

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...