Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Работа с xls - сравнение столбцов, с примерами в ТЗ - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Работа с xls - сравнение столбцов, с примерами в ТЗ
Gustav Дата: Воскресенье, 24.06.2012, 18:01 | Сообщение № 21
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Hugo)
на то есть Application.Trim()

Именно! Я бы даже сказал Application.WorksheetFunction.Trim(). Кто-то из корифеев в какой-то книжке рекомендовал стараться квалифицировать функции листа через WorksheetFunction, типа "возьмет Microsoft да и облегчит Application, удалив из него эти функции, а мы уже позаботились заранее" smile


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Quote (Hugo)
на то есть Application.Trim()

Именно! Я бы даже сказал Application.WorksheetFunction.Trim(). Кто-то из корифеев в какой-то книжке рекомендовал стараться квалифицировать функции листа через WorksheetFunction, типа "возьмет Microsoft да и облегчит Application, удалив из него эти функции, а мы уже позаботились заранее" smile

Автор - Gustav
Дата добавления - 24.06.2012 в 18:01
Anatoliy45 Дата: Воскресенье, 24.06.2012, 18:01 | Сообщение № 22
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

что нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?
 
Ответить
Сообщениечто нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

Автор - Anatoliy45
Дата добавления - 24.06.2012 в 18:01
LightZ Дата: Воскресенье, 24.06.2012, 18:04 | Сообщение № 23
Группа: Авторы
Ранг: Форумчанин
Сообщений: 120
Репутация: 48 ±
Замечаний: 0% ±

Quote (Hugo)
массив берётся от второй строки

Исправил, без resize и третьего массива:

[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)

     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

     Application.ScreenUpdating = True
     MsgBox Format((Timer - tm) / 24 / 60 / 60, "nn:ss") & "  мин:сек", _
            vbInformation, "Макрос выполнен за: "

     MsgBox li, vbInformation, "Найдено цен: "
End Sub
[/vba]


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296
 
Ответить
Сообщение
Quote (Hugo)
массив берётся от второй строки

Исправил, без resize и третьего массива:

[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)

     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

     Application.ScreenUpdating = True
     MsgBox Format((Timer - tm) / 24 / 60 / 60, "nn:ss") & "  мин:сек", _
            vbInformation, "Макрос выполнен за: "

     MsgBox li, vbInformation, "Найдено цен: "
End Sub
[/vba]

Автор - LightZ
Дата добавления - 24.06.2012 в 18:04
Hugo Дата: Воскресенье, 24.06.2012, 18:07 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Quote (Anatoliy45)
что нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

Можно сразу после того, как нашлось совпадение, стереть данные из Arr().
Затем в конце отдельным циклом переложить то, что там осталось, на лист под данные.
Или отсортировать массив и выгрузить всё сразу.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Quote (Anatoliy45)
что нужно добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

Можно сразу после того, как нашлось совпадение, стереть данные из Arr().
Затем в конце отдельным циклом переложить то, что там осталось, на лист под данные.
Или отсортировать массив и выгрузить всё сразу.

Автор - Hugo
Дата добавления - 24.06.2012 в 18:07
RAN Дата: Воскресенье, 24.06.2012, 18:22 | Сообщение № 25
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Богдан, а зачем это?
[vba]
Code
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2)
ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1)
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеБогдан, а зачем это?
[vba]
Code
ReDim Arr(1 To [a2].CurrentRegion.Cells.Count, 1 To 2)
ReDim Arr2(1 To Cells(Rows.Count, "g").End(xlUp).Row, 1)
[/vba]

Автор - RAN
Дата добавления - 24.06.2012 в 18:22
Gustav Дата: Воскресенье, 24.06.2012, 18:49 | Сообщение № 26
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Хорошо бы еще предусмотреть обработку ситуации, связанную с вхождением шаблона один в другой. Например, "Накопительный бак CHO-300" и "Накопительный бак CHO-3000". Соответственно, марка CHO-300 полностью "входит" в марку CHO-3000, и результат будет зависеть от порядка следования марок в массиве.

P.S. А еще у меня в первоначальном внутреннем цикле был Exit For после нахождения совпадения. Просто забыли или есть особые причины его исчезновения?

P.P.S. Ааа, въехал - циклы поменяли местами. Сам дурак smile


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 24.06.2012, 18:59
 
