Есть 2 файла : "База" в которой около млн строк и 2-й файл "Бизнес-тема" в нем около 500000 строк. В файле База есть 45 -й столбец "БТ" который нужно заполнить названием Бизнес-темы из 2-го одноименного файла по наборам кодов: Код ОКПО из Базы соответствует коду ЄДРПОУ одержувача, и Код товара УК ЗЕД - 10 знаков соответствует коду "Текст", если макрос находит соответствие сочетанию кодов из базы в Бизнес-теме, то проставляет в файл "База" соответствующее название Бизнес-темы.
есть макрос который должен это делать [vba]
Код
Option Explicit Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Const nn As Long = 45 'Номер столбца Public Const nn2 As String = "Бизнес-тема.xlsx" 'Название книги Public Const nn3 As String = "Каталог" 'Название листа Sub Basa() Dim a(), b(), t$, ii&, i&, x&, ss$, d&, z&, Dict As Object, tt As Object Dim w As Workbook, v As Worksheet d = timeGetTime Application.ScreenUpdating = False For Each w In Application.Workbooks If w.Name = nn2 Then With w.Sheets(nn3) ii = .Cells(.Rows.Count, 1).End(xlUp).Row a = Range(.Cells(1, 1), .Cells(ii, 4)) End With Exit For End If Next Application.StatusBar = "Подготовка данных. Всего строк " & ii With CreateObject("Scripting.Dictionary") For i = 2 To UBound(a) .Item(a(i, 1) & "|" & a(i, 3)) = a(i, 4) Next ii = Cells(Rows.Count, 2).End(xlUp).Row a = Range("B1:M" & ii).Value b = Range(Cells(1, nn), Cells(ii, nn)).Value For x = 2 To ii t = a(x, 1) & "|" & a(x, 12) If .Exists(t) Then If Len(b(x, 1)) = 0 Then '''''' Cells(x, nn) = .Item(t): z = z + 1 End If If 0 = (x Mod 10000) Then Application.StatusBar = "В строке № " & x & " Найдено: " & z End If End If Next x End With d = timeGetTime - d i = MsgBox(d & Chr(13) & Chr(13) & "Найдено совпадений: " & z, vbInformation, "Время выполнения миллисекунд") Application.StatusBar = False End Sub Sub cilki() If Application.ReferenceStyle = xlR1C1 Then Application.ReferenceStyle = xlA1 Else Application.ReferenceStyle = xlR1C1 End If End Sub
[/vba] но он выдает ошибку "Run time error 7" out of memory Помогите исправить эту ошибку
Есть 2 файла : "База" в которой около млн строк и 2-й файл "Бизнес-тема" в нем около 500000 строк. В файле База есть 45 -й столбец "БТ" который нужно заполнить названием Бизнес-темы из 2-го одноименного файла по наборам кодов: Код ОКПО из Базы соответствует коду ЄДРПОУ одержувача, и Код товара УК ЗЕД - 10 знаков соответствует коду "Текст", если макрос находит соответствие сочетанию кодов из базы в Бизнес-теме, то проставляет в файл "База" соответствующее название Бизнес-темы.
есть макрос который должен это делать [vba]
Код
Option Explicit Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Const nn As Long = 45 'Номер столбца Public Const nn2 As String = "Бизнес-тема.xlsx" 'Название книги Public Const nn3 As String = "Каталог" 'Название листа Sub Basa() Dim a(), b(), t$, ii&, i&, x&, ss$, d&, z&, Dict As Object, tt As Object Dim w As Workbook, v As Worksheet d = timeGetTime Application.ScreenUpdating = False For Each w In Application.Workbooks If w.Name = nn2 Then With w.Sheets(nn3) ii = .Cells(.Rows.Count, 1).End(xlUp).Row a = Range(.Cells(1, 1), .Cells(ii, 4)) End With Exit For End If Next Application.StatusBar = "Подготовка данных. Всего строк " & ii With CreateObject("Scripting.Dictionary") For i = 2 To UBound(a) .Item(a(i, 1) & "|" & a(i, 3)) = a(i, 4) Next ii = Cells(Rows.Count, 2).End(xlUp).Row a = Range("B1:M" & ii).Value b = Range(Cells(1, nn), Cells(ii, nn)).Value For x = 2 To ii t = a(x, 1) & "|" & a(x, 12) If .Exists(t) Then If Len(b(x, 1)) = 0 Then '''''' Cells(x, nn) = .Item(t): z = z + 1 End If If 0 = (x Mod 10000) Then Application.StatusBar = "В строке № " & x & " Найдено: " & z End If End If Next x End With d = timeGetTime - d i = MsgBox(d & Chr(13) & Chr(13) & "Найдено совпадений: " & z, vbInformation, "Время выполнения миллисекунд") Application.StatusBar = False End Sub Sub cilki() If Application.ReferenceStyle = xlR1C1 Then Application.ReferenceStyle = xlA1 Else Application.ReferenceStyle = xlR1C1 End If End Sub
[/vba] но он выдает ошибку "Run time error 7" out of memory Помогите исправить эту ошибкуhatter
Option Explicit Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Const nn As Long = 35 'Номер столбца Public Const nn2 As String = "Бизнес-тема.xlsx" 'Название книги Public Const nn3 As String = "Каталог" 'Название листа
Sub Basa() Dim a, ii&, s$, i&, x&, ss$, d&, z& Dim w As Workbook, v As Worksheet, vm As Worksheet d = timeGetTime Set vm = ActiveSheet Columns(nn).ClearContents For Each w In Application.Workbooks If w.Name = nn2 Then w.Activate Sheets(nn3).Select ii = Cells(Rows.Count, 1).End(xlUp).Row a = Range(Cells(1, 1), Cells(ii, 4)) Exit For End If Next vm.Activate ii = Cells(Rows.Count, 1).End(xlUp).Row For x = 2 To ii Application.StatusBar = "Обрабатываем строку № " & x & " Найдено: " & z s = Cells(x, 2): ss = Cells(x, 13) For i = LBound(a) To UBound(a) If a(i, 1) = s Then If a(i, 3) = ss Then Cells(x, nn) = a(i, 4) z = z + 1 Exit For End If End If Next i Next x d = timeGetTime - d i = MsgBox(d & Chr(13) & Chr(13) & "Найдено совпадений: " & z, vbInformation, "Время выполнения миллисекунд") Application.StatusBar = False End Sub
[/vba] Помогите, пожалуйста, дополнить его условием проверки заполняемого столбца на наличие в нём уже стоящих значений.
А этот код работает [vba]
Код
Option Explicit Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Const nn As Long = 35 'Номер столбца Public Const nn2 As String = "Бизнес-тема.xlsx" 'Название книги Public Const nn3 As String = "Каталог" 'Название листа
Sub Basa() Dim a, ii&, s$, i&, x&, ss$, d&, z& Dim w As Workbook, v As Worksheet, vm As Worksheet d = timeGetTime Set vm = ActiveSheet Columns(nn).ClearContents For Each w In Application.Workbooks If w.Name = nn2 Then w.Activate Sheets(nn3).Select ii = Cells(Rows.Count, 1).End(xlUp).Row a = Range(Cells(1, 1), Cells(ii, 4)) Exit For End If Next vm.Activate ii = Cells(Rows.Count, 1).End(xlUp).Row For x = 2 To ii Application.StatusBar = "Обрабатываем строку № " & x & " Найдено: " & z s = Cells(x, 2): ss = Cells(x, 13) For i = LBound(a) To UBound(a) If a(i, 1) = s Then If a(i, 3) = ss Then Cells(x, nn) = a(i, 4) z = z + 1 Exit For End If End If Next i Next x d = timeGetTime - d i = MsgBox(d & Chr(13) & Chr(13) & "Найдено совпадений: " & z, vbInformation, "Время выполнения миллисекунд") Application.StatusBar = False End Sub
[/vba] Помогите, пожалуйста, дополнить его условием проверки заполняемого столбца на наличие в нём уже стоящих значений.hatter