Работая в 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 листах с этим списком.