Ответить
СообщениеХорошо бы еще предусмотреть обработку ситуации, связанную с вхождением шаблона один в другой. Например, "Накопительный бак CHO-300" и "Накопительный бак CHO-3000". Соответственно, марка CHO-300 полностью "входит" в марку CHO-3000, и результат будет зависеть от порядка следования марок в массиве.

P.S. А еще у меня в первоначальном внутреннем цикле был Exit For после нахождения совпадения. Просто забыли или есть особые причины его исчезновения?

P.P.S. Ааа, въехал - циклы поменяли местами. Сам дурак smile

Автор - Gustav
Дата добавления - 24.06.2012 в 18:49
LightZ Дата: Воскресенье, 24.06.2012, 18:54 | Сообщение № 27
Группа: Авторы
Ранг: Форумчанин
Сообщений: 120
Репутация: 48 ±
Замечаний: 0% ±

Quote (RAN)
Богдан, а зачем это?

Можно и обойтись.
Привык всегда сначала указывать размерность массива, а потом заливать данные.

Просто привычка smile


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296


Сообщение отредактировал LightZ - Воскресенье, 24.06.2012, 19:08
 
Ответить
Сообщение
Quote (RAN)
Богдан, а зачем это?

Можно и обойтись.
Привык всегда сначала указывать размерность массива, а потом заливать данные.

Просто привычка smile

Автор - LightZ
Дата добавления - 24.06.2012 в 18:54
Gustav Дата: Воскресенье, 24.06.2012, 19:39 | Сообщение № 28
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
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
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 24.06.2012, 19:47
 
Ответить
Сообщение
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
[/vba]

Автор - Gustav
Дата добавления - 24.06.2012 в 19:39
Anatoliy45 Дата: Воскресенье, 24.06.2012, 22:40 | Сообщение № 29
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

уважаемые, какой код использовать в итоге со всеми комментариями, которые есть в теме?
 
Ответить
Сообщениеуважаемые, какой код использовать в итоге со всеми комментариями, которые есть в теме?

