2013-06-04 2 views
2

У меня есть данные, хранящиеся в трех столбцах Excel.Проверка согласованности данных

Column A: Product no, 
Column B: Production site 
Column C: Sales code 

Мне нужно проверить согласованность первых 6 цифр в коде продаж для каждого продукта нет.

Так, например, для всех продуктов с номером продукта. 1, мне нужно проверить, равны ли первые 6 цифр в кодах продаж. Если все коды продаж для продукта нет. 1 равны, то программа должна записать Y для Да в колонке D. Если коды продаж различны, то программа должна записать N для Нет в колонке D.

Product;Site;Sales code 

1;A;86451001  
1;B;864510.3  
1;C;86451004  
1;D;86451001  
1;E;864510.3  
1;F;86451004  
1;G;86451001  
1;H;864510.3  
1;I;86451004  
1;J;86451001  
1;K;874507.3  
1;L;87450704  
1;M;87450701  
1;N;885656.3  
1;O;88565604  
2;A;86451001  
2;B;864510.3  
2;C;86451004  
2;D;86451001  
2;E;864510.3  
2;F;88565604  
2;G;88565601  
2;H;864510.3  
2;I;86451004  
2;J;86451001  
2;K;874507.3  
2;L;87450704  
2;M;87450701  
2;N;885656.3  
3;A;88565604  
3;B;86451001  
3;C;864510.3  
3;D;86451004  
3;E;87450704 

мне нужна эта проверка непротиворечивости, потому что мои данные набор огромен. Я новичок в VBA, поэтому я не знаю, как это сделать.

У вас есть вопросы?

+1

Является ли Y или N в каждой строке, первой строке с 1 или последним? Если каждой строке потребуется собственное значение Y/N, вы хотите, чтобы мы предположили, что первая запись всегда действительна? или наиболее распространенное значение? Не могли бы вы добавить ожидаемый результат и как вы хотите, чтобы он выглядел и объяснял, почему значения такие, как они? – user2140261

ответ

0

Вот что вы можете сделать:

  • сканирования Ряды один на один

  • при идентификации новой группы хранения его номер продукта и продаж короткий код (первые 6 символов), а также с диапазоном он начинается

  • проверки каждый последующий ряд группы, чтобы увидеть, если код соответствуют

  • , если не отмечать группу как поврежденную и продолжить

  • В конце группы обратите внимание на первую строку группы и напишите флаг группы «Y» или «N» для каждой строки группы

  • после маркировки строки проверьте, если текущая строка является пустой, то да остановить сканирование

  • в противном случае сбросить значения для следующей группы и продолжить сканирование

а вот быстрый и не t оо загрязнена реализация (протестировано с небольшим набором данных, но, конечно, делать свою должную осмотрительность, прежде чем использовать его;)):

Sub check() 
Dim sh As Worksheet 
Set sh = Sheets(1) 

Dim r As Range 
Set r = sh.Range("A1") 

Dim currentProduct As Integer 
Dim currentProductSalesCode As String 
Dim currentProductStart As Range 
Dim ok As Boolean 
currentProduct = -1 
Do 
    ' Are we changing of product group? 
    If r.Value2 <> currentProduct Then 
     ' Check that this is not the beginning 
     If currentProduct <> -1 Then 
      Dim i As Integer 
      i = 0 
      ' Apply the flag to all the rows in the current group 
      Do 
       If currentProductStart.Offset(i, 0) <> currentProduct Then 
        Exit Do 
       End If 

       Dim flagOutput As Range 
       Set flagOutput = currentProductStart.Offset(i, 3) 

       If ok Then 
        flagOutput = "Y" 
       Else 
        flagOutput = "N" 
       End If 
       i = i + 1 
      Loop 

      If IsEmpty(r) Then 
       Exit Do 
      End If 
     End If 
     'Reset the values for the current group 
     currentProduct = r.Value2 
     currentProductSalesCode = Left(r.Offset(0, 2).Text, 6) 
     Set currentProductStart = r 
     ok = True 
    Else 
     ' If the current row code is not equal to the first row of the group code 
     If Left(r.Offset(0, 2).Text, 6) <> currentProductSalesCode Then 
      ok = False 
     End If 
    End If 
    Set r = r.Offset(1, 0) 
Loop 
End Sub 
0

Это очень подходит приложение для сводных таблиц. Например, добавив столбец («Продажи») с формулой =LEFT(C2,6) и макет сводной таблицы, как показано ниже, сразу же идентифицирует, что в вашем примере Y будет применяться ко всем (количество 1 в каждом случае) (при условии, что сайты могут меняться):

SO16926030 example

Другие проверки могут быть сделаны с различными формулами, подходящими в разных колонках.

1

Нам понадобится вспомогательный столбец, D1 = Product_SaleCode6

D2=A2&"_"&LEFT(C2,6) 

Затем столбец E будет тестовая колонка, E1 = Test

E2=IF(COUNTIF($A$2:$A$35,A2)=COUNTIF($D$2:$D$35,D2),"Y","N") 

Заполните выше D2, E2 формулы для всех строк.

Что я пытаюсь сделать, проверьте, совпадает ли количество товаров с количеством 6 цифр кода продаж для этой группы продуктов.

+0

Хорошая попытка, но;) ... он провалится с помощью простого ввода типа «1 \ t123456 \ n2 \ t123456 \ n», потому что если в другой группе одинаковые коды, счетчик не будет соответствовать, даже если группа хороша; таким же образом, если группа неверна, а другая имеет дополнение к счету, которое будет считать, что все в порядке. Если у ОП есть сильные гипотезы на входе, это стоит попробовать, но в противном случае это рискованно;) Кроме того, если вы хотите полностью автоматизированное решение, вы не будете его обрезать: вам нужен какой-то водопровод VBA :) – Pragmateek

+0

Испытывали ли вы мою формулу? Просто попробовал с вашим примером, и он работает. – zx8754

+0

Да, я протестировал его, вот документы Google, которые показывают проблему: https://docs.google.com/spreadsheet/ccc?key=0AhpapcT0riBSdHFsdXljM3JBRG84Sk03QU41YlJaN0E&usp=sharing Первый счет будет 1 для каждой строки, а второй будет be 2, поэтому каждая строка будет считаться недействительной, тогда как все в порядке и должно отображать «Y». Может быть, я что-то упустил ... :) – Pragmateek

Смежные вопросы