2016-12-24 5 views
0

Когда я запускаю код, он генерирует случайное число от 100 до 210, и я хочу, чтобы мой j оценивался следующим образом, но этого не происходит.Что не так с моим кодом «vba»

Он генерирует числа для j, но это не в соответствии с условиями, которые я закодировал.

Range("J12").Formula = "=RANDBETWEEN(100,210)" 

x = Range("J12").Value 


    If x < 109 And x >= 100 Then 
j = 100 

ElseIf x > 109 And x < 119 Then 
    j = 110 

ElseIf x > 119 And x < 129 Then 
    j = 120 

ElseIf x > 129 And x < 139 Then 
    j = 130 

ElseIf x > 139 And x < 149 Then 
    j = 140 

ElseIf x > 149 And x < 159 Then 
    j = 150 

ElseIf x > 159 And x < 169 Then 
    j = 160 

ElseIf x > 169 And x < 179 Then 
    j = 170 

ElseIf x > 179 And x < 189 Then 
    j = 180 

ElseIf x > 189 And x < 199 Then 
    j = 190 

Else: j = 200 

    End If 

Range("I12").Value = j 
+0

ли ваше намерение ввести смещение в пользу значения 200? Если нет, зачем даже беспокоиться с 'J12' и вместо этого просто иметь формулу' = 100 + 10 * RANDBETWEEN (0,10) 'в' I12'? –

ответ

1

отредактировал добавить ооочень короткий вариант (см нижней части ответа)

это потому, что у вас есть автоматические расчют и после Range("I12").Value = j заявления рабочих листов получают вычисленные и RANDBETWEEN() формулы вы кладете в J12 получает пересчитан и поэтому вы не видите, что соответствует j вы написали в I12 ранее до такого последнего перерасчета

вы можете использовать этот

Sub main() 
    Dim x As Long, j As Long 

    With Range("J12") 
     .Formula = "=RANDBETWEEN(100,210)" 
     .Value = .Value 

     Select Case .Value 
      Case 100 To 108 
       j = 100 

      Case 109 To 118 
       j = 110 

      Case 119 To 128 
       j = 120 

      Case 129 To 138 
       j = 130 

      Case 139 To 148 
       j = 140 

      Case 149 To 158 
       j = 150 

      Case 159 To 168 
       j = 160 

      Case 169 To 178 
       j = 170 

      Case 179 To 188 
       j = 180 

      Case 189 To 198 
       j = 190 

      Case Else 
       j = 200 

     End Select 
    End With 
    Range("I12").Value = j 
End Sub 

BTW те же результаты достигаются с помощью следующего кода

Sub main()  
    With Range("J12") 
     .Formula = "=RANDBETWEEN(100,210)" 
     .Value = .Value 
     .Offset(, -1).Value = IIf(.Value > 208, 200, Int((.Value + 1 - 100)/10) * 10 + 100) 
    End With 
End Sub 
+0

Это сработало. Спасибо за помощь. Раньше я пробовал использовать метод case, но ı не мог найти способ сделать значения x от 100 до 108 ... Поэтому ı узнал об этом. Еще раз спасибо. –

+0

Добро пожаловать. Затем вы можете пометить ответ как принятый. Спасибо! – user3598756

+0

Ваш условно эквивалентный код внизу не эквивалентен. Когда 'RANDBETWEEN (100,210)' возвращает 209 или 210, этот код вычисляет значение 210, а другой код вычисляет 200. Спецификация OP вводит небольшое смещение в пользу значения 200, хотя это могло быть непреднамеренным. –

Смежные вопросы