-1

тот же вопрос, что и: https://stackoverflow.com/questions/24260344/dice-notation-in-excel-advanced-mode

Мне посоветовали спросить и здесь. так что я делаю.

Я спросил, может ли кто-нибудь сделать мне "Пользовательскую функцию" для исключения того, что вы вычисляете уравнение, выраженное в виде костей (для rpg. Вроде 1d6+3)

Вот результат (и он действительно хорошо работает)

Теперь мне нужно еще три функции.

1) RollMax(A1), который даст максимальное значение A1 (если A1 = 1d6+3, результат будет 9)

2) RollMin(A1), который даст минимальное значение A1 (если A1 = 1d6+3, результат будет 4)

3) RollAve(A1), который даст среднее значение A1 (если A1 = 1d6+3, результат будет 6)

Мне это нужно так же, как и в Rolldice(), сделанном Гари в связанном посте. Он будет использоваться игроками, которые ничего не знают в Excel, и я хочу, чтобы это было как можно более неприличным. (RollDice () объяснено здесь: https://stackoverflow.com/questions/24253155/dice-notation-in-excel )

большое спасибо

с уважением

Изменить 1:

Дим выделить место для создания переменной? Сказать программе: «Я буду использовать эти функции / переменные, оставьте для них неопределенное место»?

что именно делает Deemode?

что делает р.Значение делает?

Редактировать: 2

спасибо за ответы. я работаю над этим

1 ответ1

1

Я собираюсь опубликовать код от ученика Гэри здесь с некоторыми дополнительными комментариями к нему.

Самый простой способ увидеть, что происходит, - это вставить разрыв кода в нажатой клавише F9 на строку рядом с началом и пройти по ней с помощью клавиши F9. Я бы добавил часы в строку NewForm, которая создает вашу функцию

Public Function RollDice(r As Range) As Variant
    Application.Volatile
    Dim v As String, NewForm As String, deemode As Boolean
    Dim dee As String
    dee = "d"
    deemode = False
        v = r.Value
        NewForm = "="
        For i = 1 To Len(v)
            ch = Mid(v, i, 1)
            'If the code finds a d it knows its a dice roll so it needs a randbetween function
            If ch = dee Then
                NewForm = NewForm & "*RANDBETWEEN(1,"
                deemode = True
            Else
            'If the character is a operator +-* then close the brackets of the rand between
                If Not IsNumeric(ch) And deemode Then
                    deemode = False
                    NewForm = NewForm & ")"
                End If
            'If the code doesn't find a d add that character to the end of the function
            NewForm = NewForm & ch
            End If
        Next i

        If deemode Then
            NewForm = NewForm & ")"
        End If

        RollDice = Evaluate(NewForm)

End Function

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

Public Function Rollmax(r As Range) As Variant
    Application.Volatile
    Dim v As String, NewForm As String, deemode As Boolean
    Dim dee As String
    dee = "d"
    deemode = False
        v = r.Value
        NewForm = "="
        For i = 1 To Len(v)
            ch = Mid(v, i, 1)
            If ch = dee Then
                NewForm = NewForm & "*"
                deemode = True
            Else
                If Not IsNumeric(ch) And deemode Then
                    deemode = False
                    NewForm = NewForm & ""
                End If
                NewForm = NewForm & ch
            End If
        Next i


        Rollmax = Evaluate(NewForm)

End Function

РЕДАКТИРОВАТЬ:

Да, Дим объявляет переменные. С помощью объявления переменных вы можете либо начинать каждый с новой строки с помощью dim, либо заключать их в запятую

что именно делает Deemode? Deemode - это истинный ложный флаг, который включается, когда в строке обнаруживается "d". Он выключается, когда находит не число (обычно +- *).

что делает р.Значение делает? r является ссылкой на ячейку. Значение r.value возвращает значение этой ячейки (в данном случае строка игральных костей).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .