【问题标题】:Consistency check of data数据一致性检查
【发布时间】:2013-06-04 19:35:21
【问题描述】:

我将数据存储在 Excel 的三列中。

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

我需要检查每个产品编号的销售代码中前 6 位数字的一致性。

例如,对于所有带有产品编号的产品。 1,我需要检查销售代码中的前6位是否相等。如果产品编号的所有销售代码。 1相等,程序必须在D列写Y为是。如果销售代码不同,程序必须在D列写N为否。

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 的初学者,所以我不知道该怎么做。

你有什么建议吗?

【问题讨论】:

  • Y 或 N 是在每一行,第一行有 1,还是最后一行?如果每一行都需要自己的 Y/N 值,您是否希望我们假设第一个条目始终有效?还是最常见的值?您能否添加一个预期的输出以及您希望它的外观并解释这些值为何如此?

标签: excel vba find


【解决方案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 位销售代码的数量相同。

【讨论】:

  • 很好的尝试,但是 ;) ...它会失败,输入像“1\t123456\n2\t123456\n”这样的简单输入,因为如果另一个组具有相同的代码,则计数甚至不匹配如果组好;以同样的方式,如果一个组不正确,但另一个有计数的补码,它会认为没问题。如果 OP 对输入有很强的假设,这值得一试,但否则有风险;)此外,如果您想要一个完全自动化的解决方案,您不会削减它:您需要一些 VBA 管道:)
  • 你测试我的公式了吗?刚刚尝试了您的示例,它可以工作。
  • 是的,我已经测试过了,这是一个显示问题的 Google 文档:docs.google.com/spreadsheet/… 每行的第一个 countif 将为 1,但第二个 countif 将为 2,因此每行都将被视为无效而一切都很好,应该显示“Y”。也许我错过了什么...... :)
  • 我正在将 A 列计数(每个产品中有多少个)与辅助列 D 计数进行比较。 Helper 列D2=A2&"_"&LEFT(C2,6) 表示“将产品名称添加到 SalesCode 的前 6 个字符”。在您的 googledocs 中,您将 A 列计数与 B 列计数进行比较,推测 B 列是 SalesCode 的前 6 个字符。请复制并粘贴我的公式,它应该可以工作。
【解决方案2】:

你可以这样做:

  • 逐行扫描

  • 当您识别一个新的集团商店时,它的产品编号和销售短代码(前 6 个字符)以及它的起始范围

  • 检查该组的每一行以查看代码是否一致

  • 如果不将该组标记为已损坏并继续

  • 在组的末尾回顾组的第一行并为组的每一行写下组标志“Y”或“N”

  • 标记行后检查当前行是否为空,是停止扫描

  • 否则重置下一组的值并继续扫描

这是一个快速且不太脏的实现(使用您的小数据集进行测试,但在使用之前当然要尽职尽责;)):

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

【讨论】:

    【解决方案3】:

    这是一个非常适合数据透视表的应用程序。例如,添加一个带有公式=LEFT(C2,6) 的列(“Sales”)和如下所示的数据透视表布局会立即确定在您的示例中Y 将适用于所有(在每种情况下计数为 1)(假设站点可能会有所不同):

    可以在不同的列中使用不同的公式进行其他验证,以适应不同的列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2011-02-19
      • 2019-12-31
      • 2011-04-28
      • 2012-08-23
      • 2021-11-12
      • 1970-01-01
      相关资源
      最近更新 更多