Вычислить статическое случайное число (вычислить его один раз) в Excel - PullRequest
8 голосов
/ 04 ноября 2011

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

Так, например, если у меня было что-то подобное в B1 RANDONCE(A1), то в первый раз я поместил значение в A1он вычислит случайное значение, но затем он не изменится снова.Или, по крайней мере, пока я снова не изменил A1.

Я хотел бы сделать это без ручного повторного ввода B1, чтобы превратить его из формулы в значение, как описано здесь .Использование макросов в порядке.

Ответы [ 5 ]

4 голосов
/ 15 ноября 2013

Я думаю, у меня есть намного более простой способ сделать это.Заполните электронную таблицу, затем примените функцию = RANDBETWEEN для этого столбца чисел.Затем сделайте следующее:

  1. Скопируйте результаты из этого столбца.
  2. Выделите столбец и выберите «вставить специальные» и выберите «значения».

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

3 голосов
/ 11 марта 2014

Вы также можете использовать циклические ссылки, чтобы сделать «управляемый формулой» тумблер, позволяющий пользователю рассчитать набор случайных чисел и затем отключить дальнейшие пересчеты. Отключить предупреждения циклической ссылки , а затем поместить эту формулу в ячейку B3:

=IF($B$1="YES",RAND(),B3)

Если ячейка B1 содержит «YES», B3 будет генерировать новое случайное число при каждом пересчете электронной таблицы;если B1 содержит любое другое значение, текущее значение B3 будет сохранено.

3 голосов
/ 04 ноября 2011

Вам нужен UDF с памятью, чтобы он знал, изменилась ли ячейка

Этот UDF вернет новое случайное значение при изменении ссылки на вызов, в противном случае возвращает последнее случайное значение (т.е. без изменений)
Также возвращает пустое значение, если исходная ячейка пуста (может или не может быть тем, что вам нужно?)

Примечание: проблема в том, что значения Static теряются при закрытии листа, поэтомузначение будет меняться при каждом открытии листа.

Function randonce(r As Range)
    Static trigger As Variant
    Static v As Double
    If r <> trigger Then
        v = Rnd
        trigger = r
    End If
    If Len(r) <> 0 Then
        randonce = v
    Else
        randonce = vbNullString
    End If
End Function
3 голосов
/ 04 ноября 2011

Вы можете создать UDF (пользовательскую функцию):

Public Function Rand_once(ByVal r As Range)
    Rand_once = Rnd
End Function

В ячейку, в которой вы хотите получить результат, вы можете поместить:

=Rand_once(A1)

Значение изменится(на самом деле, пересчитывается) только при изменении исходного значения (он же A1).

1 голос
/ 05 ноября 2011

Это, очевидно, не будет лучшим решением, если вам нужно отслеживать много ячеек, но если вам нужно просто A1, вам нужно отслеживать изменения, вы можете использовать событие для выполнения своей функции в B1,затем в конце присвойте ему значение, которое ему было дано.Я считаю это наиболее простым решением, и оно работает так, как вам нужно.

Пример:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$A$1" Then
    With Cells(1, 2)
        .Value = "=rand()" 'or whatever
        .Value = .Value
    End With
End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...