2017-09-22 2 views
3

Je suis nouveau à exceller VBA et j'ai une tâche que j'ai besoin de compléter en utilisant VBA. Je cherche à comparer les valeurs dans la même colonne. Je veux commencer la comparaison avec la dernière rangée et remonter. Les critères de filtrage sont les suivants: si la différence en% entre le nombre actuel et le dernier nombre est supérieure à 3%, copiez et collez la valeur sur une autre ligne. Une fois qu'une valeur est copiée et collée, les valeurs dans les données doivent être comparées à la valeur copiée et collée précédente lors de la vérification de la différence de 3%. Exemple ci-dessous Merci d'avance.Excel VBA - Comparaison de lignes dans la même colonne

Par exemple, si ma gamme de données sont présentées ci-dessous

1100 
1285 
1290 
3005 
1500 
2020 
2030 
2040 
2050 
2060 
2070 
2080 
2100 
2500 
3000 

Cela devrait être mon résultat:

1100 
1290 
1500 
2030 
2100 
2500 
3000 

Les résultats que j'ai droit ont maintenant 3005 là-dedans (la différence entre 3000 et 3005 est inférieur à 3% pour cent (3005/3000) donc 3005 ne devrait pas figurer dans la liste), alors qu'il ne devrait pas figurer dans la liste.

1100 
1290 
3005 
1500 
2030 
2100 
2500 
3000 

Ceci est le code que j'ai pour le moment. Merci d'avance.

Sub main2() 

Dim row_a As Long 
Dim row_b As Long 
Dim l_2 

row_b = Range("D5000").End(xlUp).Row 
Cells(row_b, "d").Copy Cells(row_b, "P") 

l_2 = row_b - 1 

For i = row_b To 3 Step -1 
    a = Cells(row_b, "d").Value 
    For j = l_2 To 3 Step -1 
     If a/Cells(j, "d") <= 0.97 Or a/Cells(j, "d") >= 1.03 Then 
      Cells(j, "d").Copy Cells(j, "p") 
      a = Cells(j, "d").Value 
     End If 
    Next j 
Next i 

End Sub 
+2

selon votre propre cahier des charges, 3005 devrait être mis sur la liste parce que la différence entre 3005 et 1290 et la différence entre 3005 et 1500 sont à la fois plus que 3% ... s'il vous plaît repenser votre spécification – jsotola

+0

@ Jonathon-Sidwell, It wou Je serais utile pour tout lecteur de ce post si vous pouviez décrire au moins ce que vous utilisez votre requête. car il semble y avoir quelques difficultés à spécifier l'approche voulue. –

Répondre

1

@Jonathon Comme je passe par votre code et a constaté que vous devez sélectionner la valeur dans la colonne « D » comme,

si la valeur est sélectionnée, pas de valeur sélectionner près de 3% de tout valeur sélectionnée

et les critères de sélection va du bas vers le haut qui viennent d'abord prendre comme vous l'avez suggéré dans (3000 un problème 3005)

coller toute valeur sélectionnée dans la colonne « P »

S'il est correct, puis passez le code suivant, il répond à la condition donnée selon la question

'' '' '' '' '' '' '' '' '' '' '' '' '' ' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' ' Code Début ici

Sub Filter3Per() 

Dim LastRow As Integer 
Dim ComVal As String 


'''''''''Apply filter on columun with loop as per criteria 
'Read last Row from D column 
LastRow = Cells(Rows.Count, "D").End(xlUp).Row 

'Clear format color of column D 
Range("D:D").Interior.ColorIndex = -4142 

'''Clear P column 
Range("P:P").ClearContents 
'Loop Goes from botttom to top 3 row 
For i = LastRow - 1 To 1 Step -1 
    'Read compvalue 
    ComVal = Cells(i + 1, "D").Value 

    'Check for color 
    If Cells(i + 1, "D").Interior.ColorIndex <> 3 Then 

     'Loop to Check as Criteria 
     For j = i To 1 Step -1 

     'Critera 
     If ComVal/Cells(j, "D") <= 0.97 Or ComVal/Cells(j, "D") >= 1.03 Then 

     Else 
     Cells(j, "D").Interior.ColorIndex = 3 

     End If 
     Next 

    End If 

Next 

''''''''Apply filter on columun with loop as per criteria End here 
'''''''''''''''Collect value'''''''''''''''''''' 
'''Clear P column 

Range("P:P").ClearContents 
For i = 1 To LastRow 

    If Cells(i, "D").Interior.ColorIndex <> 3 Then 

    Cells(i, "P").Value = Cells(i, "D") 'add value in p Column 

    End If 
Next 
'''''''''''Collect value end here 
End Sub 

« sous fin ici « » » « »

+1

Utilisez toujours des références de plage entièrement qualifiées, par ex. 'Dim ws As WorkSheet' suivi de' Set ws = ThisWorkBook.WorkSheets ("MySheetName") '. Vous pouvez alors vous référer précisément à 'ws.Cells (i + 1," D ")' par exemple, au lieu de 'Cells' seul. –

+0

C'est une bonne idée de marquer les valeurs d'exclusion par un index de couleur intérieur au lieu d'utiliser une colonne supplémentaire. –

+0

votre déclaration ComVal en tant que chaîne se traduira par une erreur de type. –