Страницы: 1
RSS
счет количества я ячейке, подсчет количества штук я ячейке
 
добрый день, подскажите возможно ли реализовать подсчет количества в ячейке?
пример: в столбце а указанны комплекты, а в столбце b необходимо подсчитать количество
комплекты могут быть указаны как через запятую, так и через тире.
                  a  b
 1,3,5,9-15,85,10112
 100-109, 112, 135-500 377
  500,5015,6587 3
1000-1009 10
Изменено: aksell - 30.04.2024 20:51:22
 
Используя UDF - не особо сложно.
Например используя уже готовую ExpandListA() (код есть тут в поиске):
Код
=ДЛСТР(ExpandListA(A1;",";"-"))-ДЛСТР(ПОДСТАВИТЬ(ExpandListA(A1;",";"-");";";""))+1
Изменено: Hugo - 30.04.2024 21:18:41
 
по старинке массивно
=SUM(--TEXT(MMULT(IFERROR(MID(SUBSTITUTE(TRIM(MID(SUBSTITUTE(","&A2;",";REPT(" ";99));ROW($1:$10)*99;99));"-";REPT(" ";15));{1\15};15)*{-1\1}+{0\1};);{1;1});"#;1;0"))
По вопросам из тем форума, личку не читаю.
 
Для Excel 365:
=LET(x;--ТЕКСТРАЗД(A2;"-";",";;;);y;ВЗЯТЬ(x;;-1);СУММ((y-ВЗЯТЬ(x;;1))*(y>0)+1))
Изменено: Бахтиёр - 01.05.2024 12:32:51
 
power query
Код
    Table.AddColumn(
        Source, 
        "b", 
        each List.Count(
            Expression.Evaluate("{" & Text.Replace([a], "-", "..") & "}")
        )
    )
Пришелец-прораб.
 
Цитата
в столбце b необходимо подсчитать количество
комплекты могут быть указаны как через запятую, так и через тире.
Код
Sub GetKol_vo()
Dim mo As Object
Dim n As Integer
Dim i As Long
Dim iLastRow As Long
Dim iVol_1 As Long
Dim iVol_2 As Long
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 Range("B1:B" & iLastRow).ClearContents
With CreateObject("VBScript.RegExp")
  .Global = True
  .Pattern = "[^,]+"
  For i = 1 To iLastRow
    If .Test(Cells(i, 1)) Then
      Set mo = .Execute(Cells(i, 1))
      For n = 0 To mo.Count - 1
        If InStr(1, mo(n), "-") > 0 Then
           iVol_1 = Split(mo(n), "-")(0)
           iVol_2 = Split(mo(n), "-")(1)
           Cells(i, 2) = Cells(i, 2) + iVol_2 - iVol_1 + 1
        Else
          Cells(i, 2) = Cells(i, 2) + 1
        End If
      Next
    End If
  Next
End With
End Sub
Изменено: Kuzmich - 01.05.2024 22:20:12
 
Еще вариант макросом. Исходные данные в столбце А начиная с А1
Код
Sub enstaraldg()
Dim Rg1 As Range, Arr1, Tp1, Tp2, nK&, i&, j&
Set Rg1 = ActiveWorkbook.ActiveSheet.Cells(1).CurrentRegion.Columns(1)
Arr1 = Rg1.Value
For i = 1 To UBound(Arr1)
    Tp1 = VBA.Split(Arr1(i, 1), ",")
            For j = 0 To UBound(Tp1)
                If Tp1(j) Like "*-*" Then
                    Tp2 = VBA.Split(Tp1(j), "-")
                    nK = nK + Tp2(1) - Tp2(0) + 1
                Else: nK = nK + 1
                End If
            Next j
    Arr1(i, 1) = nK: nK = 0
Next i
Rg1.Offset(, 1) = Arr1
End Sub
 
Евгений Смирнов,  по скорости едва заметно медленнее, но  точно короче
Код
            For j = 0 To UBound(Tp1)
                    Tp2 = VBA.Split(Tp1(j), "-")
                    nK = nK + Tp2(UBound(Tp2)) - Tp2(0) + 1
            Next j
По вопросам из тем форума, личку не читаю.
 
БМВ
Цитата
Евгений Смирнов,  по скорости едва заметно медленнее, но  точно короче
Справку по Split бегло просматривал подумал, что если нет разделителя ошибка будет. Оказывается функция Split всегда возвращает массив. Спасибо.
В принципе можно еще оду переменную выбросить.
Код
Sub enstaraldg1()
Dim Rg1 As Range, Arr1, Tp1, Tp2, i&, j&
Set Rg1 = ActiveWorkbook.ActiveSheet.Cells(1).CurrentRegion.Columns(1)
Arr1 = Rg1.Value
For i = 1 To UBound(Arr1)
    Tp1 = VBA.Split(Arr1(i, 1), ","): Arr1(i, 1) = 0
        For j = 0 To UBound(Tp1)
            Tp2 = VBA.Split(Tp1(j), "-")
            Arr1(i, 1) = Arr1(i, 1) + Tp2(UBound(Tp2)) - Tp2(0) + 1
         Next j, i
