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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос поиска соответствия - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос поиска соответствия (Макросы/Sub)
Макрос поиска соответствия
hatter Дата: Понедельник, 02.06.2014, 14:57 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 160
Репутация: 0 ±
Замечаний: 0% ±

Добрый день!
У меня есть макрос, который обрабатывает базу в 500000 строк следующим образом: есть база, в каждой строке которой имеются цифровые и численно-буквенные сочетания(коды и номера артикулов), а также файл со списком всевозможных кодов -построен список в порядке убывания: т.е. вначале самые длинные коды содержащие буквы, а затем только численные. Число кодов в списке также очень велико = 750 000. Макрос проработал 63 часа и при этом не обработал и трети базы. Есть возможность ускорить работу программы или это не возможно?
 
Ответить
СообщениеДобрый день!
У меня есть макрос, который обрабатывает базу в 500000 строк следующим образом: есть база, в каждой строке которой имеются цифровые и численно-буквенные сочетания(коды и номера артикулов), а также файл со списком всевозможных кодов -построен список в порядке убывания: т.е. вначале самые длинные коды содержащие буквы, а затем только численные. Число кодов в списке также очень велико = 750 000. Макрос проработал 63 часа и при этом не обработал и трети базы. Есть возможность ускорить работу программы или это не возможно?

Автор - hatter
Дата добавления - 02.06.2014 в 14:57
Hugo Дата: Понедельник, 02.06.2014, 15:14 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Есть. Словари-массивы, как обычно...
Ищите на форуме примеры с scripting.dictionary и переделывайте сами, раз уж пример показать не желаете.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЕсть. Словари-массивы, как обычно...
Ищите на форуме примеры с scripting.dictionary и переделывайте сами, раз уж пример показать не желаете.

Автор - Hugo
Дата добавления - 02.06.2014 в 15:14
hatter Дата: Понедельник, 02.06.2014, 15:25 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 160
Репутация: 0 ±
Замечаний: 0% ±

Вот мой код:
[vba]
Код
Option Explicit  ': Option Compare Text
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Const kk As Long = 1  ' номер столбца описание товара
Public Const kk1 As Long = 3 'номер столбца БТ2  
Public Const nn1 As String = "БТема.xlsx" 'Название книги
Sub Dk_1()
Dim a(), b(), ii&, i&, x&, d&, z&, j&, c(), t&
Dim vb As Worksheet, s$, ss$, sa$, vn As Worksheet
t = timeGetTime
With ThisWorkbook.ActiveSheet
         .Activate 'Select
       x = .Cells(.Rows.Count, kk).End(xlUp).Row
       a = Range(.Cells(2, kk), .Cells(x, kk))
