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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос заполнения столбца по 2-м условиям - Мир MS Excel

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

Есть 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
Помогите исправить эту ошибку
К сообщению приложен файл: 5103868.xlsx (23.5 Kb)


Сообщение отредактировал hatter - Понедельник, 17.03.2014, 15:47
 
Ответить
СообщениеЕсть 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
Дата добавления - 17.03.2014 в 12:34
Hugo Дата: Понедельник, 17.03.2014, 13:50 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Вот тут непонятно - это откуда данные берёте? Так и не удалось проверить/найти совпадения.

[vba]
Код
ii = Cells(Rows.Count, 2).End(xlUp).Row
[/vba]

Ну а тут я бы делал два параллельных массива - зачем тянуть лишние 11 столбцов? Вот и память сэкономите.

[vba]
Код
a = Range("B1:M" & ii).Value
[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеВот тут непонятно - это откуда данные берёте? Так и не удалось проверить/найти совпадения.

[vba]
Код
ii = Cells(Rows.Count, 2).End(xlUp).Row
[/vba]

Ну а тут я бы делал два параллельных массива - зачем тянуть лишние 11 столбцов? Вот и память сэкономите.

[vba]
Код
a = Range("B1:M" & ii).Value
[/vba]

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

А этот код работает [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]
Помогите, пожалуйста, дополнить его условием проверки заполняемого столбца на наличие в нём уже стоящих значений.
 
Ответить
СообщениеА этот код работает [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
Дата добавления - 17.03.2014 в 15:28
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос заполнения столбца по 2-м условиям (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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