2013-06-04 5 views
2

J'ai des données stockées dans trois colonnes d'Excel.Contrôle de cohérence des données

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

Je dois vérifier la cohérence des 6 premiers chiffres du code des ventes pour chaque produit non.

Par exemple, pour tous les produits avec le numéro de produit. 1, j'ai besoin de vérifier si les 6 premiers chiffres dans les codes de vente sont égaux. Si tous les codes de vente pour le numéro de produit 1 sont égaux, le programme doit écrire Y pour Oui dans la colonne D. Si les codes de vente sont différents, le programme doit écrire N pour No dans la colonne 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 

J'ai besoin cette vérification de la cohérence parce que mes données l'ensemble est énorme. Je suis un débutant avec VBA, donc je n'ai aucune idée de comment faire ça.

Avez-vous des conseils?

+1

Y ou N va-t-il dans chaque ligne, la première rangée avec le 1 ou le dernier? Si chaque ligne aura besoin de sa propre valeur Y/N, voulez-vous que nous présumions que la première entrée est toujours valide? ou la valeur la plus commune? Pourriez-vous ajouter une sortie attendue et comment vous aimeriez qu'elle regarde et explique pourquoi les valeurs sont comme elles? – user2140261

Répondre

0

Voici ce que vous pouvez faire:

  • balayer les lignes une par une

  • lorsque vous identifiez un nouveau magasin de groupe son numéro de produit et des ventes à court code (les 6 premiers caractères) le long avec la gamme il commence à

  • contrôle chaque rangée subséquente du groupe pour voir si le code sont compatibles

  • sinon marquer le groupe comme corrompu et continuer

  • à la fin du groupe revenir à la première ligne du groupe et écrire le drapeau de groupe, "Y" ou "N", pour chaque ligne du groupe

  • après avoir marqué les lignes vérifier si la ligne actuelle est vide, oui arrêter le balayage

  • autrement remis à zéro les valeurs du groupe suivant et continuer le balayage

et voici un rapide et pas t oo la mise en œuvre sale (testé avec vos petites ensemble de données, mais bien sûr faire votre diligence raisonnable avant de l'utiliser;)):

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

Ceci est une application très approprié pour les tableaux croisés dynamiques. Par exemple, ajouter une colonne ("Ventes") avec une formule =LEFT(C2,6) et une disposition de tableau croisé dynamique comme ci-dessous identifie immédiatement que dans votre échantillon Y s'appliquerait à tous (comptez 1 dans tous les cas) (en supposant que les sites peuvent varier):

SO16926030 example

D'autres validations pourraient être faites avec différentes formules, en fonction des différentes colonnes.

1

Nous aurons besoin d'une colonne d'aide, D1 = Product_SaleCode6

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

Ensuite, la colonne E sera votre colonne de test, E1 = Test

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

Remplissez ci-dessus D2, formules E2 pour tous lignes Ce que j'essaie de faire, c'est de vérifier si le nombre de produits est le même que le nombre de 6 chiffres du code de vente pour ce groupe de produits.

+0

Bon essai mais;) ... il échouera avec une simple entrée comme "1 \ t123456 \ n2 \ t123456 \ n" car si un autre groupe a les mêmes codes le compte ne sera pas égal même si le groupe est bon; de la même manière si un groupe est incorrect mais qu'un autre a le complément pour le compte il croira que c'est OK. Si le PO a des hypothèses fortes sur l'entrée cela vaut la peine d'essayer mais sinon c'est risqué;) De plus, si vous voulez une solution entièrement automatisée, vous ne le couperez pas: vous avez besoin de plomberie VBA :) – Pragmateek

+0

Avez-vous testé ma formule? Juste essayé avec votre exemple et cela fonctionne. – zx8754

+0

Oui, je l'ai testé, voici un document Google qui montre le problème: https://docs.google.com/spreadsheet/ccc?key=0AhpapcT0riBSdHFsdXljM3JBRG84Sk03QU41YlJaN0E&usp=sharing Le premier countif sera 1 pour chaque ligne, mais la seconde volonté sera Soit 2 donc chaque rangée sera considérée invalide alors que tout va bien et devrait afficher "Y". Peut-être que je manque quelque chose ... :) – Pragmateek

Questions connexes