2017-10-08 11 views
0
Sub test_calculateval() 
    Dim rnData, r As Range, ThisYearID, LR, FR, EndR, HomeCount, AwayCount, DrawCount, i As Long, Hometeam As String 
    ThisYearID = Sheet5.Cells(2, 1).Value - 1 
    Hometeam = Sheet5.Cells(2, 5) 
    HomeCount = 0 
    With Sheet1 
     Set rnData = Range(Range("A2"), Range("R2").End(xlDown)) 
     With rnData 
      Rows("1:1").Select 
      Selection.AutoFilter 
      ActiveSheet.Range(Range("A2"), Range("R2").End(xlDown)).AutoFilter Field:=1, Criteria1:=">" & ThisYearID - 5 
      ActiveSheet.Range(Range("A2"), Range("R2").End(xlDown)).AutoFilter Field:=5, Criteria1:=Hometeam 
      LR = Range("A" & Rows.count).End(xlUp).Row 
      Set r = ActiveSheet.Range("A2:R" & LR).Rows.SpecialCells(xlCellTypeVisible) 
      FR = r.Row 
      EndR = Range("A" & FR).End(xlDown).Row 
      For Each rngarea In .SpecialCells(xlCellTypeVisible).Areas 
       If Range("K2:K" & LR).SpecialCells(xlCellTypeVisible).Value = "H" Then 
        HomeCount = HomeCount + 1 
       End If 
      Next 
     End With 
    End With 
    MsgBox HomeCount 
End Sub 

Je veux vérifier si chaque cellule de la colonne K (après filtrage) est égale à "H", et les compter. Ce code est de lancer une erreur d'incompatibilité de type, ce qui semble être le problèmevba pour vérifier si chaque cellule dans une colonne est égale à une variable après le filtrage

+0

Essayez le débogage en appuyant sur F8 et savoir quelle ligne de code est l'origine du problème de non-concordance de type? Le plus probablement une variable définie par un entier est assignée à une valeur de chaîne et VBA ne peut pas faire implicitement cette conversion. – jainashish

+0

Je pense que celui-ci: Pour chaque rngarea Dans .SpecialCells (xlCellTypeVisible) .Areas Si Range ("K2: K" & LR) .SpecialCells (xlCellTypeVisible) .Value = "H" Alors HomeCount = HomeCount + 1 End Si – Chadi

Répondre

0

Comme il est possible que

Range("K2:K" & LR).SpecialCells(xlCellTypeVisible).Value 

pourrait être retournaient plusieurs cellules, de sorte qu'il ne peut pas être comparé à une seule valeur de chaîne. En termes simples, nous ne pouvons pas calculer la valeur de plusieurs cellules, lorsqu'elles sont renvoyées dans une plage. La solution applique un troisième filtre à la plage filtrée qui filtre tous les enregistrements ayant la valeur "H" dans la colonne K puis on compte toutes les cellules visibles.

Ce code s'avère plus rapide que de faire la même chose via des boucles.

Remplacer ce code existant avec celui-ci:

Sub test_calculateval() 
Dim rnData, r As Range, ThisYearID, LR, FR, EndR, HomeCount, AwayCount, DrawCount, i As Long, Hometeam As String 
ThisYearID = Sheet5.Cells(2, 1).Value - 1 
Hometeam = Sheet5.Cells(2, 5) 
HomeCount = 0 
With Sheet1 
    Set rnData = Range(Range("A2"), Range("R2").End(xlDown)) 
    With rnData 
     .AutoFilter 
     .AutoFilter Field:=1, Criteria1:=">" & ThisYearID - 5 
     .AutoFilter Field:=5, Criteria1:=Hometeam 
     .AutoFilter Field:=11, Criteria1:="=H", Operator:=xlAnd 
     HomeCount = .Columns("K2:K" & (rnData.Rows.Count)).SpecialCells(xlCellTypeVisible).Count-1 
    End With 
End With 
MsgBox HomeCount 

End Sub

+0

cela fonctionne, mais il compte tout le "H" dans la colonne K, non seulement les visibles après le filtrage est appliqué. – Chadi

+0

J'ai modifié le code. Vérifiez s'il vous plaît. – jainashish