Расчет выигрышных полос - PullRequest
0 голосов
/ 12 мая 2018

Я отслеживаю выступления игроков в игре и хочу автоматически сгенерировать текущую серию побед игроков. Кроме того, я также хочу отслеживать наибольшую серию побед игроков. Я пытался посмотреть на , , , и , , но я не могу настроить формулу в соответствии с моим сценарием. Speadsheet of Tracked Statistics

Существует 8 возможных значений, которые можно ввести в ячейки:

  1. Атака выиграна
  2. Атака потеряна
  3. Обе атаки выиграны
  4. Обе атаки потеряны
  5. победа, затем проигрыш
  6. Проиграл, потом выиграл
  7. Не участвовал
  8. Выгнали

Я бы хотел, чтобы формула рассчитывала серию выигрышей таким образом, чтобы у Игрока 1 была текущая полоса выигрыша 8, у игрока 2 - текущая полоса победы 7, у игрока 3 - текущая полоса победы 3, и так далее.

Какую формулу я могу использовать, не используя VBA для генерации соответствующих полос побед?


Дополнительные тематические исследования

Примеры результатов игры

Player  |    War 1    |       War 2         |        War 3        |      War 4       |        War 5
----------------------------------------------------------------------------------------------------------
PlayerA | Attack Won  |   Both Attacks Won  |   Win, then Lost    |    Attack Won    |     Attack Won
PlayerB | Attack Won  |     Attack Lost     |   Lost, then Win    | Both Attacks Win |     Attack Lost
PlayerC | Attack Won  | Did not Participate | Did not Participate | Both Attacks Won |     Attack Won
PlayerD | Attack Lost |     Attack Lost     | Did not Participate | Win, then Lost   | Did not Participate

Выход желаемых полос побед

Player  | Highest Win Streak | Current Win Streak
--------------------------------------------------
PlayerA |        3           |         2
PlayerB |        3           |         0
PlayerC |        4           |         4
PlayerD |        1           |         0

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я думаю, что ваши конкретные примеры нуждаются в дополнительном объяснении.

VBA:

Предположения:

  1. Он учитывается как не участвовавший (DNP), т. Е. Если у вас есть DNP между победами, вы берете счет выигрышей с того места, где он был до DNP.
  2. Он игнорирует DNP при старте до первой победы.
  3. Обе атаки Победа считается 2 победами. Если нет, то закомментируйте 3 строки Case "both attacks won", winStreak = winStreak + 2 и currentWinStreak = currentWinStreak + 2. Он введет Case Else и добавит 1.
  4. Победа-затем-проигрыш считается победой, а затем возобновляется счет выигрыша.
  5. Lose-then-win сбрасывает счет выигрыша и добавляет 1 к текущему счету.
  6. 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

Выход:

Output

Формулы:

Недостаток в настоящее время, например. 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

0 голосов
/ 12 мая 2018

Итак, не делая их все, поскольку у вас есть несколько разных результатов (вы можете захотеть пересмотреть способ записи данных ...), вы можете использовать countifs (), используя War 1 в качестве примера: enter image description here

Как только у вас есть список результатов серии побед, max () является односторонним, но большое () также обеспечивает большую гибкость, то есть самый большой и следующий по величине ...

...