End With
Set vb = ActiveSheet  ''Добавлять сюда в конец:  "(", ")", "s" )
c = Array(" ", ",", ".", "-", "_", "+", "*", "\", "/", "[", "]", "{", "}", "'", ";", ":", "=", """", "(", ")")
With CreateObject("Scripting.Dictionary"): .CompareMode = 1
    For i = 0 To UBound(c)
       .Item(c(i)) = .Item(c(i)) + 1
    Next
For ii = 1 To UBound(a)
       If 0 = (ii Mod 1000) Then Application.StatusBar = "Подготовка строк  " & ii
s = LCase(Trim(a(ii, 1)))
ss = ""
For i = 1 To Len(s)
      sa = Mid(s, i, 1)
If Not (.Exists(sa)) Then ss = ss & sa
Next i
If IsNumeric(Mid(ss, 1, 1)) Then ss = Mid(ss, 2, Len(ss))
a(ii, 1) = ss
Next ii
Columns(kk).ClearContents
Cells(2, kk).Resize(x - 1, 1) = a
Windows(nn1).Activate
Set vn = ActiveSheet
With vn
         .Activate
       z = .Cells(.Rows.Count, 1).End(xlUp).Row
       d = .Cells(.Rows.Count, 2).End(xlUp).Row
       j = .Cells(.Rows.Count, 3).End(xlUp).Row
       If z < d Then z = d
       If z < j Then z = j
End With
b = Range(Cells(2, 1), Cells(z, 3))
For ii = 1 To UBound(b)
    If 0 = (ii Mod 5000) Then Application.StatusBar = "Готовим строки  " & ii
s = LCase(Trim(b(ii, 1)))
ss = ""
For i = 1 To Len(s)
    sa = Mid(s, i, 1)
If Not (.Exists(sa)) Then ss = ss & sa
Next i
b(ii, 1) = ss
Next ii
Columns("a:a").ClearContents
[a2].Resize(z - 1, 1) = b ''''''''''''''''''
Columns("a:a").NumberFormat = "@"
.RemoveAll
End With
vb.Activate: d = 0
If Len(Cells(1, 100)) Then
j = Cells(1, 100)
Else
j = 1
End If
For i = j To UBound(a) 'x
     If 0 = (i Mod 50) Then
     Cells(1, 100) = i
      Application.StatusBar = "Обработано строк " & i & " найдено " & d
     End If
'сохранение каждых 5000 строк
'  If 0 = (i Mod 5000) Then    ThisWorkbook.Save
        
    For ii = 1 To UBound(b)  'z
      If Len(Cells(i + 1, kk1)) <> 0 Or Len(Cells(i + 1, kk1 + 1)) <> 0 Then Exit For
      If InStr(1, a(i, 1), b(ii, 1), vbBinaryCompare) Then
       Cells(i + 1, kk1) = b(ii, 2)
       Cells(i + 1, kk1 + 1) = b(ii, 3): d = d + 1
      Exit For
      End If
Next: Next
Application.StatusBar = False
Cells(1, kk + 1) = timeGetTime - t & "  ìèëèñåê"
Cells(1, kk + 2) = d & " íàéäåíî"
End Sub
Sub cilki()
       If Application.ReferenceStyle = xlR1C1 Then
           Application.ReferenceStyle = xlA1
          Else
          Application.ReferenceStyle = xlR1C1
       End If
End Sub

[/vba]


Сообщение отредактировал hatter - Понедельник, 02.06.2014, 15:40
 
Ответить
СообщениеВот мой код:
[vba]
Код
Option Explicit  ': Option Compare Text
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Const kk As Long = 1  ' номер столбца описание товара
Public Const kk1 As Long = 3 'номер столбца БТ2  
Public Const nn1 As String = "БТема.xlsx" 'Название книги
Sub Dk_1()
Dim a(), b(), ii&, i&, x&, d&, z&, j&, c(), t&
Dim vb As Worksheet, s$, ss$, sa$, vn As Worksheet
t = timeGetTime
With ThisWorkbook.ActiveSheet
         .Activate 'Select
       x = .Cells(.Rows.Count, kk).End(xlUp).Row
       a = Range(.Cells(2, kk), .Cells(x, kk))
End With
Set vb = ActiveSheet  ''Добавлять сюда в конец:  "(", ")", "s" )
c = Array(" ", ",", ".", "-", "_", "+", "*", "\", "/", "[", "]", "{", "}", "'", ";", ":", "=", """", "(", ")")
With CreateObject("Scripting.Dictionary"): .CompareMode = 1
    For i = 0 To UBound(c)
       .Item(c(i)) = .Item(c(i)) + 1
    Next
For ii = 1 To UBound(a)
       If 0 = (ii Mod 1000) Then Application.StatusBar = "Подготовка строк  " & ii
s = LCase(Trim(a(ii, 1)))
ss = ""
For i = 1 To Len(s)
      sa = Mid(s, i, 1)
If Not (.Exists(sa)) Then ss = ss & sa
Next i
If IsNumeric(Mid(ss, 1, 1)) Then ss = Mid(ss, 2, Len(ss))
a(ii, 1) = ss
Next ii
Columns(kk).ClearContents
Cells(2, kk).Resize(x - 1, 1) = a
Windows(nn1).Activate
Set vn = ActiveSheet
With vn
         .Activate
       z = .Cells(.Rows.Count, 1).End(xlUp).Row
       d = .Cells(.Rows.Count, 2).End(xlUp).Row
       j = .Cells(.Rows.Count, 3).End(xlUp).Row
       If z < d Then z = d
       If z < j Then z = j
End With
b = Range(Cells(2, 1), Cells(z, 3))
For ii = 1 To UBound(b)
    If 0 = (ii Mod 5000) Then Application.StatusBar = "Готовим строки  " & ii
s = LCase(Trim(b(ii, 1)))
ss = ""
For i = 1 To Len(s)
    sa = Mid(s, i, 1)
If Not (.Exists(sa)) Then ss = ss & sa
Next i
b(ii, 1) = ss
Next ii
Columns("a:a").ClearContents
[a2].Resize(z - 1, 1) = b ''''''''''''''''''
Columns("a:a").NumberFormat = "@"
.RemoveAll
End With
vb.Activate: d = 0
If Len(Cells(1, 100)) Then
j = Cells(1, 100)
Else
j = 1
End If
For i = j To UBound(a) 'x
     If 0 = (i Mod 50) Then
     Cells(1, 100) = i
      Application.StatusBar = "Обработано строк " & i & " найдено " & d
     End If
'сохранение каждых 5000 строк
'  If 0 = (i Mod 5000) Then    ThisWorkbook.Save
        
    For ii = 1 To UBound(b)  'z
      If Len(Cells(i + 1, kk1)) <> 0 Or Len(Cells(i + 1, kk1 + 1)) <> 0 Then Exit For
      If InStr(1, a(i, 1), b(ii, 1), vbBinaryCompare) Then
       Cells(i + 1, kk1) = b(ii, 2)
       Cells(i + 1, kk1 + 1) = b(ii, 3): d = d + 1
      Exit For
      End If
Next: Next
Application.StatusBar = False
Cells(1, kk + 1) = timeGetTime - t & "  ìèëèñåê"
Cells(1, kk + 2) = d & " íàéäåíî"
End Sub
Sub cilki()
       If Application.ReferenceStyle = xlR1C1 Then
           Application.ReferenceStyle = xlA1
          Else
          Application.ReferenceStyle = xlR1C1
       End If
End Sub

[/vba]

Автор - hatter
Дата добавления - 02.06.2014 в 15:25
Hugo Дата: Понедельник, 02.06.2014, 17:13 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Что-то без файла код какой-то головоломный... Времени нет ковырять.
Файл покажете строк на 100?


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЧто-то без файла код какой-то головоломный... Времени нет ковырять.
Файл покажете строк на 100?

Автор - Hugo
Дата добавления - 02.06.2014 в 17:13
RAN Дата: Понедельник, 02.06.2014, 17:15 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Без файла что гадать, но, думаю из 63 часов 60,5 ушло сюда
[vba]
Код
For i = j To UBound(a) 'x
     If 0 = (i Mod 50) Then
     Cells(1, 100) = i
     Application.StatusBar = "Обработано строк " & i & " найдено " & d
     End If
'сохранение каждых 5000 строк
'  If 0 = (i Mod 5000) Then    ThisWorkbook.Save
          
     For ii = 1 To UBound(b)  'z
     If Len(Cells(i + 1, kk1)) <> 0 Or Len(Cells(i + 1, kk1 + 1)) <> 0 Then Exit For
     If InStr(1, a(i, 1), b(ii, 1), vbBinaryCompare) Then
     Cells(i + 1, kk1) = b(ii, 2)
     Cells(i + 1, kk1 + 1) = b(ii, 3): d = d + 1
     Exit For
     End If
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеБез файла что гадать, но, думаю из 63 часов 60,5 ушло сюда
[vba]
Код
For i = j To UBound(a) 'x
     If 0 = (i Mod 50) Then
     Cells(1, 100) = i
     Application.StatusBar = "Обработано строк " & i & " найдено " & d
     End If
'сохранение каждых 5000 строк
'  If 0 = (i Mod 5000) Then    ThisWorkbook.Save
          
     For ii = 1 To UBound(b)  'z
     If Len(Cells(i + 1, kk1)) <> 0 Or Len(Cells(i + 1, kk1 + 1)) <> 0 Then Exit For
     If InStr(1, a(i, 1), b(ii, 1), vbBinaryCompare) Then
     Cells(i + 1, kk1) = b(ii, 2)
     Cells(i + 1, kk1 + 1) = b(ii, 3): d = d + 1
     Exit For
     End If
[/vba]

Автор - RAN
Дата добавления - 02.06.2014 в 17:15
Матраскин Дата: Понедельник, 02.06.2014, 17:32 | Сообщение № 6
Группа: Друзья
Ранг: Обитатель
Сообщений: 375
Репутация: 81 ±
Замечаний: 0% ±

20xx
для хранения и манипуляций с таким кол-вом данных стоит использовать СУБД . вот.
например тот же access


в интернете опять кто-то не прав

Сообщение отредактировал Матраскин - Понедельник, 02.06.2014, 17:35
 
Ответить
Сообщениедля хранения и манипуляций с таким кол-вом данных стоит использовать СУБД . вот.
например тот же access

Автор - Матраскин
Дата добавления - 02.06.2014 в 17:32
hatter Дата: Понедельник, 02.06.2014, 17:54 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 160
Репутация: 0 ±
Замечаний: 0% ±

Да, спасибо, я знаю что access лучше, но покамест данные лежат в екселе и нужно что-то с ними сделать.
Прикладываю 2 файла: один кусок из базы и второй- файл-источник с кодами, по которым ведется поиск в базе и проставляются название соответствующего поставщика в 4-1 столбец.
К сообщению приложен файл: 2527302.xlsx (9.2 Kb) · 5958540.xlsx (26.5 Kb)


Сообщение отредактировал hatter - Понедельник, 02.06.2014, 17:56
 
Ответить
СообщениеДа, спасибо, я знаю что access лучше, но покамест данные лежат в екселе и нужно что-то с ними сделать.
Прикладываю 2 файла: один кусок из базы и второй- файл-источник с кодами, по которым ведется поиск в базе и проставляются название соответствующего поставщика в 4-1 столбец.

Автор - hatter
Дата добавления - 02.06.2014 в 17:54
RAN Дата: Понедельник, 02.06.2014, 19:45 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Посмотрел и понял, что ничего не понял.
Что ищем, зачем словарь, что меняем?


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПосмотрел и понял, что ничего не понял.
Что ищем, зачем словарь, что меняем?

Автор - RAN
Дата добавления - 02.06.2014 в 19:45
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос поиска соответствия (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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