3

Excel の 3 つの列にデータを保存しています。

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初心者なのでやり方がわかりません。

ヒントはありますか?

4

3 に答える 3

0

これがあなたができることです:

  • 行を 1 つずつスキャンする

  • 新しいグループストアを特定するときは、その製品番号と販売ショートコード (最初の 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
于 2013-06-04T22:50:37.340 に答える
0

これは、ピボットテーブルに非常に適したアプリケーションです。たとえば、次のように数式=LEFT(C2,6)とピボット テーブル レイアウトを使用して列 ("Sales") を追加すると、サンプルYがすべてに適用されることがすぐにわかります (カウントはすべての場合で 1 です) (サイトが異なる場合があると仮定します)。

SO16926030 例

他の検証は、さまざまな式を使用して、さまざまな列で適切に行うことができます。

于 2013-06-04T22:51:29.443 に答える