MS Excel, Узнайте, сколько элементов описывает ячейка.

Вопрос или проблема

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

1-3,5-7,12-23, 25,28-34,36-38,43.

То есть у меня есть выпуски с 1 по 3, с 5 по 7, с 12 по 23, 25 и т. д.

Мне следовало бы подсчитать общее количество для каждого комикса, но я задаюсь вопросом, есть ли способ “посчитать” количество комиксов для каждого типа из моего списка выпусков?
Спасибо

Если у вас есть Excel 365, вы можете использовать эту формулу:

=LET(step1,VALUE(TRIM(TEXTSPLIT(A1,"-",","))),step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1))),SUM(step2))
  • LET() принимает имена переменных и значения, а затем сохраняет эти значения для последующего использования по имени переменной.
  • step1,VALUE(TRIM(TEXTSPLIT(A1,"-",","))) разбивает ваш текст на строки (когда есть запятая) и столбцы (когда есть дефис), удаляет все пробелы, а затем преобразует его из текста в числовое значение. Полученный массив сохраняется как step1.
  • step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1))) выглядит намного сложнее (по крайней мере для меня), но он проходит через каждую строку step1 и вычитает первое значение из второго. Если второго значения нет, то у step1 возникает ошибка, поэтому мы используем IFERROR(), чтобы вернуть 1 в этом случае.
  • SUM(step2) суммирует результат.

Скриншот

Нам нужно:

a) разбить строку по запятым, чтобы получить уникальные диапазоны, и

b) разбить каждый диапазон по дефису, чтобы рассчитать, сколько элементов представлено в нем.

Если диапазон состоит из двух чисел, тогда мы рассчитываем INDEX(p,,2)-INDEX(p,,1)+1.

Если диапазон состоит лишь из одного числа, мы можем преобразовать его в такой же формат с помощью INDEX(p,,1)-INDEX(p,,1)+1.

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

Мы применяем функцию для расчета (b) к массиву, полученному из (a), а затем суммируем результат.

=SUM(
    MAP(
        TEXTSPLIT(B2, ","),
        LAMBDA(s,
            LET(
                p, --TEXTSPLIT(s, "-"),
                INDEX(p, , COUNT(p)) - INDEX(p, , 1) + 1
            )
        )
    )
)

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

Еще один вариант.
Этот список чисел можно преобразовать в адреса, и можно подсчитать сумму строк.
Итоговая формула:

=REDUCE(0, SUBSTITUTE("A"&TEXTSPLIT(SUBSTITUTE(A2," ",""),","),"-",":A"),
 LAMBDA(a, x, a+ROWS(INDIRECT(x))))

CountRows

Счетчик выпусков как отдельный скрипт на Python:

#!/bin/env python

def issues(lst="1-3,5-7,12-23, 25,28-34,36-38,43."):
    L=0
    x=lst.split(",")
    for rng in x:
        rng=rng.strip('. ')
        if '-' in rng:
            a,b=rng.split('-')
            a=int(a)
            b=int(b)+1
        else:
            a=int(rng)
            b=a+1
        
        r=range( a, b ) 
        print(
            f'{rng:>6}',
            '\t',a,b,
            '\t',L,'-',
            ','.join( [ f'{z}' for z in r] ) 
            )
        L+=len(r)
    return L

print(issues())

Примечание: Некоторые версии Excel могут запускать python-скрипты, но только отправляя их в облако.

Код: Две print() инструкции предназначены для проверки правильности вывода, с примером списка выпусков в качестве параметра по умолчанию для функции.

Пример выполнения, как есть:

$ python ./issues.py 
   1-3   1 4     0 - 1,2,3
   5-7   5 8     3 - 5,6,7
 12-23   12 24   6 - 12,13,14,15,16,17,18,19,20,21,22,23
    25   25 26   18 - 25
 28-34   28 35   19 - 28,29,30,31,32,33,34
 36-38   36 39   26 - 36,37,38
    43   43 44   29 - 43
30

… удалите инструкции print() и остальная часть — это функция, которую можно импортировать в чистом Python; как использовать ее в Excel, не известно (мне) на момент написания этого.

Ответ или решение

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

1. Использование формулы в Excel 365

Если у вас есть Excel 365, вы можете воспользоваться следующей формулой с использованием функции LET, которая позволит более эффективно обрабатывать данные:

=LET(step1,VALUE(TRIM(TEXTSPLIT(A1,"-",","))),step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1))),SUM(step2))

Объяснение формулы:

  • LET: Эта функция определяет именные переменные для использования в вычислениях. Здесь используются step1 и step2.
  • TEXTSPLIT: Разделяет содержимое ячейки на элементы, сначала по запятой (для разделения диапазонов), затем по дефису (для разделения ограничений диапазона), убирая пробелы.
  • VALUE: Преобразует текстовое значение в числовое.
  • BYROW: Применяет функцию к каждому элементу в массиве, вычисляя количество элементов в каждом диапазоне.
  • IFERROR: Обрабатывает возможные ошибки, возвращая 1, если диапазон содержит только одно число.
  • SUM: Подсчитывает общее количество всех элементов.

Эта методика позволяет эффективно обработать сложные диапазоны и подвести итог по количеству комиксов для каждой категории.

2. Альтернативное решение с использованием MAP

Для более наглядного подхода можно использовать следующую формулу, которая упрощает логику подсчёта:

=SUM(
    MAP(
        TEXTSPLIT(B2, ","),
        LAMBDA(s,
            LET(
                p, --TEXTSPLIT(s, "-"),
                INDEX(p, , COUNT(p)) - INDEX(p, , 1) + 1
            )
        )
    )
)

За счёт этого метода:

  • Мы сначала разбиваем строки по запятой для получения отдельных диапазонов.
  • Затем для каждого диапазона вычисляем общее количество, используя тот же принцип обращения к элементам массива.

3. Использование функции REDUCE и адресации

Ещё один интересный способ подсчёта может быть реализован с помощью сочетания функций SUBSTITUTE и INDIRECT:

=REDUCE(0, SUBSTITUTE("A"&TEXTSPLIT(SUBSTITUTE(A2," ",""),","),"-",":A"),
 LAMBDA(a, x, a+ROWS(INDIRECT(x))))

Здесь:

  • SUBSTITUTE: Удаляет лишние пробелы и преобразует диапазоны в адреса.
  • REDUCE: Суммирует количество строк в каждом диапазоне, вычисляемым с помощью ROWS и INDIRECT.

4. Сценарий на Python

Если вам удобнее работать с Python, вы можете использовать следующий сценарий для подсчёта:

def issues(lst="1-3,5-7,12-23, 25,28-34,36-38,43."):
    L=0
    x=lst.split(",")
    for rng in x:
        rng=rng.strip('. ')
        if '-' in rng:
            a,b=rng.split('-')
            a=int(a)
            b=int(b)+1
        else:
            a=int(rng)
            b=a+1

        r=range(a, b) 
        L += len(r)
    return L

print(issues())

Этот скрипт обрабатывает строку формата 1-3,5-7,..., подсчитывая общее количество изданий.

Заключение

Каждый из предложенных методов позволяет вам подсчитать количество позиций в заданной строке с номерами изданий. Метод с формулами в Excel наиболее предпочтителен для использования непосредственно в вашем документе, а сценарий на Python может быть полезен для более сложных задач обработки данных. Выберите подходящий способ в зависимости от ваших потребностей и удобства работы с инструментом.

Оцените материал
Добавить комментарий

Капча загружается...