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

#excel #vba #excel-formula

Вопрос:

У меня есть список ячеек, содержащих даты. Некоторые даты являются последовательными (например. 2, 3, 4 сентября), в то время как некоторые из них автономны. Я надеялся сохранить все даты в одной ячейке, где последовательные даты будут храниться в виде диапазона, а все отдельные даты и диапазоны, разделенные запятой (например, «2 сентября», «3 сентября», «4 сентября», «8 сентября» будут храниться как «2-4 сентября, 8 сентября» вместо этого).

Есть ли способ сделать это с помощью формулы Excel?

Вот как в настоящее время выглядят данные:

Снимок Excel

И вот предполагаемый результат:

Снимок Excel 2

Я сделал несколько ошибок в этом, но ближе всего я подошел к созданию списка всех последовательных дат.

Комментарии:

1. Формула не является правильным методом для этого. Это лучше подошло бы для vba.

2. Насколько я знаю, с обычными формулами вообще нет никакого способа. Вам наверняка нужно будет что-то закодировать в VBA. На самом деле вы пометили вопрос VBA, поэтому, пожалуйста, опубликуйте код, который вы пробовали, где вы застряли и какие ошибки вы получаете.

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

Ответ №1:

Должен быть лучший способ, но ниже приведен один из способов, которым вы можете сделать это с помощью формулы, если у вас есть новейшая версия Excel. Я предполагаю, что ваши диапазоны простираются от столбца B до столбца L и начинаются во второй строке. Обратите внимание, что он чувствителен к форматированию, поэтому убедитесь, что он соответствует. Также обратите внимание, что он работает для диапазонов, которые затмевают месяцы, но не годы.

 =LET(v, TEXTJOIN(",",, TEXT(B2:L2, "m/d/yyyy")),
w, SUBSTITUTE(v, "1/0/1900,", "!"),
x, IFERROR(FILTERXML("<t><s>"amp;SUBSTITUTE(w, "!", "</s><s>")amp;"</s></t>", "//s"),""),
y, IF(RIGHT(x,1)=",", LEFT(x,LEN(x)-1), x),
z, LEN(y),
a, IF(z<11, y, LEFT(y, SEARCH(",",y)-1)amp;"-"amp;RIGHT(RIGHT(y,12), 12-SEARCH(",", RIGHT(y,12)))),
b, TEXT(MONTH(LEFT(a, SEARCH("-", a)-1))*29, "mmm")amp;" "amp;DAY(LEFT(a, SEARCH("-", a)-1)),
c, TEXT(MONTH(RIGHT(a, LEN(a)-SEARCH("-", a)))*29, "mmm")amp;" "amp;DAY(RIGHT(a, LEN(a)-SEARCH("-", a))),
d, IFERROR(IF(LEN(a)<11, TEXT(MONTH(a)*29, "mmm")amp;" "amp;DAY(a),
IF(LEFT(b,3)=LEFT(c,3), bamp;"-"amp;RIGHT(c, LEN(c)-4), bamp;"-"amp;c)),""),
TEXTJOIN(",  ",1,d))
 

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