Я настраиваю рабочую таблицу, которая содержит код VBA, который помещает ComboBox в любую ячейку, в которую я перехожу, и которая использует Datavalidation.
Всякий раз, когда я иду в ячейку, которая использует датализацию, он активирует ComboBox и перемещает ComboBox в мою выбранную ячейку. Когда я выбираю новую ячейку, она перемещает ComboBox на новую позицию или, если ячейка не содержит DataValidation, она скрывается.
Проблема в том, что у меня есть около 1000 строк и 2 столбцов, по которым я легко хочу перемещаться, и все они будут вводить любой из опций списка, которые я использую для своего подтверждения данных. Поэтому я предпочел бы иметь возможность перемещаться вверх и вниз по моим строкам, а также вправо и влево между столбцами без использования моей мыши.
Сейчас я не могу этого сделать. Когда я захожу в ComboBox, он автоматически позволяет мне печатать его, и если я продолжаю нажимать клавиши со стрелками, я просто прокручиваю свой список ComboBox.
Я успешно добавил код, который позволяет мне нажимать клавишу ВВОД, чтобы перейти вниз, и клавишу Tab, чтобы перейти вправо, но это не сработает, если я изменю кнопку на одну из клавиш со стрелками, и я не уверен, как ее отредактировать, чтобы я мог перейти вверх или слева. Без этого кода я могу использовать только «выход» или щелчок мышью, чтобы снять фокусировку с этой ячейки.
Моим предпочтительным решением было бы добавить оператор if где-то в коде, который требует, чтобы я удерживал Control или что-то перемещалось без активации кода. Например
Активировать код ComboBox
IF Control не нажата
И если текущая ячейка содержит анализ данных.
Это код, который я использую.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Update by Extendoffice: 2018/9/21
Dim xCombox As OLEObject
Dim xStr As String
Dim xWs As Worksheet
Dim xArr
Set xWs = Application.ActiveSheet
On Error Resume Next
Set xCombox = xWs.OLEObjects("TempCombo")
With xCombox
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
End With
If Target.Validation.Type = 3 Then
Target.Validation.InCellDropdown = False
Cancel = True
xStr = Target.Validation.Formula1
xStr = Right(xStr, Len(xStr) - 1)
If xStr = "" Then Exit Sub
With xCombox
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 5
.Height = Target.Height + 5
.ListFillRange = xStr
If .ListFillRange = "" Then
xArr = Split(xStr, ",")
Me.TempCombo.List = xArr
End If
.LinkedCell = Target.Address
End With
xCombox.Activate
End If
End Sub
Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 9
Application.ActiveCell.Offset(0, 1).Activate
Case 13
Application.ActiveCell.Offset(1, 0).Activate
End Select
End Sub