Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2018, 09:00   #1
Ivan.Z
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 5
По умолчанию Помогите решить задачу века

Добрый день и прекрасной весны всем.
Подскажите добрые люди а то замучался я с этим вопросом.
Есть два прайса (1 выгружен из 1с одной фирмы) ( другой из интерент мгаазина )
Есть строчки с названием товара в одном и с названием товара в другом
Но есть загвоздка они отличаются, надо найти схожие значения.
Например прайс 1 (откуда надо брать значения)
Вело 14" Зайка 145-F, синий
-----------------
Прайс 2 (где надо найти похожее значение)
Велосипед детский, Зайка 145-F, синий.
Ivan.Z вне форума Ответить с цитированием
Старый 21.04.2018, 09:03   #2
Ivan.Z
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 5
По умолчанию

Прикрпил файл дв котором надо сравнить и выделить значения похожие чтобы включить данный товар в магазине
Вложения
Тип файла: xlsx Книга2.xlsx (43.1 Кб, 20 просмотров)
Ivan.Z вне форума Ответить с цитированием
Старый 21.04.2018, 21:53   #3
Oldy7
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 28
По умолчанию

Частичное решение:
- составляются наборы карт-ключей в которых список цифровых вхождений в строку разделенных пробелами
- с помощью двух словарей сравниваются ключи
- по результатам сравнения (если есть совпадения) идет выгрузка данных на "лист2"

Одна беда - таких совпадений мало)

Макрос это делающий:
Код:
Sub test()
Dim DC1 As Object, DC2 As Object, txt$, dt$, a&, b%, c%, arr()
Dim arr1(), rr&(), x1&, x2&, z&
Dim sh As Worksheet, aa As Range, bb As Range, cc As Range
arr = Sheets(1).[a2].CurrentRegion.Value
Set DC1 = CreateObject("Scripting.Dictionary")
Set DC2 = CreateObject("Scripting.Dictionary")
For a = 2 To UBound(arr)
  If NumExT(arr(a, 1), dt) Then
    If Not DC1.exists(dt) Then
      ReDim rr(1 To 1): rr(1) = a: DC1.Add dt, rr
    Else
      rr = DC1.Item(dt): ReDim Preserve rr(1 To UBound(rr) + 1)
      rr(UBound(rr)) = a: DC1.Item(dt) = rr
    End If
  End If
  If NumExT(arr(a, 2), dt) Then
    If Not DC2.exists(dt) Then
      ReDim rr(1 To 1): rr(1) = a: DC2.Add dt, rr
    Else
      rr = DC2.Item(dt): ReDim Preserve rr(1 To UBound(rr) + 1)
      rr(UBound(rr)) = a: DC2.Item(dt) = rr
    End If
  End If
Next
arr1 = DC1.keys()
Set sh = Sheets(2): Set aa = sh.[a1]: Set bb = sh.[b1]
sh.Columns("A:B").Clear
x1 = 1: x2 = 1
For a = 0 To UBound(arr1)
  If DC2.exists(arr1(a)) Then
    If UBound(DC1.Item(arr1(a))) > UBound(DC2.Item(arr1(a))) Then
      z = UBound(DC1.Item(arr1(a)))
    Else: z = UBound(DC2.Item(arr1(a)))
    End If
    Set cc = Intersect(sh.Columns("A:B"), sh.Rows(x1 & ":" & x1 + z - 1))
    cc.Borders.LineStyle = xlContinuous: cc.Borders.Weight = xlMedium
    cc.Borders(xlInsideVertical).Weight = xlThin
    cc.Borders(xlInsideHorizontal).Weight = xlThin
    rr = DC1.Item(arr1(a))
    For c = 1 To UBound(rr): aa.Offset(x1 - 1, 0) = arr(rr(c), 1): x1 = x1 + 1: Next
    rr = DC2.Item(arr1(a))
    For c = 1 To UBound(rr): bb.Offset(x2 - 1, 0) = arr(rr(c), 2): x2 = x2 + 1: Next
    If x1 > x2 Then x2 = x1 Else x1 = x2
  End If
Next
sh.Columns("A:B").AutoFit
End Sub
'-----------------------------------------------
Function NumExT(ByVal txt$, dt$) As Boolean
Dim a&, b&, nn$, ll&, c&, arr$()
c = 0: dt = vbNullString: nn = "#": ll = Len(txt)
If ll = 0 Then NumExT = False: Exit Function
ReDim arr(1 To ll / 2 + 1): a = 1
Do
  Do Until Mid$(txt, a, 1) Like "#"
    a = a + 1
    If a > ll Then Exit Do
  Loop
  If a > ll Then Exit Do
  c = c + 1: nn = "##": b = 2
  Do While Mid$(txt, a, b) Like nn
    nn = nn & "#": b = b + 1
  Loop
  arr(c) = Mid$(txt, a, b - 1): a = a + b - 1
Loop While a < ll
If c > 0 Then
  ReDim Preserve arr(1 To c): dt = Join(arr, " "): NumExT = True
Else: ReDim arr(1 To 1)
End If
End Function
Oldy7 вне форума Ответить с цитированием
Старый 22.04.2018, 08:01   #4
Oldy7
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 28
По умолчанию

Ну или более мягкий фильтр.
Вложения
Тип файла: xls Сравнение прайсов.xls (211.0 Кб, 18 просмотров)
Oldy7 вне форума Ответить с цитированием
Старый 22.04.2018, 08:19   #5
Ivan.Z
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 5
По умолчанию

А теперь скажите пожалуйста как этим пользоваться, спасибо.
Ivan.Z вне форума Ответить с цитированием
Старый 22.04.2018, 09:04   #6
Oldy7
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Ivan.Z Посмотреть сообщение
как этим пользоваться
А на какие мысли Вас натолкнула большая синяя кнопка на первом листе файла выше?
Oldy7 вне форума Ответить с цитированием
Старый 22.04.2018, 09:32   #7
Ivan.Z
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 5
Печаль

Цитата:
Сообщение от Oldy7 Посмотреть сообщение
А на какие мысли Вас натолкнула большая синяя кнопка на первом листе файла выше?
Я пытался нажимать её, растягивать, пока не понял если честно ) Я просто ну прям нуб в этих вопросах сильно не ругайте подскажите я быстро обучаюсь )
Ivan.Z вне форума Ответить с цитированием
Старый 22.04.2018, 09:48   #8
Oldy7
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 28
По умолчанию

Excel, настройки, параметры безопасности, разрешить макросы.
Oldy7 вне форума Ответить с цитированием
Старый 22.04.2018, 17:01   #9
Ivan.Z
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 5
По умолчанию

Елы палы на 2 листе ответ ) Понятно а какой столбец из какой колонки ) Спасибо хотя бы на этом буду тестить как он работает ! Выручили!
Ivan.Z вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу,пожалуйста!!!вторую часть не могу решить. Родион Афанасьев Паскаль, Turbo Pascal, PascalABC.NET 1 03.03.2018 19:44
Помогите решить задачу=) Игорь777 Помощь студентам 4 29.03.2009 13:51
помогите решить задачу... studentIC Помощь студентам 3 12.03.2008 08:29