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

Я пытаюсь закодировать то, что звучит как дерево сегментов или интервалов, но я не уверен, как это сделать в VBA. По сути, я пытаюсь взять список чисел и посмотреть, попадают ли они под список диапазонов. В реальном мире номера относятся к клиентам, и эти диапазоны назначаются разным сайтам компании. Например, предположим, что у нас есть 3 числа (они же клиенты) для ввода: 156000, 166000 и 256000. Сайт 1 получает всех клиентов от 145000 до 149000, от 152300 до 155000 и от 165000 до 165999. Сайт 2 получает всех клиентов от 156000 до 159000. , 162 000 и 165 000, а также от 255 000 до 275 000. Сайт 3 получает любых клиентов в диапазоне от 166 000 до 180 000. Поэтому я хотел бы, чтобы функция могла сказать, что клиент один и третий перейдут на сайт 2, а клиент два перейдет на сайт три. . Таким образом, каждый сайт имеет от одного до восьми непоследовательных диапазонов, связанных с ним.

Количество номеров (клиентов), которые проверяются по диапазонам, может варьироваться от 1 до 5000, но количество диапазонов составляет около 3000, распределенных по 497 различным сайтам, которые со временем будут медленно увеличиваться, но будут обновляться статически. Номера клиентов будут скопированы/вставлены в столбец K моего рабочего листа Excel. Диапазоны сайтов у меня будут на другом листе в той же книге. Первоначально я пытался просто сделать тонны операторов if/then, но похоже, что список из 3000 операторов if/then не может быть лучшим способом. Затем я подумал о создании многоуровневого списка операторов if/then, сначала просто взглянув на первые два числа номера клиента, хранящиеся в столбце L, например:

If Worksheets("Input").Range("L" & x) >= 14 and _
If Worksheets("Input").Range("L" & x) =< 19 then

    If Worksheets("Input").Range("K" & x) >= 145000 and _
    If Worksheets("Input").Range("K" & x) >= 146000 then

      [code to assign customer to specific site]
    End If

    If Worksheets("Input").Range("K" & x) >= 245000 and _
    If Worksheets("Input").Range("K" & x) >= 246000 then

      [code to assign customer to specific site]
    End If
End If

Проблема с этим заключается в том, что каждый сайт имеет непоследовательные диапазоны, поэтому я не уверен, смогут ли вообще работать многоуровневые операторы if/then.

У кого-нибудь есть идеи, как это можно эффективно сделать с таким большим количеством диапазонов?

Заранее спасибо!


person JGTIII    schedule 21.02.2016    source источник
comment
Рассматривали ли вы возможность использования VLookup? То, что вы описываете, было бы кошмаром для поддержки в формате кода.   -  person LaloInDublin    schedule 22.02.2016


Ответы (1)


Это очень легко сделать с помощью VLookup (диапазон) в сочетании с меньшим условным тестом, чтобы убедиться, что пустые места между диапазонами не пропущены. VBA не требуется:

Представление Excel

person LaloInDublin    schedule 21.02.2016