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

Это работает нормально.

Я хотел бы выбрать 4 или 5 месяцев (множественный выбор) из выпадающего меню (Проверка данных) и отобразить значения в ячейках ниже.

Это возможно?

2 ответа2

1

Я сделал выпадающее меню (проверка данных), я хотел бы выбрать несколько вариантов из выпадающего меню

Это возможно, хотя мне нужен VBA для этого.

Код, который я сейчас использую:

Private Sub Worksheet_Change(ByVal Target As Range)

' Vars to store the contents the cell which we are changing.
Dim oldVal As String
Dim newVal As String

' In range
Dim rngDV As Range

' We do not even try to handle multiple cells at the same time.
If Target.Count > 1 Then GoTo exitHandler

' We are called because a single cell is getting changed.
' If it is a drop down list then we want to act. If not skip dropdown code all the way to exit)
On Error Resume Next
Set rngDV = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitHandler

' rngDv is filled with Cells.SpecialCells(xlCellTypeAllValidation)
' That can be empty. In which case skip to end.
If rngDV Is Nothing Then GoTo exitHandler


' Check if our cell is in range in a complicated way.
' If not insersect might be cleaner. Then I can remove the else.
If Intersect(Target, rngDV) Is Nothing Then
   'do nothing
Else
  ' OK, we are changing one of the drop down lists in our range.
  ' Block new changes until we have finished.
  Application.EnableEvents = False
  ' Excel has already written the new value to the cell.
  ' This new value will replace our own content.
  ' Three options here:
  ' 1) We are adding a value for the first time.
  ' 2) We already have a value, opened drop down and did not select anything
  ' 3) We had a value and select a new option -> Action needed to APPEND rather than REPLACE

  ' Rescue the new value in a string
  newVal = Target.Value

  ' We also want the old value, bt atm it is already gone. Lets do a generic undo to get it back.
  Application.Undo
  oldVal = Target.Value

  ' Re-replace with new content.
  ' If we are in range for our special actions we do will do this it again later.
  ' If we are not in in our special section and do not replace then we effective
  ' block all changes. That is not desired.
  Target.Value = newVal


  ' Are we in range of [BC,BJ]?
  ' (A-Z = 1-26, AA-AZ is 27,52, ...
  '
  If (Target.Column >= 55 And Target.Column  2) Then
    If (oldVal = "" Or newVal = "") Then
      'Case 1 or case 2 as mentioned above
    Else
      ' Finally, actual action code!

      ' Returns an integer specifying the start position of the first occurrence of one string within another.
      ' https://msdn.microsoft.com/en-us/library/8460tsh1%28v=vs.90%29.aspx
      '
      ' We are going to use this for a mode 1 (text) comparision between the old cell content and the new entry.
      ' If the new entry is already somewhere in the old string then instr returns its position.
      '
      ' Creatively use this to check if the value is present (we do not care WHERE in the string).
      '
      If (InStr(1, oldVal, newVal)) > 0 Then
      ' If we already have the same aswer in our cell.

      ' Instead of appending it and thus adding it a second time we will remove it.
      ' This allows use the easily remove a selection from a list, even if we already have a long list of entries.

          ' https://msdn.microsoft.com/en-us/library/dxs6hz0a%28v=vs.90%29.aspx
          ' Right returns a string which we ca compare with.

          If Right(oldVal, Len(newVal)) = newVal Then
              Target.Value = Left(oldVal, Len(oldVal) - Len(newVal) - 2)
          Else
              ' Replace ( string1, find, replacement, [start, [count, [compare]]] )
              '
              ' Search in the string with the old answers.
              ' for "new value, "
              ' and remove it by replacing it with nothing.
              '
              Target.Value = Replace(oldVal, newVal & ", ", "")
          End If

      Else
          ' Append the new change. Add a comma as cvs like separator.
          Target.Value = oldVal & ", " & newVal

      End If

    End If
  End If

' end of If Intersect(Target, rngDV)
End If

exitHandler:
  Application.EnableEvents = True
End Sub

Это моя первая попытка VBA, и некоторые значения довольно жестко закодированы.
(Например, If (Target.Column >= 55 And Target.Column <= 62 And Target.Row > 2) чтобы выбрать диапазон, в котором я действую).

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


и отобразите значения в ячейках ниже.

Вы, конечно, можете скопировать ячейку. Текущий код объединяет все выборки (и удаляет один, если вы выберете его дважды) и помещает его как строку в ячейку. Эту строку можно скопировать в любое место, используя стандартные функции Excel.

0

Если вы имеете в виду выпадающий список, основанный на выбранном месяце, вы должны написать свои месяцы, затем иметь столбец заголовка с каждым месяцем и внизу соответствующие значения, затем определить имя этого столбца, например, название месяца, и с проверкой данных выберите Список в настройках. и = косвенный (ссылка на месяц) январь февраль март, затем в другом столбце январь значение1 значение2 значение3 ... выберите и определите имя как январь в столбце февраль info1 info2 info3 ... выберите и определите имя февраль ... в листе, где вы выбираете месяц (B2) со списком проверки данных для месяцев в другой ячейке, создайте список настроек проверки данных и укажите источник = Косвенный (B2)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .