Вот такая задача: Найти строку с priz=1, считать значения kod, sum, date, ozn и найти строку с точно такими же значениями kod, sum, date, ozn, но с priz=0 или priz="" и в случае удачного поиска удалить обе строки, иначе строку с priz=1 поместить на 2 лист. Реальная таблица не упорядочена. Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку. Если условие priz=0 или priz="" усложняет задачу, можно заменить priz="" на priz=0
Вот такая задача: Найти строку с priz=1, считать значения kod, sum, date, ozn и найти строку с точно такими же значениями kod, sum, date, ozn, но с priz=0 или priz="" и в случае удачного поиска удалить обе строки, иначе строку с priz=1 поместить на 2 лист. Реальная таблица не упорядочена. Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку. Если условие priz=0 или priz="" усложняет задачу, можно заменить priz="" на priz=0SergeyKorotun
можно перенести, а могу и условие задачи изменить: если пара есть, обе строки копируем на лист 4 (сначала строку с priz=0 или priz="", затем с priz=1). Строки с priz=0 или priz="", для которых нет пары, скопировать на лист 2. Строки с priz=1, для которых нет пары, скопировать на лист 3.
можно перенести, а могу и условие задачи изменить: если пара есть, обе строки копируем на лист 4 (сначала строку с priz=0 или priz="", затем с priz=1). Строки с priz=0 или priz="", для которых нет пары, скопировать на лист 2. Строки с priz=1, для которых нет пары, скопировать на лист 3.SergeyKorotun
Сообщение отредактировал SergeyKorotun - Понедельник, 01.07.2013, 20:10
Вот такая задача: Найти строку с priz=1, считать значения kod, sum, date, ozn и найти строку с точно такими же значениями kod, sum, date, ozn, но с priz=0 или priz="" и в случае удачного поиска удалить обе строки, иначе строку с priz=1 поместить на 2 лист. Реальная таблица не упорядочена. Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку с priz=0 (соответствующую строку с priz=1 также нужно удалить). Если условие priz=0 или priz="" усложняет задачу, можно заменить priz="" на priz=0
Если это сложно, то выделенное жирным шрифтом можно не реализовывать. Для упрощения еще могу исходные данные с priz=0 или priz="" помещать на один лист, а строки с priz=1 на другой лист.
Цитата
Вот такая задача: Найти строку с priz=1, считать значения kod, sum, date, ozn и найти строку с точно такими же значениями kod, sum, date, ozn, но с priz=0 или priz="" и в случае удачного поиска удалить обе строки, иначе строку с priz=1 поместить на 2 лист. Реальная таблица не упорядочена. Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку с priz=0 (соответствующую строку с priz=1 также нужно удалить). Если условие priz=0 или priz="" усложняет задачу, можно заменить priz="" на priz=0
Если это сложно, то выделенное жирным шрифтом можно не реализовывать. Для упрощения еще могу исходные данные с priz=0 или priz="" помещать на один лист, а строки с priz=1 на другой лист.SergeyKorotun
Сообщение отредактировал SergeyKorotun - Воскресенье, 07.07.2013, 23:22
Это не сложно. SQL-запросами это делается вообще легко. Если ещё можно добавить ключевое поле - то запросы получатся практически в одну строчку...
Это не сложно. SQL-запросами это делается вообще легко. Если ещё можно добавить ключевое поле - то запросы получатся практически в одну строчку...AndreTM
Дата: Понедельник, 08.07.2013, 12:04 |
Сообщение № 8
Группа: Гости
Еще несколько месяцев назад оракловские базы были в каждом отделении свои. Ночью данные из локальных баз передавались в ЦБД. Сейчас локальных баз нет, все отделения через ПО работают в реальном времени с ЦБД. Доступа на запросы к этим базам нет. С ПО можно сформировать некоторые отчеты и сохранить их в excel. Так что теперь SQL не воспользуешся. В одну строчку - вряд ли. Надо применять ранжирующие функции, так как нужно удалять не все строки с priz=0/priz="", соответствующие priz=1, а только одну.
Еще несколько месяцев назад оракловские базы были в каждом отделении свои. Ночью данные из локальных баз передавались в ЦБД. Сейчас локальных баз нет, все отделения через ПО работают в реальном времени с ЦБД. Доступа на запросы к этим базам нет. С ПО можно сформировать некоторые отчеты и сохранить их в excel. Так что теперь SQL не воспользуешся. В одну строчку - вряд ли. Надо применять ранжирующие функции, так как нужно удалять не все строки с priz=0/priz="", соответствующие priz=1, а только одну.SergeyKorotun
А причём здесь Оракл? Есть JetSQL. Вот я у вас и спрашиваю - можно ли в вашу табличку добавить уникальный ключ (например, столбец с номерами строк)? И всё у нас получится.
А причём здесь Оракл? Есть JetSQL. Вот я у вас и спрашиваю - можно ли в вашу табличку добавить уникальный ключ (например, столбец с номерами строк)? И всё у нас получится.AndreTM
Спасибо! Работает. Можно еще добавить в макрос создания листов 2, 3 и 4 в случае их отсутствия. Что еще кроме макроса нужно перенести в новый xlsx файл? В новой книге при выполнении макроса получаю на строке ADO As New ADO ошибку Compile error: User-defined type not defined
Спасибо! Работает. Можно еще добавить в макрос создания листов 2, 3 и 4 в случае их отсутствия. Что еще кроме макроса нужно перенести в новый xlsx файл? В новой книге при выполнении макроса получаю на строке ADO As New ADO ошибку Compile error: User-defined type not definedSergeyKorotun
Надо ещё перенести модуль класса ADO. Или импортировать, взяв отсюда.
А по-идее, вам надо не копировать каждый раз макросы и модули в новую книгу, а сделать в одной рабочей книге импорт из внешних файлов, и в этой же книге собрать весь функционал (обработку, классы и т.п.). То есть получили сформированные XLS-файлы - импортировали данные из них - обработали/раскидали - получили отчёты.
Надо ещё перенести модуль класса ADO. Или импортировать, взяв отсюда.
А по-идее, вам надо не копировать каждый раз макросы и модули в новую книгу, а сделать в одной рабочей книге импорт из внешних файлов, и в этой же книге собрать весь функционал (обработку, классы и т.п.). То есть получили сформированные XLS-файлы - импортировали данные из них - обработали/раскидали - получили отчёты.AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Среда, 10.07.2013, 10:23
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему. В оракле я использовал ранжирующую функцию. Все строки с priz=0 или priz="" разбивал на группы по kod, sum, date, ozn и строки каждой группы нумеровал начиная с 1. Точно также поступал со строками с priz=1. Потом к условию t1.kod=t.kod AND t1.sum=t.sum AND t1.tdate=t.tdate AND t1.ozn=t.ozn нужно добавить AND t1.rang=t.rang
AndreTM, в 3 посте я описал не все условия, а только то, что можно было изменить в 1 посте. Условие с 1 поста "Если строке с priz=1 будет соответствовать несколько строк с priz=0 или priz="", удалить нужно только одну строку" тоже должно выполняться. В приложенном файле описано, какие строки на какой лист должны попасть и почему. В оракле я использовал ранжирующую функцию. Все строки с priz=0 или priz="" разбивал на группы по kod, sum, date, ozn и строки каждой группы нумеровал начиная с 1. Точно также поступал со строками с priz=1. Потом к условию t1.kod=t.kod AND t1.sum=t.sum AND t1.tdate=t.tdate AND t1.ozn=t.ozn нужно добавить AND t1.rang=t.rangSergeyKorotun
А если все-таки со словарем? так, например (запускать при активном листе Sheet1):
[vba]
Код
Sub ertert() Dim x, i&, k, s$, t x = Range("A1:E" & Cells(Rows.Count, 1).End(xlUp).Row).Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) s = x(i, 1) & "~" & x(i, 2) & "~" & x(i, 3) & "~" & x(i, 4) If .Exists(s) Then If .Item(s) <> x(i, 5) Then t = IIf(x(i, 5) > 0, .Item(s), x(i, 5)) With Sheets("Sheet4").Cells(Rows.Count, 1).End(xlUp)(2) .Resize(2, 5).Value = Cells(i, 1).Resize(, 5).Value .Item(, 5).Value = t: .Item(2, 5).Value = 1 End With .Remove s Else Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 5).Value _ = Cells(i, 1).Resize(, 5).Value End If Else .Item(s) = x(i, 5) End If Next i For Each k In .keys t = .Item(k): s = IIf(t > 0, "Sheet3", "Sheet2") With Sheets(s).Cells(Rows.Count, 1).End(xlUp)(2) .Resize(, 4).Value = Split(k, "~"): .Item(, 5).Value = t End With Next k End With End Sub
[/vba]
никак не получается сделать, чтобы были и спойлер, и код
А если все-таки со словарем? так, например (запускать при активном листе Sheet1):
[vba]
Код
Sub ertert() Dim x, i&, k, s$, t x = Range("A1:E" & Cells(Rows.Count, 1).End(xlUp).Row).Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For i = 2 To UBound(x) s = x(i, 1) & "~" & x(i, 2) & "~" & x(i, 3) & "~" & x(i, 4) If .Exists(s) Then If .Item(s) <> x(i, 5) Then t = IIf(x(i, 5) > 0, .Item(s), x(i, 5)) With Sheets("Sheet4").Cells(Rows.Count, 1).End(xlUp)(2) .Resize(2, 5).Value = Cells(i, 1).Resize(, 5).Value .Item(, 5).Value = t: .Item(2, 5).Value = 1 End With .Remove s Else Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp)(2).Resize(, 5).Value _ = Cells(i, 1).Resize(, 5).Value End If Else .Item(s) = x(i, 5) End If Next i For Each k In .keys t = .Item(k): s = IIf(t > 0, "Sheet3", "Sheet2") With Sheets(s).Cells(Rows.Count, 1).End(xlUp)(2) .Resize(, 4).Value = Split(k, "~"): .Item(, 5).Value = t End With Next k End With End Sub
[/vba]
никак не получается сделать, чтобы были и спойлер, и кодnilem
Вроде бы верно, но буду еще тестировать. Хотелось бы и через запрос получить решение, мне там проще было бы разобраться, немного знаком с ораклом. Пример упрощенный, в реале столбцов значительно больше, строк - десятки тысяч.
Вроде бы верно, но буду еще тестировать. Хотелось бы и через запрос получить решение, мне там проще было бы разобраться, немного знаком с ораклом. Пример упрощенный, в реале столбцов значительно больше, строк - десятки тысяч.SergeyKorotun
Сергей, сейчас вроде бы нормально, но все-таки без отступов (привередничаю? ) а по началу было совсем не похоже на код - просто текст мелким шрифтом
Сергей, сейчас вроде бы нормально, но все-таки без отступов (привередничаю? ) а по началу было совсем не похоже на код - просто текст мелким шрифтомnilem
SergeyKorotun, если данных оч. много, то работать будет медленно (из-за Cells. С массивами код будет в 2 раза длиннее, и со всякими x(i, k), y(j, n) - точно будет непонятно) Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.
SergeyKorotun, если данных оч. много, то работать будет медленно (из-за Cells. С массивами код будет в 2 раза длиннее, и со всякими x(i, k), y(j, n) - точно будет непонятно) Можно, как у вас, записывать номера листов в столбик, а потом другим макросом быстро раскидывать по листам.nilem