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

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

Что я хотел бы сделать: я хотел бы добавить функцию Intellisense, которая будет работать только тогда, когда пользователи будут выбирать ячейки в четырех конкретных столбцах (BF, BG, CS и CT) во время работы на листе (не vbe).

Я хочу подражать чему-то вроде этого:
Intellisense

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

Когда пользователь нажимает на пустую ячейку:

  1. Им присваивается список значений на выбор
  2. Как только они выбирают это значение, оно добавляется в ячейку, а двоеточие прикрепляется к концу
  3. В той же самой ячейке я бы хотел, чтобы раскрывающийся список возвращался в соответствии с тем, что пользователь сначала выбрал и представил новые значения. (Список будет меньше первого списка, поскольку их первое значение сужает выбор)
  4. Как только пользователь выберет второе значение, он будет прикреплен к концу значения в ячейке вместе с другим двоеточием.
  5. Наконец, раскрывающийся список будет повторно заполняться в соответствии с тем, что пользователь выбрал, и представить их с последним набором значений (список будет меньше, чем первый и второй списки, поскольку эти значения сужают выбор), которые они выбирают, и затем законченное заполнение ячейки

Пример: в столбцах V, W и X указаны значения
Выходные данные Вариант | Одноместный вариант 1 | Премиальные пользовательские цвета доступны по дополнительной цене. Позвоните, чтобы уточнить цену. Соответственно.

  1. Когда пользователь нажимает на ячейку в столбце BF, они представлены сначала с выпадающим списком, который будет включать «Опция отпечатка» вместе с другими вариантами, найденными в столбце V.
  2. Если они выбрали «Опция отпечатка», тогда в текущую ячейку вводится «Имп. Параметр:»: список заполняется значениями, найденными в столбце W справа от «Опция отпечатка» (это означает, что в этом случае только «Одиночный вариант 1» будет в списке)
  3. Когда пользователь выбирает «Single Option 1», значение ячейки теперь «Option Imprint Option: Single Option 1:», и в списке теперь отображается только «Premium Custom Colors, доступные по дополнительной цене. Call for Quote».
  4. Когда пользователь выбирает это значение, значение ячейки будет завершено, показывая «Опция« Отпечаток »:« Один вариант 1: премиальные пользовательские цвета, доступные по дополнительной цене ». Call for Quote.», И список не отображается

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

Моя идея / мысли:
Я подумал, возможно, это возможно, используя Combo Box без стрелки раскрывающегося списка, чтобы воссоздать раскрывающийся список, но я не уверен, как или если этот метод может работать с этим, потому что значения должны повторно заполняться, и будет значение в ячейке после первого раунда значения, и я решил, что будет перезаписан. Единственное ограничение, которое у меня есть, я должен создать это на лету. Я не смогу перетащить элементы управления на рабочий лист заранее и избежать каких-либо дальнейших трудностей. Я хочу только сделать это по одной ячейке за раз, когда они будут выбраны.

Итак, наконец, мои вопросы:

  1. Возможно ли это воссоздать?
    • Если да, то как мне это сделать? (даже если метод сложный, я открыт для слушания)
  2. Если это невозможно, можете ли вы предложить способ, которым я мог бы сделать что-то подобное?

На самом деле существует множество способов достижения этого и, возможно, некоторых автоматических систем, которые близки к тому, что вы хотите. Если вы хотите пойти по пути создания собственного, я бы использовал UserForm который содержал только ListBox .

Существуют API-интерфейсы для отображения UserForm рядом с выбранной вами ячейкой и для удаления границы из UserForm чтобы она больше напоминала intellisense. Вероятно, вы также захотите обработать некоторый автоматический размер ListBox . Я оставлю все это вам, но рудиментарная версия будет выглядеть так:

введите описание изображения здесь

Основная идея заключалась бы в том, что вы создаете базу данных элементов на соответствующих уровнях, а затем повторно заполняете ListBox соответствующим массивом всякий раз, когда индекс уровня изменяется. Я бы сделал свою базу данных в XML, но вы могли бы сделать это, как вам угодно.

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

Шаг 1 : создайте UserForm котором есть только один ListBox и убедитесь, что для свойства MultiSelect установлено значение single. В приведенном ниже примере я назвал UserForm IntelliSense и ListBox lboxOptions .

