Страницы: 1
RSS
макрос проверки таблицы на логические ошибки
 
всем здравствуйте  
ситуация следующая:  
есть таблица объемом до 10 тыс.строк  
в одном столбце ИНН организаций, во втором тип организации, определяемый из справочника (для примера крупный, средний, малый)  
столбец с ИННами не уникальный, один ИНН может много раз повторяться.  
у одного ИНН не может быть двух типов организации, т.е. один ИНН не может быть, к примеру крупным и малым одновременно.  
задача заключается в написании макроса, который будет искать такие ошибки и выводить ИНН с разными типами на отдельный лист.  
важно время работы макроса  
пожалуйста, поделитесь идеями, как написать эффективный макрос
 
А допстолбец =ИНН&"тип организации" и покрасить строку УФ если повторился Вас не устрои?
 
{quote}{login=}{date=11.03.2010 03:12}{thema=макрос проверки таблицы на логические ошибки}{post}...задача заключается в написании макроса, который будет искать такие ошибки и выводить ИНН с разными типами на отдельный лист. важно время работы макроса пожалуйста, поделитесь идеями, как написать эффективный макрос{/post}{/quote}  
Вариант: создайте пустую базу в Access, иvпортируйте в нее свою таблицу или установите связь), сделайте запрос на повторяющиеся записи по полю с ИНН, экспортируйте запрос в XL. Но, думаю, что это только начало. Вывели вы на лист "двойников", а далее что с ними делать - посмотреть и все?.. А если придется ворочать не по 1, 2-3 полям, а более, то вам г-н Некто-Никто на планету Access... Или на станцию между двумя планетами...    
Z.
 
{quote}{login=Микки}{date=11.03.2010 03:29}{thema=}{post}А допстолбец =ИНН&"тип организации" и покрасить строку УФ если повторился Вас не устрои?{/post}{/quote}  
 
это ничего не даст, я получу большую раскрашенную табличку  
к тому же мне нужно вывести ошибки на отдельный лист
 
{quote}{login=Z}{date=11.03.2010 03:34}{thema=Re: макрос проверки таблицы на логические ошибки}{post}А если придется ворочать не по 1, 2-3 полям, а более, то вам г-н Некто-Никто на планету Access... Или на станцию между двумя планетами...    
Z.{/post}{/quote}  
 
я слаб в Access, да и как-то громозко это выглядит  
если оставаться в рамках Excel?
 
{quote}{login=}{date=11.03.2010 05:41}{thema=Re: }{post}это ничего не даст, я получу большую раскрашенную табличку  
к тому же мне нужно вывести ошибки на отдельный лист{/post}{/quote}  
1 - это не ошибки, это - повторы, двойники, тройники - какой из них ошибочный? по каким критериям?  
2 - получили лист, что дальше - что ЭТО даст, если "раскраска" не помогла?..  
3 - "я слаб в Accesse..." А в макросах сильны? Какая разница там ли, здесь ли кто за вас будет делать?..  
И главное: или вы прилагаете, согласно правилам (!), конкретный пример и, хотя бы из вежливости, хоть как-то назоветесь - мы продолжаем обсуждение. Если нет - какой смысл сотрясать воздух, теряя ВРЕМЯ!..
 
Солидарен с Z - нужен небольшой файл-пример, где Вы должны разместить вместе с нормальными и ошибочные данные. Покажите куда, в каком виде их требуется выводить. А главное - напишите критейрий, по которому макрос должен понять, что это "плохая" строка. И было бы совсем неплохо как-либо обозначить себя.
 
прикрепил файл с примером  
Юрий, в этом то и проблема, я бы хотел узнать профессионалое мнение участников форума, о том как наиболее эффективно строить такой макрос  
заранее спасибо за конструктивные идеи
 
А "правильно" как? Где табличка правильных ИНН? Не вижу в Вашем файле. Каков алгоритм определения правильно-неправильно?
 
Поясню: я не знаю, как формируется ИНН. Полагаю, что есть цифра/группа цифр, которая/которые определяет принадлежность к той или иной группе. Вот эта информация и нужна. Ведь макросу нужно как-то "обяснить" правила игры.
 
Посмотрите вариант. Так как в макросе использовал функции рабочего листа, то на больших объёмах время будет заметно. Тогда нужно искать другой подход.
 
Юрий, спасибо  
интересное решение  
критерий вы правильно поняли: не может быть разных типов у одного ИНН  
на таблице в 10 тыс.строк ищет ошибки 3,5 минуты, в принципе приемлемое время  
 
я хочу попробовать вариант поиска в массиве, с предварительной сортировкой по полю ИНН и циклом, типа:  
for i = 1 to размер массива  
if arr(i,1) = arr (i+1,1) and arr(i,2) <> arr(i+1,2) then  
ошибка  
end if  
next  
где arr-массив, 1 столбец в массиве ИНН а 2 столбец в массиве тип    
 
правда я пока не знаю как делать сортировку внутри массива  
сортировать прямо в таблице нельзя  (нельзя менять таблицу)  
если получится, отпишусь сколько времени занимает такая процедура
 
Посмотрите другой вариант. Разница во времени ощутима.
 
По поводу ИНН - можно макрос на словаре написать.  
Заносим в словарь код и описание, при повторе сверяем описание, разные отбираем в массив результатов.  
На указанные 10к работа будет думаю менее 3-х секунд занимать.  
Но 2 года назад словари были ещё не в ходу :)  
А теперь уже поздно.
 
Вариант с использованием SQL, не факт,что будет быстрее, чем на словарях (отсутствие индексов не способствует ускорению)  
Public Sub GetErrorSheet()  
   Dim sCon As String, pCon As Object  
   Dim pRSet As Object, sSQL As String  
   sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName  
   sCon = sCon & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"  
     
   Set pCon = CreateObject("ADODB.Connection")  
   Set pRSet = CreateObject("ADODB.Recordset")  
     
   sSQL = "Select tr.* From (Select t1.[ИНН],t1.[Тип клиента] From [данные$] As t1 Group By t1.[ИНН], t1.[Тип клиента]) As tr Inner Join "
   sSQL = sSQL & "(Select t2.[ИНН] From (Select t1.[ИНН],t1.[Тип клиента] From [данные$] As t1 Group By t1.[ИНН], t1.[Тип клиента]) As t2 Group By t2.[ИНН] Having Count(t2.[Тип клиента])>1) As tj"
   sSQL = sSQL & " On tr.[ИНН]=tj.[ИНН]"
   pCon.Open sCon  
   pRSet.Open sSQL, pCon  
   ThisWorkbook.Worksheets.Add  
   ActiveSheet.Range("A2").CopyFromRecordset pRSet  
   pRSet.Close: pCon.Close  
End Sub
Страницы: 1
Читают тему
Наверх