добрый день, подскажите возможно ли реализовать подсчет количества в ячейке? пример: в столбце а указанны комплекты, а в столбце b необходимо подсчитать количество комплекты могут быть указаны как через запятую, так и через тире.
в столбце 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
Еще вариант макросом. Исходные данные в столбце А начиная с А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
Евгений Смирнов, по скорости едва заметно медленнее, но точно короче
Справку по 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 =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)
написал: Интересно, а интреесует ли еще вопрос ТСа?
Интересует, пробую все предложенные варианты. понравился метод через функцию 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 написал: что нужно прописать чтобы результат выдавался не 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
БМВ и МатросНаЗебре зря вы переживали надо ли решение ТС. Человек просто еще не все решения попробовал, и не может решить какое лучше. Видимо ТС больше нравиться 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"} . что делает нерабочим как мое решение выше, так и многие другие :-(
Off nilske, - ну а сколько тут вопросов что 2003 не работает или в Sheets не так .... Просто для понимания, что в идеале - универсальная формула , если она возможна, отработает в любой версии или реинкарнации. А , если не говорить про пиратки, то в очень недалеком будущем все меньше и меньше вопросов тут будет про excel :-(
БМВ, можно ведь будет сделать отдельный форум или тематическую ветку при необходимости. А если пользователь решил спросить или прочитать в этой, то зачем нему Фортран.