Страницы: 1
RSS
Создать виртуальный массив кодов из диапазона., VBA.
 
Доброе утро.
Пытаюсь написать SumIf. Но вместо первого аргумента - Arg1 нужен не просто диапазон, а только вычлененные из диапазона артикулы деталей.
Алгоритм такой:
После знаков "КОД: (пробел)" выбираем все знаки до "-'" (тире), после "-" только 5 знаков. Там где нет тире, берётся артикул из cells(i,1).
Для примера в файле есть формула, которая это делает.
Количество строк 3000.
Желательно языком для чайника, с комментами.

Спасибо.
Изменено: Владимир - 02.04.2015 08:25:24
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Если я правильно понял - удалите ведущий апостроф при присвоении значения переменной с. Для чего он?
Код
        c = Mid(Cells(i, 2), b + 5, a - b - 5) & Mid(Cells(i, 2), a + 1, 5)
Согласие есть продукт при полном непротивлении сторон
 
Такой код 0450000100 - без апострофа вставится как 450000100.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Если перед тем, как вставлять, назначить ячейкам текстовый формат, вставится нормально и без апострофа
 
Цитата
МВТ написал: назначить ячейкам текстовый формат и вставится нормально и без апострофа
и строку
Код
Cells(i, 5) = WorksheetFunction.SumIf(Range("a7:a" & lstr), c, Range("c7:c" & lstr))
вынести за блок If...Then...Else...End If, как-то так
Код
Sub oborot()
Dim a As Byte, b As Byte, i As Long, lstr As Long, c As String
lstr = Cells(Rows.Count, 2).End(xlUp).Row
Application.ScreenUpdating = False
Columns(5).ClearContents
Columns(1).NumberFormat = "@"
    For i = 7 To lstr
        b = InStr(1, Cells(i, 2), "Êîä")
        a = InStr(b, Cells(i, 2), "-")
    If a = 0 Then
        c = Cells(i, 1)
    Else
        c = Mid(Cells(i, 2), b + 5, a - b - 5) & Mid(Cells(i, 2), a + 1, 5)
    End If
    Cells(i, 5) = WorksheetFunction.SumIf(Range("a7:a" & lstr), c, Range("c7:c" & lstr))
    Next i
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Спасибо, ребята, учту и поправлю.
Основной вопрос остаётся пока открытым..
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
если правильно понял задачу...
Код
Function myArray(rCod As Range, rTxt As Range)
  Dim a$(), aTxt(), aCod()
  Static r As Object, m As Object
  aTxt = rTxt.Value: aCod = rCod.Value
  If r Is Nothing Then
    Set r = CreateObject("vbscript.regexp")
    r.Pattern = "Код: ([^-]+-.{5})"
  End If
  ReDim a(1 To UBound(aTxt), 1 To UBound(aTxt, 2))
  For i = 1 To UBound(a)
    Set m = r.Execute(aCod(i, 1))
    If m.Count Then a(i, 1) = Replace(m(0).submatches(0), "-", "") Else a(i, 1) = aTxt(i, 1)
  Next
  myArray = a
End Function
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Саша, мне не надо ЮДФ_ку, к тому регэкспешную. :)
Мне нужно в формулу WorksheetFunction.SumIf(Range("a7:a"& lstr), c, Range("c7:c"& lstr))
вместо Range("a7:a"& lstr) вставить виртуальный массив с уже вытащенными из столбца В кодами. Должно получиться что-то типа -
WorksheetFunction.SumIf(arrKod, c, Range("c7:c"& lstr))  
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Владимир, SumIf первым аргументом принимает только диапазон, массив в нее не запихнуть.
Согласие есть продукт при полном непротивлении сторон
 
SumIf не принимает массивы.
только диапазоны.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Суть тут такова. Есть оригинальные запчасти и неоригиналы. К примеру, два неоригинальных генератора имеют коды 37300-22650DSH и 37300-22650HAN. Оригинальный артикул запчасти - 37300-22650, а всё остальное это приставки. Поэтому получив этот номер можно посчитать статистику продаж всех неоригинальных запчастей. В нашем случае - это 8+6=14 генераторов в год.
DAA029№: DAA029;  
 ГЕНЕРАТОР ACC RUS, GETS, ELAN, MATR, SONV 2,0L, TUCS 2,0L DASHI;  
Код: 37300-22650DSH
80
H00GK01№:
 H00GK01;   ГЕНЕРАТОР ACC RUS, GETS,ELAN, MATR, SONV 2,0L, TUCS 2,0L HANGIL;
 Код: 37300-22650HAN
60
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
сделать вспомогательный столбец с формулой, выделяющей "оригинальный" код.
на основе этого столбца - обычной СУММЕСЛИ или сводной подсчитать требуемое.

вариант?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Понятно. Ладно, через Access прогоню исходник.

Спасибо.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Насколько вижу, в ячейку ставим не саму формулу, а ее результат. Тогда почему не сделать свой вариант SUMIF, загнав сразу в массив столбцы 2-3, и пробежавшись по ним со сравнением, выгрузить сразу результат в столбец 5?

Как вариант, модно суммировать через словарь.

Если это только часть большого кода с более  можно этот самописный SUMIF загнать в функцию, и всё.
F1 творит чудеса
 
Цитата
Максим Зеленский написал: модно суммировать через словарь
Офф.
просто писк моды последнее время :D;).
Фраза достойна места в теме Ячеки с зада...в Курилке
Согласие есть продукт при полном непротивлении сторон
 
Максим, с удовольствием рассмотрю Ваш вариант через словарь.
Суммесли - это для понимания задачи. Мне бы понять, как не циклом, а сразу массивом обработать текст с артикулами запчастей, просуммировать совпадающие, а потом вывести на лист.
Через Access сделал вчера, но интерес остался именно в реализации на VBA.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Хотя бы один цикл, да понадобится - пройтись по исходному массиву.
в итоге, нужно вывести на лист количества к каждой строчке исходного массива (с повторами)? Или нужен список уникальных кодов с суммами?
F1 творит чудеса
 
Нужно вывести общее кол-во по столбцу С, если артикулы в столбце B совпадают. Артикулы в столбце B могут совпасть только после описанной выше обработки столбца B.

<<После знаков "КОД: (пробел)" выбираем все знаки до "-'" (тире), после "-" только 5 знаков. Там где нет тире, берётся артикул из cells(i,1).>>
Изменено: Владимир - 03.04.2015 08:33:03
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
набросал как-то
F1 творит чудеса
 
Максим, работает. Спасибо большое.
Вроде всё понятно. Попробую на основании Вашего макроса, создать что-то иное по данной аналогии.
:)
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Наверх