Преобразование заголовков столбцов в список записей ComboBox в VBA / Excel - PullRequest
1 голос
/ 25 апреля 2019

У меня есть выпадающий список в пользовательской форме, который я хотел бы заполнить списком значений.

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

|--|--A--+--B--+--C--+--D--+ ... +
|--|-----+-----+-----+-----+
|1 |     |     |     |     |
|--|-----+-----+-----+-----+
|2 |  << other data here >>|        
|--|     +-----+-----+-----+
|3 |  "  |  a  |  b  |  c  | ...    <~~ row 3 data (needed as 2nd element in combobox)
|--|     +-----+-----+-----+
|4 |  "  |  d  |  e  |  f  | ...    <~~ row 4 data (needed as 1st element in combobox)
|--|     +-----+-----+-----+
|5 |  "  |  1  |  2  |  3  |
|--|     +-----+-----+-----+
|6 |  "  |  4  |  5  |  6  |
|--|-----+-----+-----+-----+
|7 |  "  |  7  |  8  |  9  |
|--|-----+-----+-----+-----+

Я хочу, чтобы записи списка в выпадающем списке выглядели так:

d   a
e   b
f   c

Эта пользовательская форма инициализируется другой пользовательской формой, которая выбирает из нескольких вариантова затем активирует правильный лист из нескольких листов, которые имеют похожую информацию.Когда вторая пользовательская форма инициализируется, она должна заполнить комбинированный список данными в примере выше.Я создал список значений из одного столбца, используя:

Private Sub UserForm_Initialize()

    'ReferenceCombo.ColumnCount = 2
    'Range("B4", Range("B" & Rows.Count).End(xlUp)).Name = "Dynamic"
    'Me.ReferenceCombo.RowSource = "Dynamic"

End Sub

Я также могу получить список всех значений в строке, используя:

Dim sht As Worksheet
Set sht = ActiveSheet

    ReferenceCombo.ColumnCount = 2
    sht.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Name = "Dynamic"
    sht.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Select
    Me.ReferenceCombo.RowSource = "Dynamic"

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

Я пробовал информацию из здесь , но, похоже, это не относится к пользовательским формам.Информация здесь помогла в правильном выборе строки. Этот был полезен при выборе динамического поля. Здесь Я нашел информацию о транспонировании списка, но я не уверен, что понял его полностью. Это относится к диапазону заполнения списка, но я не уверен, что это также относится и к комбинированным спискам на пользовательских формах. Это относится к вставке функции транспонирования, но у меня это не сработало.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 25 апреля 2019

Назначить информацию заголовка в строках 4 и 3 для Combobox

Насколько я понимаю ваше сообщение, вы хотите извлечь информацию заголовка, начиная с ячейки B3 до последнего столбца в строке 4 , но для отображения данных в обратном порядке строк в комбинированном ящике.

Вы можете назначить эти данные для варианта 2-dim массива, реструктурировать его, используя расширенные возможности функции Application.Index *), и присвоить массив свойству Combobox'es .Column в одну строку (чтобы избежать дальнейшая ретранспозиция через наиболее часто используемое свойство .List).

*) см. Расширенные возможности функции Application.Index

Option Explicit                     ' declaration head of Userform code module

Private Sub UserForm_Initialize()
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [1] assign data to variant 1-based 2-dim array v
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Dim v As Variant, nCols As Long
  nCols = Sheet7.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Columns.Count
  v = Sheet7.Range("B1").Resize(4, nCols).Value2          ' e.g. B1:X4 (if X4 is last column)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [2] restructure array by filtering rows 4,3 and all columns Array(1,2,3,...)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  v = Application.Index(v, Application.Transpose(Array(4, 3)), allCols(nCols))
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [3] assign data to combobox via .Column property
'      (instead of assigning the transposed array to the .List property)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Me.ReferenceCombo.Column = v
End Sub

Private Sub UserForm_Layout()
  Me.ReferenceCombo.ColumnCount = 2
End Sub

Private Function allCols(ByVal ColNum As Long) As Variant()
' Purpose: return array with column numbers from 1,2, to ...ColNum
  ReDim temp(0 To ColNum - 1)
  Dim i As Long
  For i = LBound(temp) To UBound(temp)
      temp(i) = i + 1
  Next i
  allCols = temp
  End Function

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