2016-07-05 2 views
1

여기에 두 번의 반복을 만들려고합니다. 첫 번째 부분은 "For i = 1 to iterations"입니다. 두 번째 부분은 1에서 731까지의 "j"입니다.두 개의 Do While 루프를 함께 연결하는 방법?

코드에서 P1, P2, P3은 상수이고 Discrete1, Discrete2, Discrete3은 함수이지만 무작위로 정수를 반환합니다.

VBA에서 코드를 실행할 수는 있지만 몇 가지 이유로 인해 결과가 잘못 반환됩니다.

달성하고자하는 것은 j가 266보다 작 으면 첫 번째 루프가 진행되고 j가 360-731 사이 일 때 두 번째 루프가 진행됩니다.

누구든지 도움을받을 수 있습니까? 나는 많이 감사 할 것입니다.

주셔서 감사합니다 설명과 일치하지 않는 코드에서

For i = 1 To Iteration: Cells(4, 3) = i 

Do While j < 366 

     If IIf(Rnd() < P1, 1, 0) = 1 Then 
      RestorationDay1 = Discrete1 
     ElseIf IIf(Rnd() < P2, 1, 0) = 1 Then 
      RestorationDay1 = Discrete2 
     ElseIf IIf(Rnd() < P3, 1, 0) = 1 Then 
      RestorationDay1 = Discrete3 
     Else 
      RestorationDay1 = 0 
     End If 

     Sumunavailableday1 = Sumunavailableday1 + RestorationDay1 
     unAvailability1 = Sumunavailableday1/365 
     Availability1 = 1 - unAvailability1 

     Cells(4, 8) = j 
     Cells(4, 9) = Availability1 
     Cells(4, 10) = unAvailability1 
     Cells(4, 11) = Sumunavailableday1 

     j = j + RestorationDay1 + 1 


Loop 

Do While 365 < j < 731 

     If IIf(Rnd() < P1, 1, 0) = 1 Then 
      RestorationDay2 = Discrete1 
     ElseIf IIf(Rnd() < P2, 1, 0) = 1 Then 
      RestorationDay2 = Discrete2 
     ElseIf IIf(Rnd() < P3, 1, 0) = 1 Then 
      RestorationDay2 = Discrete3 
     Else 
      RestorationDay2 = 0 
     End If 

     Sumunavailableday2 = Sumunavailableday2 + RestorationDay2 
     unAvailability2 = Sumunavailableday2/365 
     Availability2 = 1 - unAvailability2 

     Cells(5, 8) = j 
     Cells(5, 9) = Availability2 
     Cells(5, 10) = unAvailability2 
     Cells(5, 11) = Sumunavailableday2 

     j = j + RestorationDay2 + 1 
Loop 
Next i   

답변

0

숫자.

두 번째 루프가 수정됩니다.

는 않지만 (J> 365) 그리고 (J < 731)

당신은 코딩의 특별한 방법이있다. 나는 그것이 수학에 대한 당신의 배경에서 오는 것이라고 생각합니다. 어쨌든 IIf(Rnd() < P1, 1, 0) = 1 대신 Rnd() >= P1을 사용합니다. 나는 그것이 더 솔직하다고 생각한다. 무작위로 2 년 동안 일정을 잡으려고하는 것 같습니다. 그렇다면 루프를 변경하여 날짜를 평가할 수 있습니다. 이렇게하면 윤년을 계산할 필요가 없습니다.

루프 1

않지만 년도 (DateSerial (년 (일), 1, J)) = 올해 (날짜())

루프 2

(DateSerial (Year (Date), 1, j)) = 연도 (Date()) + 1

+0

대단히 감사합니다. 토마스, 나는 당신의 첫 번째 제안을 시도했다. 그것은 작동합니다. 귀하의 두 번째 제안을 다시 : 나는 당신과 동의 하겠지만, Rnd()> = P1 훨씬 쉬울 것입니다. 그러나 두 가지 방법이 실제로 무작위가 아니므로 추가 함수 Rnd()를 사용하여 Rnd()를 대체하는 다른 함수를 사용하기로 결정했습니다. –

+0

두 개의 새로운 루프에 대해서는 VBA가 아직 완전히 새로운 것이기 때문에 기능의 의미를 완전히 이해하지 못해서 그것에 대해 생각할 것입니다. 나는 계속 진행하고 후속 작업을 수행 할 것입니다. 다시 한 번 감사드립니다! :) –

관련 문제