passer au process de répétition de la suite suivante vba

J'ai une feuille de travail avec la colonne A qui énumère une série de risques.

La colonne F énumère les éléments susceptibles d'atténuer ces risques. Je veux écrire un script pour identifier si les risques dans un ont un contrôle ou n'ont pas de contrôle par exemple

AF Risk7 control monitor test Risk8 (blank) 

Ainsi, la production serait 1 risque avec un contrôle et un risque sans

mon script jusqu'à présent est

 Sub CountWithWithoutControls() ' counts number of risks with controls and without controls, ' currently running through each cell and comparing back to original control, ' need to write to get it to walk down the series Dim cell As Range Dim myrange As Range Dim control As Long Dim WoControl As Long Set myrange = Range("a7:f27") For Each cell In myrange If Range("c7") <> "" And Range("f7") = "Control" Then control = control + 1 If Range("c7") <> "" And Range("f7") <> "Control" Then WoControl = WoControl + 1 Next cell MsgBox control & " = number of risks with controls" & WoControl & (" = number of risks without controls") End Sub 

Je suis nouveau pour VBA et, même si je ne pense pas que cela devrait être si difficile, je ne fais aucun progrès. tout les conseils dans la bonne direction seraient très appréciés! merci tout Paul

Le code ci-dessous devrait vérifier chaque "blocage" des risques pour voir si "Control" (insensible à la casse) apparaît dans le bloc.

Je ne savais pas si les Risques étaient dans la colonne A ou la colonne C (les deux semblent mentionnés dans la question et d'autres réponses), donc j'ai utilisé des constantes pour définir les colonnes et commencer la ligne – les modifier selon le cas.

(Mise à jour pour permettre des lignes vierges dans datatables)

 Sub CountWithWithoutControls() Const RiskColumn As Ssortingng = "C" Const ControlColumn As Ssortingng = "F" Const StartAtRow As Long = 7 Dim r As Long Dim ControlFound As Boolean Dim control As Long Dim WoControl As Long Dim lastRow As Long With ActiveSheet lastRow = .Range(RiskColumn & .Rows.Count).End(xlUp).Row r = .Range(ControlColumn & .Rows.Count).End(xlUp).Row If lastRow < r Then lastRow = r End If ControlFound = False For r = StartAtRow To lastRow If UCase(Trim(CStr(.Cells(r, ControlColumn).Value))) = "CONTROL" Then ControlFound = True End If If Not IsEmpty(.Cells(r + 1, RiskColumn)) Then 'Store info for previous block each time we encounter a new "risk" If ControlFound Then control = control + 1 Else WoControl = WoControl + 1 End If ControlFound = False End If Next 'Store info for final "block" If ControlFound Then control = control + 1 Else WoControl = WoControl + 1 End If End With MsgBox control & " = number of risks with controls, " & WoControl & " = number of risks without controls" End Sub 

Je propose cette correction

  For Each cell In range("F7:F27") if cell.offset(,-3)<>"" then ' check if cell in column C is not empty if cell = "Control" then control=control+1 else WoControl=WoControl+1 end if Next cell 

Essayez le code ci-dessous, je pense que dans votre cas, il est préférable d'utiliser une boucle For sur des lignes, en analysant les valeurs dans la colonne A et la colonne F (au lieu de toute la gamme).

 Sub CountWithWithoutControls() ' counts number of risks with controls and without controls, ' currently running through each cell and comparing back to original control, ' need to write to get it to walk down the series Dim cell As Range 'Dim myrange As Range Dim control As Long Dim WoControl As Long Dim lRow As Long Dim LastRow As Long 'Set myrange = Range("A7:F27") ' find last row in Column A - risks LastRow = Cells(Rows.Count, "A").End(xlUp).Row For lRow = 7 To LastRow If Cells(lRow, "A") <> "" And Cells(lRow, "F") = "Control" Then control = control + 1 If Cells(lRow, "A") <> "" And Cells(lRow, "F") <> "Control" Then WoControl = WoControl + 1 Next lRow MsgBox control & " = number of risks with controls; " & WoControl & " = number of risks without controls" End Sub