Rg1.Offset(, 1) = Arr1
End Sub
 
Что-то такое):
Код
=ЕСЛИОШИБКА(СУММ(-(ФИЛЬТР.XML("<h><b>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;"-";",-");",";"</b><b>")&"</b></h>";"//b[.<0]")+ФИЛЬТР.XML("<h><b>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;"-";",-");",";"</b><b>")&"</b></h>";"//b[.<0]/preceding::b[1]")-1));0)+ЕСЛИОШИБКА(ЧСТРОК(ФИЛЬТР.XML("<h><b>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;"-";"---");",";"</b><b>")&"</b></h>";"//b[.>0]"));0)
Изменено: Serg091 - 02.05.2024 10:38:06 (Excel 2013+, массив)
 
до кучи
=СУММПРОИЗВ((0&СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ТЕКСТ(ПСТР(ПОДСТАВИТЬ(" "&A2;",";ПОВТОР(" ";99));СТРОКА($1:$10)*99-98;99);"\0-\0-1;;0;\0@"));" ";"1-");"-";ПОВТОР(" ";15));{1;16;31};15)))*{1;-1;1})
или "чуть проще" )
=ДЛСТР(A2)-ДЛСТР(ПОДСТАВИТЬ(A2;","; ))-СУММПРОИЗВ(ПСТР(ПОДСТАВИТЬ(0&СЖПРОБЕЛЫ(ТЕКСТ(ПСТР(ПОДСТАВИТЬ(" "&A2;",";ПОВТОР(" ";99));СТРОКА($1:$10)*99-98;99);"\0;;0;@"))&"-0";"-";ПОВТОР(" ";99));{1;99};99)*{1;-1})+1
Изменено: Павел \Ʌ/ - 03.05.2024 16:14:56 (" "&)
 
Интересно, а интреесует ли еще вопрос ТСа? :D
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
Интересно, а интреесует ли еще вопрос ТСа?
А когда форумчан это интересовало?  :D  
 
интересовало - всегда , но никогда не останавливало.  :D
По вопросам из тем форума, личку не читаю.
 
Согласен, так точнее сформулировано.
 
И еще вариант с фильтром XML
=SUMPRODUCT(RIGHT(SUBSTITUTE(FILTERXML("<x><m>"&SUBSTITUTE(SUBSTITUTE(A2;"-";"¦");",";"</m><m>")&"</m></x>";"//m");"¦";REPT(" ";9));9)-LEFT(SUBSTITUTE(FILTERXML("<x><m>"&SUBSTITUTE(SUBSTITUTE(A2;"-";"¦");",";"</m><m>")&"</m></x>";"//m");"¦";REPT(" ";9));9)+1)
 
Павел \Ʌ/, на строке 4-15,999-1100 формула попроще ошибается.
Алексей М.
 
Скрытый текст
Цитата
написал:
Интересно, а интреесует ли еще вопрос ТСа?
Интересует, пробую все предложенные варианты.
понравился метод через функцию ExpandListA от Hugo, и вот этот код
Код
Function ExpandListA(ByVal Src$, Optional GrSep$ = ",", _
                    Optional etc$ = "-", Optional outSep$ = "; ") As String
  Dim elem, aNums, j As Long
  Src = Application.Trim(Src)
  If Src = "" Then Exit Function
  For Each elem In Split(Src, GrSep)
     aNums = Split(Trim(elem), etc)
     For j = aNums(0) To aNums(UBound(aNums))
        ExpandListA = ExpandListA & outSep & Trim(j)
     Next
  Next
  ExpandListA = Mid(ExpandListA, Len(outSep) + 1)
End Function
Код
Function ExpandListB(rText As String, Optional sInSep As String = "-", Optional sOutSep As String = ",") As String
    If Len(Trim(rText)) = 0 Then ExpandListB = "Íå óêàçàíà ñòðîêà ÷èñåë!": Exit Function
    Dim oRegExp As Object, sStr As String, sElem As String, vOutStr, sAllText
    Dim lCountAll As Long, lCount As Long
    Set oRegExp = CreateObject("VBScript.RegExp")
    oRegExp.Global = True: oRegExp.MultiLine = True
    oRegExp.Pattern = "[" & sInSep & "]"
    sStr = oRegExp.Replace(rText, "-")
    sAllText = Split(sStr, "-")
    If UBound(sAllText) > 0 Then
        For lCountAll = LBound(sAllText) To UBound(sAllText) - 1
            For lCount = sAllText(lCountAll) To sAllText(lCountAll + 1)
                vOutStr = vOutStr & sOutSep & lCount
            Next lCount
        Next lCountAll
        vOutStr = Mid$(vOutStr, 2)
    Else
        vOutStr = sAllText(0)
    End If
    ExpandListB = vOutStr
