Именно! Я бы даже сказал Application.WorksheetFunction.Trim(). Кто-то из корифеев в какой-то книжке рекомендовал стараться квалифицировать функции листа через WorksheetFunction, типа "возьмет Microsoft да и облегчит Application, удалив из него эти функции, а мы уже позаботились заранее"
Quote (Hugo)
на то есть Application.Trim()
Именно! Я бы даже сказал Application.WorksheetFunction.Trim(). Кто-то из корифеев в какой-то книжке рекомендовал стараться квалифицировать функции листа через WorksheetFunction, типа "возьмет Microsoft да и облегчит Application, удалив из него эти функции, а мы уже позаботились заранее" Gustav
Sub io() Dim i&, j&, li& Dim Arr(), Arr2() Dim tm!: tm = Timer Application.ScreenUpdating = False
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2) ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1) Arr = [a2].CurrentRegion.Value Arr2 = Range("g2:g" & Cells(Rows.Count, "g").End(xlUp).Row)
For i = 1 To UBound(Arr) Arr(i, 1) = Application.Trim(UCase(Arr(i, 1))) Next For i = 1 To UBound(Arr2) Arr2(i, 1) = Application.Trim(UCase(Arr2(i, 1))) Next
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then Cells(1 + j, "h").Value = Arr(i, 1) Cells(1 + j, "i").Value = Arr(i, 2) li = li + 1 End If Next Next
Sub io() Dim i&, j&, li& Dim Arr(), Arr2() Dim tm!: tm = Timer Application.ScreenUpdating = False
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2) ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1) Arr = [a2].CurrentRegion.Value Arr2 = Range("g2:g" & Cells(Rows.Count, "g").End(xlUp).Row)
For i = 1 To UBound(Arr) Arr(i, 1) = Application.Trim(UCase(Arr(i, 1))) Next For i = 1 To UBound(Arr2) Arr2(i, 1) = Application.Trim(UCase(Arr2(i, 1))) Next
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then Cells(1 + j, "h").Value = Arr(i, 1) Cells(1 + j, "i").Value = Arr(i, 2) li = li + 1 End If Next Next
что нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?
Можно сразу после того, как нашлось совпадение, стереть данные из Arr(). Затем в конце отдельным циклом переложить то, что там осталось, на лист под данные. Или отсортировать массив и выгрузить всё сразу.
Quote (Anatoliy45)
что нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?
Можно сразу после того, как нашлось совпадение, стереть данные из Arr(). Затем в конце отдельным циклом переложить то, что там осталось, на лист под данные. Или отсортировать массив и выгрузить всё сразу.Hugo
Хорошо бы еще предусмотреть обработку ситуации, связанную с вхождением шаблона один в другой. Например, "Накопительный бак CHO-300" и "Накопительный бак CHO-3000". Соответственно, марка CHO-300 полностью "входит" в марку CHO-3000, и результат будет зависеть от порядка следования марок в массиве.
P.S. А еще у меня в первоначальном внутреннем цикле был Exit For после нахождения совпадения. Просто забыли или есть особые причины его исчезновения?
P.P.S. Ааа, въехал - циклы поменяли местами. Сам дурак
Хорошо бы еще предусмотреть обработку ситуации, связанную с вхождением шаблона один в другой. Например, "Накопительный бак CHO-300" и "Накопительный бак CHO-3000". Соответственно, марка CHO-300 полностью "входит" в марку CHO-3000, и результат будет зависеть от порядка следования марок в массиве.
P.S. А еще у меня в первоначальном внутреннем цикле был Exit For после нахождения совпадения. Просто забыли или есть особые причины его исчезновения?
P.P.S. Ааа, въехал - циклы поменяли местами. Сам дурак Gustav
Согласен, на таком объёме можно и без него - всего-то 31 совпадение на лист прописать
Ну это в тестовой задачке - 31. А в боевых условиях-то наверное придется все 6 тыщ прописывать. Так что вариант с тремя массивами мне кажется более перспективным. К тому же, на третьем массиве можно проверять "уже заполненность" его ячеек и не выполнять лишние ресурсоемкие Like: [vba]
Code
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If IsEmpty(arr3(j, 1)) Then '--- встрял я-таки со своим "Exit For'ом" If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then arr3(j, 1) = Arr(i, 1) arr3(j, 2) = Arr(i, 2) li = li + 1 End If End If Next Next
[/vba]
Quote (Hugo)
Согласен, на таком объёме можно и без него - всего-то 31 совпадение на лист прописать
Ну это в тестовой задачке - 31. А в боевых условиях-то наверное придется все 6 тыщ прописывать. Так что вариант с тремя массивами мне кажется более перспективным. К тому же, на третьем массиве можно проверять "уже заполненность" его ячеек и не выполнять лишние ресурсоемкие Like: [vba]
Code
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If IsEmpty(arr3(j, 1)) Then '--- встрял я-таки со своим "Exit For'ом" If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then arr3(j, 1) = Arr(i, 1) arr3(j, 2) = Arr(i, 2) li = li + 1 End If End If Next Next
Sub io() Dim i&, j&, li& Dim Arr(), Arr2() Dim tm!: tm = Timer Application.ScreenUpdating = False
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2) ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1) Arr = [a2].CurrentRegion.Value Arr2 = Range("g2:g" & Cells(Rows.Count, "g").End(xlUp).Row) ReDim Arr3(1 To UBound(Arr2), 1 To 2)
For i = 1 To UBound(Arr) Arr(i, 1) = Application.WorksheetFunction.Trim(UCase(Arr(i, 1))) Next For i = 1 To UBound(Arr2) Arr2(i, 1) = Application.WorksheetFunction.Trim(UCase(Arr2(i, 1))) Next
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If IsEmpty(Arr3(j, 1)) Then If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then Arr3(j, 1) = Arr(i, 1) Arr3(j, 2) = Arr(i, 2) li = li + 1 End If End If Next Next
STAR DIGIT 240 Fi получаем STAR DIGIT 240 FI Если это непозволительно - тогда преобразования нужно делать непосредственно перед сравнением, как было в сообщении № 10.
Попробуйте [vba]
Code
Sub io() Dim i&, j&, li& Dim Arr(), Arr2() Dim tm!: tm = Timer Application.ScreenUpdating = False
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2) ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1) Arr = [a2].CurrentRegion.Value Arr2 = Range("g2:g" & Cells(Rows.Count, "g").End(xlUp).Row) ReDim Arr3(1 To UBound(Arr2), 1 To 2)
For i = 1 To UBound(Arr) Arr(i, 1) = Application.WorksheetFunction.Trim(UCase(Arr(i, 1))) Next For i = 1 To UBound(Arr2) Arr2(i, 1) = Application.WorksheetFunction.Trim(UCase(Arr2(i, 1))) Next
For i = 1 To UBound(Arr) For j = 1 To UBound(Arr2) If IsEmpty(Arr3(j, 1)) Then If Arr2(j, 1) Like "*" & Arr(i, 1) & "*" Then Arr3(j, 1) = Arr(i, 1) Arr3(j, 2) = Arr(i, 2) li = li + 1 End If End If Next Next
STAR DIGIT 240 Fi получаем STAR DIGIT 240 FI Если это непозволительно - тогда преобразования нужно делать непосредственно перед сравнением, как было в сообщении № 10.Hugo
...шли годы... они говорили... раз в сутки по фразе...
Anatoliy45, значит взять строку для поиска в столбце 3, поискать в столбцах 1 и 2 и нечто найденное внедрить обратно в тот же столбец 3? Так? Конкретный пример-то дадите, файл?
...шли годы... они говорили... раз в сутки по фразе...
Anatoliy45, значит взять строку для поиска в столбце 3, поискать в столбцах 1 и 2 и нечто найденное внедрить обратно в тот же столбец 3? Так? Конкретный пример-то дадите, файл?Gustav