Есть ли способ получить функцию worksheet.andbetween для работы в течение определенного периода времени? - PullRequest
0 голосов
/ 17 апреля 2019

Я очень новичок в программировании и просто хочу поблагодарить всех на этом сайте, которые уже очень мне помогли.

Я пытаюсь создать генератор случайного времени, который будет генерировать случайное время в диапазоне, указанном пользователем. В настоящее время я использую команду WorksheetFunction.Randbetween, которая эффективно генерирует случайное время, однако оно не находится в указанном диапазоне. Этот код является частью большой пользовательской формы, которая выполняет аналогичные функции. Остальная часть кода работает нормально (ish).

Мой вопрос: что мне нужно добавить к моей строке кода, чтобы она эффективно генерировала время в указанном диапазоне? Мне также нужно убедиться, что он работает в 24-часовом формате «ЧЧ: ММ: СС» или «ЧЧ: ММ».

Я пытался использовать Round и WorksheetFunction.Randbetween

Private Sub Generate_Data_Button_Click()

Dim emptyRow As Long

Randomize 

'Make Data Active
Sheet1.Activate

'Determine emptyRow
emptyRow = WorksheetFunction.CountA(Range("A:A"))+1

'Transfer information to template
Cells(emptyRow, 4).Value = WorksheetFunction.Randbetween (start_time_textbox.value, end_time_textbox.value) + Rnd()

'Format cell on template
Cells(emptyRow, 4).NumberFormat = "hh:mm:ss"

End Sub 

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Метод рандомизации / Rnd

После Randomize, Rnd генерирует псевдослучайное десятичное число от нуля до единицы при каждом вызове.Если ваши значения времени являются значениями полного времени (например, 23:59:45), тогда преобразуйте строки, возвращаемые полями ввода, используя преобразование строки в двойное значение TimeValue и используйте некоторую математику, чтобы заставить значения Rnd внутри начала и концаtimes.

Private Sub Generate_Data_Button_Click()

    Dim emptyRow As Long, tstart As Double, tend As Double

    'convert string times from input to true time as double
    tstart = TimeValue(start_time_textbox.Value)
    tend = TimeValue(end_time_textbox.Value)

    Randomize

    'Make Data Active
    With Worksheets("Data")

        'Determine emptyRow in COLUMN D
        emptyRow = .Cells(.Rows.Count, "D").End(xlUp).Row + 1

        'Transfer information to template
        .Cells(emptyRow, "D").Value = (tend - tstart) * Rnd() + tstart

        'Format cell on template
        .Cells(emptyRow, "D").NumberFormat = "hh:mm:ss"

    End With

End Sub

Метод RandBetween

Чтобы использовать функцию Randbetween рабочего листа, необходимо преобразовать время начала и окончания в длинные целые числа, представляющие количество секунд с моментаполночь, затем перемешать между ними.Возьмите результат и преобразуйте его во временное значение, погрузившись на количество секунд в дне.

Private Sub Generate_Data_Button_Click2()

    Dim emptyRow As Long, tstart As Long, tend As Long, siad As Long

    siad = 86400 'seconds in a day

    'convert string times from input to seconds in a day as Long Integer
    tstart = TimeValue(start_time_textbox.Value)  * siad
    tend = TimeValue(end_time_textbox.Value)  * siad


    'Make Data Active
    With Worksheets("Data")

        'Determine emptyRow in COLUMN D
        emptyRow = .Cells(.Rows.Count, "D").End(xlUp).Row + 1

        'Transfer information to template
        .Cells(emptyRow, "D").Value = Application.RandBetween(tstart, tend) / siad

        'Format cell on template
        .Cells(emptyRow, "D").NumberFormat = "hh:mm:ss"

    End With


End Sub
0 голосов
/ 17 апреля 2019

Вы можете сделать это как UDF.Идея состоит в том, чтобы сгенерировать случайную минуту для смещения от Time1.

Сначала преобразовать часы и минуты обоих раз в минуты как единицу.
Затем основать на разнице минут, сгенерировать случайные минуты, используяRandBetween, вычтите базовое время, затем добавьте эти случайные минуты к базовому времени (в минутах).

Function RandomTimeBetween(FromTime As Range, ToTime As Range) As Date
    Dim Time1 As Date, Time2 As Date, Minutes As Integer
    Time1 = CDate(FromTime.Value)
    Time2 = CDate(ToTime.Value)
    Minutes = Hour(Time1) * 60 + Minute(Time1) ' Base time in minutes
    ' Find the random offset time between them, deduct the base time
    Minutes = WorksheetFunction.RandBetween(Minutes, Hour(Time2) * 60 + Minute(Time2)) - Minutes
    RandomTimeBetween = Time1 + TimeSerial(0, Minutes, 0)
End Function

Если вы хотите сделать рандомизацию с секундами, вам нужно перейти к значению ниже какпереполнение может произойти в TimeSerial:

Function RandomTimeBetween(FromTime As Range, ToTime As Range) As Date
    Dim Time1 As Date, Time2 As Date, Seconds As Long
    Time1 = CDate(FromTime.Value)
    Time2 = CDate(ToTime.Value)
    Seconds = Hour(Time1) * 3600 + Minute(Time1) * 60 + Second(Time1) ' Base time in seconds
    ' Find the random offset time between them, deduct the base time
    Seconds = WorksheetFunction.RandBetween(Seconds, Hour(Time2) * 3600 + Minute(Time2) * 60 + Second(Time2)) - Seconds
    RandomTimeBetween = Time1 + TimeSerial(Seconds \ 3600, Seconds \ 60, Seconds Mod 60)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...