End Function
что нужно прописать чтобы результат выдавался не 1;2;4;5;6;7  а сразу количество 6?
в случае использования функции, книгу обязательно сохранять в формате с поддержкой макроса?
БМВ, ваша формула с массивом работает превосходно!
Изменено: aksell - 02.05.2024 22:13:09
 
Цитата
aksell написал:
в случае использования функции, книгу обязательно сохранять в формате с поддержкой макроса?
однозначно.
По вопросам из тем форума, личку не читаю.
 
Цитата
aksell написал:
книгу обязательно сохранять в формате с поддержкой макроса?
- не обязательно. Я применял в xlsx.
Код функции может быть в другой книге, или лучше/удобнее в надстройке.
 
Цитата
aksell написал:
что нужно прописать чтобы результат выдавался не 1;2;4;5;6;7  а сразу количество 6?
- вместо строки
ExpandListA = ExpandListA & outSep & Trim(j)
думаю можно написать
ExpandListA = ExpandListA +1 Ну а последнюю строку удалить.И лучше тогда функцию переименовать, чтоб не путаться.

Вот подправил-проверил
Код
Function ExpandListCount(ByVal Src$, Optional GrSep$ = ",", _
                    Optional etc$ = "-") As Long
  Dim elem, aNums, j As Long
  Src = Application.Trim(Src)
  If Src = "" Then Exit Function
  For Each elem In Split(Src, GrSep)
     aNums = Split(Trim(elem), etc)
     For j = aNums(0) To aNums(UBound(aNums))
        ExpandListCount = ExpandListCount + 1
     Next
  Next
End Function

И в ячейке пишем
Код
=ExpandListCount(A1;",";"-")
Изменено: Hugo - 02.05.2024 22:47:59
 
БМВ и МатросНаЗебре зря вы переживали надо ли решение ТС. Человек просто еще не все решения попробовал, и не может решить какое лучше. :D
Видимо ТС больше нравиться UDF, переделал макрос.
Код
Function PodKol(Txt$, Optional OsnRaz$ = ",", Optional DopRaz$ = "-") As Long
Dim Tp1, Tp2, j&
    Tp1 = VBA.Split(Txt, OsnRaz)
        For j = 0 To UBound(Tp1)
            Tp2 = VBA.Split(Tp1(j), DopRaz)
            PodKol = PodKol + Tp2(UBound(Tp2)) - Tp2(0) + 1
         Next j
End Function
 
Цитата
Hugo написал:
Код функции может быть в другой книге, или лучше/удобнее в надстройке.
Автономность сильно страдает.
Цитата
Евгений Смирнов написал:
Видимо ТС больше нравиться UDF, переделал макрос.
так оно тоже требует поддержки макросов.

Я не за однозначное лидерство формул, ибо это и не всегда так и не всегда возможно и не всегда быстро , да и чуть сложнее, то и не понятно как работает .... , но  зато если работает, то везде, ,а если не увлекаться новинками, то и в других версиях и клонах программ тоже, хотя как выяснилось Р7 на отрез отказывается работать с двумерным массивом при применении в таком виде MID("123";{1;2};{1\2})  двумерный массив так и не выдал а должен был {"1"\"12";"2"\"23"} . что делает нерабочим как мое решение выше, так и многие другие :-(
По вопросам из тем форума, личку не читаю.
 
А зачем приплетать Р7 )
 
Off
nilske, - ну а сколько тут вопросов что 2003 не работает или в Sheets не так .... Просто для понимания, что в идеале - универсальная формула , если она возможна, отработает в любой версии или реинкарнации.  А , если не говорить про пиратки, то в очень недалеком будущем все меньше и меньше вопросов тут будет про excel :-(
По вопросам из тем форума, личку не читаю.
 
БМВ, можно ведь будет сделать отдельный форум или тематическую ветку при необходимости. А если пользователь решил спросить или прочитать в этой, то зачем нему Фортран.
 
Цитата
АlехМ:   на строке 4-15,999-1100 формула попроще ошибается
дествительно, не порядок - подправил  ;)
Цитата
БМВ: Интересно, а интреесует ли еще вопрос ТСа...
...интересовало - всегда , но никогда не останавливало
8)
уже более интересно: насколько интреесует  вопрос  кроме  ТСа   )
Страницы: 1
Наверх