Мой VBA прошел долгий путь с помощью этой темы:
VBA с помощью ListBox для множественного выбора всего столбца в Excel
Использование этого решения:
Dim Ws As Worksheet, Rng As Range, c As Range, Sel As Range
Dim i As Long, Xval As Variant
Set Ws = ThisWorkbook.Sheets("Sheet1")
Set Rng = Ws.Range(Ws.Cells(2, 1), Ws.Cells(2, Me.ListBox1.ListCount))
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
Xval = Me.ListBox1.List(i)
Set c = Rng.Find(Xval, LookIn:=xlValues)
If Not c Is Nothing Then
If Sel Is Nothing Then
Set Sel = Ws.Columns(c.Column)
Else
Set Sel = Union(Sel, Ws.Columns(c.Column))
End If
End If
End If
Next
If Not Sel Is Nothing Then
Sel.Select
End If
Так что эта работа отлично подходит для открытого одностраничного CSV-файла в Excel, как я и хотел.Проект вырос и теперь использует несколько рабочих книг с разными именами файлов и именами вкладок.
Для простоты три имени файлов: start.csv, run.csv, stop.csv.каждая из которых содержит только одну вкладку / лист ...., но может быть легко объединена в один файл и иметь 3 вкладки ..... так что это не является жестким ограничением.
Так как она вытягиваетсравнить / заголовки из строки 2 файла, чтобы заполнить список, который является заголовком столбца, каждый файл имеет одинаковый набор заголовков для каждого из 3 файлов ..... так что происходит, когда я выбираю нужный сигнал, он выделяет столбец, который совпадает во всех 3 файлах одновременно, и затем вылетает, когда выбрано 2 или более.
Что я хотел бы сделать, это выбрать ТОЛЬКО сигнал из пользовательской формы спискана активной рабочей книге / листе, который находится в фокусе, не на всех 3 файлах.
Я пробовал следующее:
'Set Ws = ThisWorkbook.Sheets("Sheet1")
'Set Ws = ThisWorkbook.Sheets(1)
Set Ws = ThisWorkbook.ActiveSheet
'Set Ws = ActiveSheet
и при обычном использовании для одного листа вариант 4 имеетработал через dev .... но это то, что вылетает при использовании нескольких рабочих книг.
Я перепробовал все 3 других варианта, но ни один из них, похоже, не решил проблему, поэтому я в растерянностикак сказать это выбрать только на активном, в фокусе, книга / лист.
Я пытался посмотреть, смогу ли я захватить имя вкладки / листа и вставить его в Ws как лист, но я получаю ошибки несоответствия.Поэтому я не могу разобраться в правильном синтаксисе, чтобы эта работа работала на нескольких листах.
Есть идеи, как мне решить эту проблему?
TY.
РЕДАКТИРОВАТЬ:
Добавление изображения на основе вопроса
Это код, который вызывает список для обновления.Затем label.caption обновляется, каждый раз вызывая эту функцию для обновления списка сигналов:
Private Sub UpdateSignalListBox()
'If Me.ChkBoxAutoUpdateSignalBox = True Then
'Figure out how many actual columns headers there are and then search for signal names
Dim FoundColumnRangeCalculated As Variant
Dim Lastcol As Variant
Dim FoundColumnRange As Variant
With ActiveSheet
Lastcol = .Cells(2, .Columns.Count).End(xlToLeft).Column
''MsgBox Lastcol
End With
'Convert numerical column location to letter value to use as dynamic range header lookup
Dim NumberToColumn As Variant
Dim SearchColumn
SearchColumn = Lastcol
NumberToColumn = Left(Cells(1, SearchColumn).Address(1, 0), InStr(1, Cells(1, SearchColumn).Address(1, 0), "$") - 1)
'MsgBox NumberToColumn
'Build the actual range from found column headers
FoundColumnRangeCalculated = "A2:" & (NumberToColumn & Lastcol)
'Transfer headers vertically to the list box for user to see
ListBox1.List = Application.WorksheetFunction.Transpose(Range(FoundColumnRangeCalculated))
ListBox1.Selected(0) = True
'End If
End Sub