I'd make a user defined function since IMHO the logic is too complicated for just worksheet formulas
IF I UNDERSTAND your logic ...
Option Explicit
Function ActivityPercent(actNumbers As Range, ActLimits As Range) As Double
Dim i As Long
Dim actNumber As Variant, limitNumber As Variant, limitMax As Variant, limitPercent As Variant
Dim actCount() As Long
Dim actTotal As Double
Application.Volatile
'move data into arrays
With Application.WorksheetFunction
actNumber = .Transpose(actNumbers.Columns(1))
limitNumber = .Transpose(ActLimits.Columns(1))
limitMax = .Transpose(ActLimits.Columns(2))
limitPercent = .Transpose(ActLimits.Columns(28))
End With
'create and init a max count array
ReDim actCount(LBound(limitNumber) To UBound(limitNumber))
For i = LBound(limitMax) To UBound(limitMax)
actCount(i) = limitMax(i)
Next I
'see if activity count exceeded by decrementing max
For i = LBound(actNumber) To UBound(actNumber)
If actNumber(i) > 0 Then
If limitMax(actNumber(i)) > 0 Then
limitMax(actNumber(i)) = limitMax(actNumber(i)) - 1
actTotal = actTotal + limitPercent(actNumber(i))
End If
End If
Next I
ActivityPercent = actTotal
End Function