Я думаю, что ваши конкретные примеры нуждаются в дополнительном объяснении.
VBA:
Предположения:
- Он учитывается как не участвовавший (DNP), т. Е. Если у вас есть DNP между победами, вы берете счет выигрышей с того места, где он был до DNP.
- Он игнорирует DNP при старте до первой победы.
- Обе атаки Победа считается 2 победами. Если нет, то закомментируйте 3 строки
Case "both attacks won"
, winStreak = winStreak + 2
и currentWinStreak = currentWinStreak + 2
. Он введет Case Else
и добавит 1.
- Победа-затем-проигрыш считается победой, а затем возобновляется счет выигрыша.
- Lose-then-win сбрасывает счет выигрыша и добавляет 1 к текущему счету.
- StartCell - это значение столбца C для строки, используемой в расчете.
Код:
Option Explicit
Public Sub WriteOutValues()
Application.ScreenUpdating = False
Dim ws As Worksheet, currentCell As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws
For Each currentCell In .Range("C2", .Range("C2").End(xlDown))
currentCell.Offset(8, -1) = GetWinStreak(currentCell)(0)
currentCell.Offset(8, 0) = GetWinStreak(currentCell)(1)
Next currentCell
End With
Application.ScreenUpdating = True
End Sub
Public Function GetWinStreak(ByVal startCell As Range) As Variant
With startCell.Parent
Dim loopRange As Range
Set loopRange = .Range(startCell, startCell.End(xlToRight))
Dim winTerms()
winTerms = Array("attack won", "both attacks won", "win, then lost", "lost, then win")
Dim winStreak As Long, highestWinStreak As Long, currentWinStreak As Long, currentCell As Range
Dim testValue As String
For Each currentCell In loopRange
testValue = LCase$(Trim$(currentCell.Value))
If testValue = "did not participate" And winStreak = 0 Then GoTo NextLine
If Not IsError(Application.Match(testValue, winTerms, 0)) Then
Select Case testValue
Case "both attacks won"
winStreak = winStreak + 2
currentWinStreak = currentWinStreak + 2
If highestWinStreak < winStreak Then highestWinStreak = winStreak
Case "win, then lost"
winStreak = winStreak + 1
If highestWinStreak < winStreak Then highestWinStreak = winStreak
winStreak = 0
currentWinStreak = 0
Case "lost, then win"
winStreak = 0
currentWinStreak = 1
winStreak = winStreak + 1
If highestWinStreak < winStreak Then highestWinStreak = winStreak
Case Else
winStreak = winStreak + 1
currentWinStreak = currentWinStreak + 1
If highestWinStreak < winStreak Then highestWinStreak = winStreak
End Select
ElseIf testValue = "did not participate" And winStreak > 0 Then
Else
winStreak = 0
currentWinStreak = 0
End If
NextLine:
Next currentCell
End With
GetWinStreak = Array(highestWinStreak, currentWinStreak)
End Function
Alt + F11, чтобы открыть VBE и щелкнуть правой кнопкой мыши по вставке стандартного модуля в проект, и код будет там.
Код в модуле:
![Code in module](https://i.stack.imgur.com/ydKop.png)
Выход:
![Output](https://i.stack.imgur.com/hcJg1.png)
Формулы:
Недостаток в настоящее время, например. 1) BW (Обе атаки выиграны) засчитывается как 1 балл. 2) Счет не поддерживается в рамках «Не внес вклад». 3) Неправильно обрабатывает WTL и LTW. Включено как моя лучшая попытка на данный момент, что, возможно, кто-то может улучшить. Изображение выше не отображает вывод формул. Смотрите изображение ниже.
Таким образом, в зависимости от того, что имеет значение для победы, измените следующее:
(C2:J2="W") + (C2:J2="BW") + (C2:J2="WTL")
В приведенном выше W - победа, BW - победа, WTL - победа, затем проигрыш. Предположим, что все это способствует победе. В противном случае удалите термин, который не считается.
В B2 идет и перетаскивает вниз строки:
=MAX(FREQUENCY(IF((C2:J2="W") + (C2:J2="BW") + (C2:J2="WTL"),COLUMN($C$1:$J$1)-COLUMN($C$1)+1),IF((C2:J2="W") + (C2:J2="BW") + (C2:J2="WTL"),0,COLUMN($C$1:$J$1)-COLUMN($C$1)+1)))
Вы вводите его как формулу массива, то есть нажмите Ctrl + Shift + Введите , чтобы ввести формулу в ячейку, и {} фигурные скобки должны появляются в любом конце формулы.
![data](https://i.stack.imgur.com/rJQ8C.png)