2016-05-13 6 views
1

Я пытаюсь заполнить список портов на основе кода маршрута, выбранного в раскрывающемся меню. Выпадающий находится в диапазоне BASE_RouteCode ('Schedule Tool'!$F$8), коды маршрута хранятся в динамическом диапазоне RouteCodes (=Routes!$B$2:INDEX(Routes!$B$2:$B$27, COUNTA(Routes!$B$2:$B$27))), и списки портов хранятся вдоль строк из каждого кода маршрута в RoutePorts (=Routes!$B$2:INDEX(Routes!$B$2:$AZ$27, COUNTA(Routes!$B$2:$AZ$27))) ,Заполнение списка на основе выпадающего списка

Цель состоит в том, чтобы каждое изменение BASE_RouteCode запускает подраздел, который заполняет список портов; в настоящий момент я объединил это как быструю попытку.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 
    Set KeyCells = Range("BASE_RouteCode") 
    Call PopulatePortList 
End Sub 

Sub PopulatePortList() 

Dim iCol As Integer, iRow As Integer 
If IsNumeric(WorksheetFunction.Match(Range("BASE_RouteCode").Value, Range("Routecodes"), 0)) Then 
    iRow = WorksheetFunction.Match(Range("BASE_RouteCode").Value, Range("Routecodes"), 0) + 1 

    ' Testing code 
    MsgBox "Row number for route " & Range("BASE_RouteCode").Value & " is " & iRow 
    Worksheets("Schedule Tool").Cells(8, 9).Value = iRow 

    ' FOR ... WHILE loop (through iCol values) to populate list goes here 

Else 
    MsgBox "Please select a valid route code." 
End If 
End Sub 

При изменении значения раскрывающегося списка, хотя, есть краткое мерцание чего-то, но ничего явно не происходит, и ни одна из точек останова в коде не срабатывает.

вопросительные знаки:

  • Я не уверен, если KeyCells должны быть такими же, как Target; что был скопирован из примера, который я нашел в другом месте, но ни один из них не работает .
  • Если я попытаюсь запустить PopulatePortList вручную, я получаю сообщение об ошибке 1004 , когда он входит в предложение IF.

Куда я иду не так?

ответ

1

Пожалуйста, обратите внимание на следующем (скорректированный) код и дайте мне знать, если это работает для вас:

Private Sub Worksheet_Change(ByVal Target As Range) 
    'The following line makes sure that this event will only continue if 
    ' "BASE_RouteCode" has been changed and not if ANY of the other 
    ' cells on this sheet have been changed. 
    If Intersect(Target, Range("BASE_RouteCode")) Is Nothing Then Exit Sub 
    'Unless there is a global variable called "KeyCells" there is not need 
    ' for the following two lines 
    'Dim KeyCells As Range 
    'Set KeyCells = Range("BASE_RouteCode") 

    'The following line makes sure than any changes to the sheet 
    ' (while the code is running) will not trigger another 
    ' Worksheet change event. Otherwise, this will result in 
    ' an endless loop and might crash Excel 
    Application.EnableEvents = False 
    Call PopulatePortList 
    'Enable Events again before exiting. Otherwise this event will not work anymore. 
    Application.EnableEvents = True 
End Sub 

Sub PopulatePortList() 

Dim iRow As Long 
Dim rngFound As Range 

Set rngFound = Worksheets("Routes").Range("Routecodes").Find(Worksheets("Schedule Tool").Range("BASE_RouteCode").Value, , xlValues, xlWhole) 
If Not rngFound Is Nothing Then 
    iRow = rngFound.Row + 1 

    ' Testing code 
    MsgBox "Row number for route is " & rngFound.Row & ", " & _ 
     Chr(10) & "iRow is set to " & iRow & _ 
     Chr(10) & "and the value of BASE_RouteCode is " & rngFound.Value 
    Worksheets("Schedule Tool").Cells(8, 9).Value = iRow 

    ' FOR ... WHILE loop (through iCol values) to populate list goes here 

Else 
    MsgBox "Please select a valid route code." 
End If 

End Sub 

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

+0

Это сработало отлично - огромное спасибо! –

1

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

Если это так, то я не думаю, что вам нужно событие изменения рабочего листа. Если вы просто используете комбинацию «Формы» (лента разработчика, группа «Управление», «Вставить», затем выберите комбо в категории «Формы»), вы можете щелкнуть правой кнопкой мыши по ней и присвоить ей макрос. Этот макрос будет срабатывать, когда пользователь изменяет комбо. Эта комбинация заполняется щелчком правой кнопки мыши и выбором формата управления, а затем помещением в диапазон ввода. Вы также можете указать ячейку, которая будет заполнена индексом выбора (Cell Link).

+0

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

+0

Попытка выяснить, как назначить макрос ... похоже, что он может иметь другой метод в текущей версии Excel. «Assign Macro», как указано в командных окнах, не находится в контекстном меню combobox. Будет продолжать охоту. –