Шаг 2 : это код скелета для пользовательской формы

 Option Explicit Private mItems() As String Private mSubItems1() As String Private mSubItems2() As String Private mSubItems3() As String Private mSubItems4() As String Private mIndex As Integer Private mCell As Range Private Property Let Index(val As Integer) mIndex = val Select Case val Case 0: lboxOptions.List = mItems Case 1: lboxOptions.List = mSubItems1 Case 2: lboxOptions.List = mSubItems2 Case 3: lboxOptions.List = mSubItems3 Case 4: lboxOptions.List = mSubItems4 End Select End Property Private Sub HandleItemSelected() Dim i As Integer 'Identify the selected item For i = 0 To lboxOptions.ListCount - 1 If lboxOptions.Selected(i) Then If mIndex = 0 Then 'Write to the cell and add a full stop mCell.Value = lboxOptions.List(i) & "." 'Trigger the next level of dropdown Index = i + 1 Else 'Write to the cell and close the window mCell.Value = mCell.Value & lboxOptions.List(i) Me.Hide End If End If Next End Sub Private Sub lboxOptions_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'Trap the return key event as if 'selected' If KeyAscii = vbKeyReturn Then HandleItemSelected End If End Sub Private Sub lboxOptions_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'Trap the click event as if 'selected' HandleItemSelected End Sub Private Sub UserForm_Activate() 'Reset the list and store the target cell Set mCell = Selection Index = 0 End Sub Private Sub UserForm_Initialize() 'Define the arrays of selections. 'I'd probably create an XML for this and read it into some arrays here. Const items As String = "Cake|IceCream|Pasta|Chips" Const subs1 As String = "Eggs|Flour|Butter|Sugar|Bake" Const subs2 As String = "Milk|Eggs|Sugar|Freeze" Const subs3 As String = "Eggs|Flour|Boil" Const subs4 As String = "Potatoes|Oil|Fry" mItems = Split(items, "|") mSubItems1 = Split(subs1, "|") mSubItems2 = Split(subs2, "|") mSubItems3 = Split(subs3, "|") mSubItems4 = Split(subs4, "|") End Sub 

Шаг 3 : введите этот код в событие Worksheet_SelectionChange

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Const DESIRED_ADDRESS As String = "A:A, C:C, E:E" Dim desired As Range IntelliSense.Hide 'Check if just one cell has been selected If Target.Cells.Count = 1 Then 'Check if target cell is one that we want Set desired = Me.Range(DESIRED_ADDRESS) If Not Intersect(Target, desired) Is Nothing Then 'Check that target cell is blank If Len(Target.Value) = 0 Then 'All criteria met so show 'IntelliSense' IntelliSense.Show False End If End If End If End Sub 

В Excel есть встроенные функции, которые вы можете адаптировать:

  1. вставить Comment – вызванный простым нажатием мыши
  2. вставьте сообщение « Data Validation – вызванное нажатием в ячейке
  3. вставьте раскрывающийся список Data Validation – чтобы направить выделение из известного списка
  4. используйте макрос события рабочего листа, чтобы отобразить UserForm

Из вашего подробного описания требований я бы выбрал вариант 4

Что вы можете описать, используя проверку данных. Ниже приведена статья, описывающая процесс: https://support.microsoft.com/en-us/kb/211485 . Это может быть не совсем то, что вы ищете, поскольку в итоге вы получите несколько ячеек с различными доступными параметрами, выбранными пользователем. Затем вы можете использовать формулу конкатената, чтобы собрать все элементы в одну ячейку. У кого-то еще может быть лучший способ сделать это в VBA, но это была моя первая мысль, когда я читал ваш пост. Надеюсь, это поможет.

  • excel в одном столбце на основе переменных записей в другом столбце
  • Свяжите динамическую базу данных с новой книгой в excel
  • цикл IF на основе состояния автофильтра
  • В excel Подсчет всех значений, основанных на условии в другом столбце и только max 3 раза, может быть подсчитан
  • Данные столбцов карты для сопоставления строк
  • Excel закрывается при очистке формулы ячейки с помощью VBA
  • когда вы меняете формат ячеек с помощью опции «Форматировать ячейки», тогда нет события excel
  • Измените источник данных таблицы Pivot, используя VBA
  • Как создать сценарий Excel, который заменяет значение столбца со значением столбца на другом листе?
  • Получить список файлов Excel в папке с помощью VBA
  • Excel - жесткий кодированный массив - идентификатор слишком длинный
  • Interesting Posts

    Остановить текстовое поле от автоматического обновления в VBA

    Объединить последовательные ячейки в столбце с одинаковыми значениями в excel

    Вставка текста в пустую строку с использованием макроса vba в excel

    EPPlus не вставляет исправление формулы

    «Транспонирование» таблицы в несколько столбцов

    Запретить вычисление ячейки

    Excel, VBA Vlookup, несколько возвратов в строки

    Сравните два значения и получите третий

    Как обойти предупреждение «Только для чтения» SharePoint при открытии книги Excel с помощью VBA.

    Возможно ли отобразить файл .xls в теге <object> html?

    Использование строкового массива в качестве критерия в автообновлении VBA

    Проверка VBA не работает должным образом

    Я хотел запустить пакетный файл, который запускает запрос и экспорт SQL-запросов в excel

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

    Итерация через файлы и подпапки и поиск текста

    Давайте будем гением компьютера.