создать функцию для расчета общего балла игрока на нескольких Crietera - PullRequest
0 голосов
/ 12 октября 2019

Мои данные примерно такие:

            f         g     h       i    points new  points old
name        runs    balls   4's    6's    
xxy         40         60    2      4      50         26     
aabc        25         45    2      0      25         13.5  
lmn         102        80    10     4      138        70

Мне нужно рассчитать общее количество очков, набранное игроками по следующим критериям

  1. оценка игрока 1 очко за каждый набранный пробегранее он получал 0,5 очка

  2. игрок, набравший 2 очка за каждое попадание 6, ранее он зарабатывал 1 очко

  3. игрок, набравший 1 очко за каждоеХит 4 ранее, он зарабатывал 0,5 очка

  4. Игрок набрал 8 бонусных очков за 50, раньше - 4

  5. Игрок набрал 16 бонусных очковдля того, чтобы набрать 100 очков раньше, это было 8

  6. Начиная с одиннадцати зарабатывается 2 очка

  7. игроки получают отрицательные очки за низкий удар, как показано ниже

    • уровень удара ниже 50% отрицательной точки -6 ранее -3

    • уровень удара от 50 до 60 отрицательной точки -4 ранее -2

    • частота удара от 60 до 70 с отрицательной точкой -2 ранее -1

    • Out forутка (ноль) отрицательная точка -2 (без изменений)

У меня длинная формула Excel, которую сложно изменить в случае каких-либо изменений в системе начисления очков. Таким образом, я предлагаю разместить различные критерии на одном листе, а данные игрока вместе с результатами на другом листе, чтобы вычислить очки, набранные игроком.

Таким образом, я предлагаю разместить различные критерии на одном листе и данные игрока на другом листе, чтобы вычислить очки, набранные игроком.

Я попытался создать функцию, с которой можно было бы начислять очки, набранные игроком. Но это я не могу закончить это должным образом. Кроме того, я хочу поместить критерии в другой лист и вычислить точку, как мне создать функцию для этого. Я начал с чего-то вроде этого:

Function tscore(tscore) As Integer
    strikerate = 0
    economyrate = 0 
    halfcentry = 0
    century = 0
    ducks = 0
    wickets = 0
    runs = 0
    SIXERS = 0
    BOUNDERY = 0
    starteleven=2
    If Range("f2") > 0 Then
        runs = Range("F2") * 1
    End If
    If Range("H2") > 0 Then
        BOUNDERY = Range("H2") * 1
    End If
    If Range("H2") > 0 Then
       SIXERS = Range("I2") * 2
    End If
    If Range("F2") / Range("G2") < 50 Then
       strikerate = -3
    Else
       If Range("F2") / Range("G2") >= 50 And Range("F2") / Range("G2") <= 59.9  Then
           strikerate = -2
       Else
           If Range("F2") / Range("G2") >= 60 And Range("F2") / Range("G2") <= 70 Then
               strikerate = -1
           endIf
       endif
    endif
    endif

    tscore=runs+  BOUNDERY+ SIXERS+strikerate+starteleven
end function

Фактические результаты должны быть

 name        points  new     points  old
 xxy           50                26
 aabc          25                13.5
 lmn           138                70

Но я не смог завершить функцию vba.

1 Ответ

0 голосов
/ 12 октября 2019

Когда вы создаете функцию, передайте всю информацию, которая нужна функции в качестве аргументов. Не читайте данные из внешних источников, как другие ячейки. Если функция нуждается в этом, передайте это.

Не называйте аргументы так же, как имя вашей функции. Чтобы вернуть значение, присвойте это значение имени функции. Если у вас есть аргумент с тем же именем, он запутывается.

Этот пример не суммируется, потому что я не понимаю всех условий, но он должен дать вам старт, и вы сможете исправить то, что не так.

Public Function Score(ByVal Runs As Long, ByVal Balls As Long, ByVal Fours As Long, ByVal Sixers As Long, _
    ByVal RunFactor As Long, ByVal FourFactor As Long, ByVal SixerFactor As Long, _
    ByVal HalfFactor As Long, ByVal CentFactor As Long, _
    ByVal Rate1Factor As Long, ByVal Rate2Factor As Long, ByVal Rate3Factor As Long) As Double

    Dim dReturn As Double

    dReturn = (Runs * RunFactor) + (Fours * FourFactor) + (Sixers * SixerFactor)

    If Runs >= 50 Then dReturn = dReturn + HalfFactor
    If Runs >= 100 Then dReturn = dReturn + (CentFactor - HalfFactor)

    Select Case Runs / Balls
        Case Is < 0.5
            dReturn = dReturn - Rate1Factor
        Case Is <= 59.9
            dReturn = dReturn - Rate2Factor
        Case Is <= 70
            dReturn = dReturn - Rate3Factor
    End Select

    Score = dReturn

End Function

Вам не нужна отдельная переменная (dReturn), но я люблю ее использовать. Вы используете эту функцию в такой ячейке

=score(F2,G2,H2,I2,1,1,2,8,16,3,2,1)

Обратите внимание, что все мои факторы жестко закодированы, но вы также можете указать их на диапазоны

=score(F2,G2,H2,I2,Sheet2!A1,Sheet2!A2,Sheet2!A3,Sheet2!A4,Sheet2!A5,Sheet2!A6,Sheet2!A7,Sheet2!A8)

Еще лучше использовать именованные диапазоны

=score(F2,G2,H2,I2,Run,Four,Sixer,Half,Century,Strike1,Strike2,Strike3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...