Автор - Anatoliy45
Дата добавления - 24.06.2012 в 22:40
Hugo Дата: Воскресенье, 24.06.2012, 22:55 | Сообщение № 30
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Попробуйте
[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
      
     [h2].Resize(UBound(Arr3), 2) = Arr3
      
     Application.ScreenUpdating = True
     MsgBox Format((Timer - tm) / 24 / 60 / 60, "nn:ss") & "  мин:сек", _
            vbInformation, "Макрос выполнен за: "

     MsgBox li, vbInformation, "Найдено цен: "
End Sub

[/vba]

Правда тут ради скорости из

STAR DIGIT 240 Fi
получаем
STAR DIGIT 240 FI
Если это непозволительно - тогда преобразования нужно делать непосредственно перед сравнением, как было в сообщении № 10.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПопробуйте
[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
      
     [h2].Resize(UBound(Arr3), 2) = Arr3
      
     Application.ScreenUpdating = True
     MsgBox Format((Timer - tm) / 24 / 60 / 60, "nn:ss") & "  мин:сек", _
            vbInformation, "Макрос выполнен за: "

     MsgBox li, vbInformation, "Найдено цен: "
End Sub

[/vba]

Правда тут ради скорости из

STAR DIGIT 240 Fi
получаем
STAR DIGIT 240 FI
Если это непозволительно - тогда преобразования нужно делать непосредственно перед сравнением, как было в сообщении № 10.

Автор - Hugo
Дата добавления - 24.06.2012 в 22:55
Anatoliy45 Дата: Воскресенье, 24.06.2012, 23:41 | Сообщение № 31
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

позволительно, спасибо
 
Ответить
Сообщениепозволительно, спасибо

Автор - Anatoliy45
Дата добавления - 24.06.2012 в 23:41
Anatoliy45 Дата: Воскресенье, 24.06.2012, 23:49 | Сообщение № 32
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

а вот это делает?
 
Ответить
Сообщениедобавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

а вот это делает?

Автор - Anatoliy45
Дата добавления - 24.06.2012 в 23:49
Hugo Дата: Воскресенье, 24.06.2012, 23:57 | Сообщение № 33
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Quote (Hugo)
тогда преобразования нужно делать непосредственно перед сравнением
- хотя нет.
Нужно просто создать один массив для сравнения (его сразу в цикле преобразовать), а второй для копирования данных.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Quote (Hugo)
тогда преобразования нужно делать непосредственно перед сравнением
- хотя нет.
Нужно просто создать один массив для сравнения (его сразу в цикле преобразовать), а второй для копирования данных.

Автор - Hugo
Дата добавления - 24.06.2012 в 23:57
Hugo Дата: Понедельник, 25.06.2012, 00:01 | Сообщение № 34
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Quote (Anatoliy45)
а вот это делает?

Нет.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение
Quote (Anatoliy45)
а вот это делает?

Нет.

Автор - Hugo
Дата добавления - 25.06.2012 в 00:01
Anatoliy45 Дата: Понедельник, 25.06.2012, 00:02 | Сообщение № 35
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

а можно по шагам что нужно сделать?
 
Ответить
Сообщениеа можно по шагам что нужно сделать?

Автор - Anatoliy45
Дата добавления - 25.06.2012 в 00:02
Gustav Дата: Понедельник, 25.06.2012, 00:11 | Сообщение № 36
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Anatoliy45)
добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

а вот это делает?

Не делает. Потому что несколькими кликами мышки это делается через интерфейс. Хоть в фильтре попрактикуетесь.

Если хочется непременно "под записями", то тоже несколько кликов. Операция называется сортировка.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Quote (Anatoliy45)
добавить в макрос чтобы он все позиции которых нет, отправлял под все записи?

а вот это делает?

Не делает. Потому что несколькими кликами мышки это делается через интерфейс. Хоть в фильтре попрактикуетесь.

Если хочется непременно "под записями", то тоже несколько кликов. Операция называется сортировка.

Автор - Gustav
Дата добавления - 25.06.2012 в 00:11
Anatoliy45 Дата: Среда, 27.06.2012, 03:10 | Сообщение № 37
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

а можно сделать чтобы данные сравнивались ещё с одним столбцом? т.е. где будем искать - 1 и 2 стоблец , что будем искать в 3 столбце

помогите пожалуйста


Сообщение отредактировал Anatoliy45 - Среда, 27.06.2012, 23:53
 
Ответить
Сообщениеа можно сделать чтобы данные сравнивались ещё с одним столбцом? т.е. где будем искать - 1 и 2 стоблец , что будем искать в 3 столбце

помогите пожалуйста

Автор - Anatoliy45
Дата добавления - 27.06.2012 в 03:10
Gustav Дата: Четверг, 28.06.2012, 09:42 | Сообщение № 38
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Anatoliy45)
а можно сделать чтобы данные сравнивались ещё с одним столбцом? т.е. где будем искать - 1 и 2 стоблец , что будем искать в 3 столбце

Можно. Соответственно, раз одно ищем в двух местах, то будет два ответа. Что с ними делать?


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Quote (Anatoliy45)
а можно сделать чтобы данные сравнивались ещё с одним столбцом? т.е. где будем искать - 1 и 2 стоблец , что будем искать в 3 столбце

Можно. Соответственно, раз одно ищем в двух местах, то будет два ответа. Что с ними делать?

Автор - Gustav
Дата добавления - 28.06.2012 в 09:42
Anatoliy45 Дата: Пятница, 29.06.2012, 04:06 | Сообщение № 39
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

ответ весь нужно в столбец 3 поставить, объединить ответ
 
Ответить
Сообщениеответ весь нужно в столбец 3 поставить, объединить ответ

Автор - Anatoliy45
Дата добавления - 29.06.2012 в 04:06
Gustav Дата: Пятница, 29.06.2012, 10:41 | Сообщение № 40
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
...шли годы... они говорили... раз в сутки по фразе... smile

Anatoliy45, значит взять строку для поиска в столбце 3, поискать в столбцах 1 и 2 и нечто найденное внедрить обратно в тот же столбец 3? Так? Конкретный пример-то дадите, файл?


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение...шли годы... они говорили... раз в сутки по фразе... smile

Anatoliy45, значит взять строку для поиска в столбце 3, поискать в столбцах 1 и 2 и нечто найденное внедрить обратно в тот же столбец 3? Так? Конкретный пример-то дадите, файл?

Автор - Gustav
Дата добавления - 29.06.2012 в 10:41
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!