2013-02-28 3 views
0

WC (1)에 대한 단일 값을 읽으려고합니다. 그런 다음 조건부 루프에서 WC (j)의 초기 값을 사용하고 싶습니다. WC (j)의 첫 번째 값을 부드럽게 실행합니다 (루프의 첫 번째 조건을 충족 함). 그러나 첫 번째 조건은 WC (j) 배열에서 다음 값을 설정해야합니다. 그러나 그것은 단지 비어있는 배열에 값을 설정하지 않습니다. 특히 이러한 라인 : WC (j) = FC WCinit (j) = WC (j - 1)조건부 루프, 배열에 추가하지 않는 값

I 코드를 단계별되면, FC는 = 0.3이지만 WC (j)는 비록 비어 말할 것 나는 그들을 서로 동등하게 세웠다. WC (j) 값은 비어 있으므로 내 루프의 'else'조건 만 충족시킵니다.

다음 코드 줄과 동일한 문제가 있으며 WC (j-1) 값이 있고 WCinit (j)와 동일하게 설정되지만 WCinit (j)는 비어 있습니다.

Dim Month() As Double 
    Dim WC() As Variant 
    Dim WCinit() As Variant 
    Dim NumMonth As Long, i As Long, j As Long 

    Dim Precip() As Double 
    Dim RefET() As Double 
    Dim Runoff() As Double 
    Dim Percolation() As Double 

    Sub main() 
    WaterBalanceReadMediterranean 
    WaterBalanceMediterranean 
    WaterBalanceReadPlains 
    WaterBalancePlains 
End Sub 
Sub WaterBalanceReadMediterranean() 
    NumMonth = 12 

    ReDim Month(1 To NumMonth) 
    ReDim WCinit(1 To NumMonth + 1) 
    ReDim WC(1 To NumMonth + 1) 
    ReDim Precip(1 To NumMonth) 
    ReDim RefET(1 To NumMonth) 
    ReDim Percolation(1 To NumMonth + 1) 
    ReDim Runoff(1 To NumMonth + 1) 

    For i = 1 To NumMonth 

    Month(i) = Cells(4 + i, 1).Value 
    Precip(i) = Cells(4 + i, 2).Value 
    RefET(i) = Cells(4 + i, 3).Value 
    Next i 


For j = 1 To 1 
     WC(j) = Cells(3 + j, 11).Value 

    Next j 

    Application.ScreenUpdating = True 
    End Sub 



Sub WaterBalanceMediterranean() 

    Dim fc As Double 
    fc = Cells(4, 7).Value 
    NumMonth = 12 
    i = 1 
    j = 2 

    Dim pwp,dz As Double 

    Do 
     If WC(j) >= pwp And (fc - WC(j - 1) + RefET(i)) < Precip(i) Then 
      Runoff(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i))) * 0.5 
      Percolation(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i))) * 0.5 
      WC(j) = fc 
      WCinit(j) = WC(j - 1)  
     ElseIf WC(j) >= pwp And (fc - WC(j - 1) + RefET(i)) > Precip(i) Then 
      Runoff(i) = 0 
      Percolation(i) = 0 
      WC(j) = WC(j - 1) + Precip(i) - RefET(i) 
      WCinit(j) = WC(j - 1) 
     Else 
      Runoff(i) = 0 
      Percolation(i) = 0 
      WC(j) = pwp 
      WCinit(j) = WC(j - 1) 
     End If 
     j = j + 1 
     i = i + 1 
    Loop While j < 14 


End Sub 
+0

많은 코드가 있습니다. 많은 것은 그 문제와 무관 한 것처럼 보입니다. 문제를 재현하면서 코드를 최대한 줄이면 문제를 해결할 수 있을지 의심 스럽습니다. 그러나, 내 첫 번째 추측은 j가 루프 이전에 2와 같음을 설정하는 것이며,이 작업을 원하지 않는다는 것입니다 (그렇습니까?). 'j = 0' 또는'Do' 전에 원하는 값을 입력하십시오. – mkingston

+0

많은 코드가 꽤 중복되어 있습니다. 'For i = 1 to 1'. 'j = 1 : j = 2'. – mkingston

+0

j = 2로 루프를 시작하는 것보다 초기 값을 설정하기 위해 j = 1로 설정하려고했습니다. – user1977802

답변

2

우선 값을 할당하기 전에 변수 pwp을 사용하고 있습니다. VBA에서는 여러 변수를 쉼표로 구분하여 정의하면 두 변수 모두에 유형이 부여되지 않습니다. 예를 들어, PWP을 정의하고 다음과 같이 DZ : Dim pwp, dz as Double 다음과 같이 그들을 볼 : 코드의 경우 pwp = , dz = 0

의 PWP가 호출되고 : 당신이 얻을 것이다

MsgBox "pwp = " & pwp & " , dz = " & dz 

"If"블록 앞에 값이 지정되었습니다. 이 블록에 도달하면 코드가 깨집니다. 변수 정의를 Dim pwp as Double, dz as Double으로 변경하면이 문제가 해결됩니다.


또한이 질문에 대한 진정한 대답은 여기에서 많은 잘못을 저지르고 있다는 것입니다. 이 특정 문제의 원인은 식별 할 수없는 여러 가지 일 수 있습니다. 특히 참조 된 각 셀에 어떤 데이터가 있는지 파악할 수 없기 때문입니다. 내 제안은 다음을 수행하고 우리에게 다시 연락하는 것입니다 :

  1. 코드를 하나의 서브 루틴으로 통합하는 것입니다.
  2. 다음 용도로 사용 ... Do While 루프 대신 증분 변수와 결합 된 다음 루프.
  3. 제거 절대적으로 무의미 코드는

    For j = 1 To 1 
         WC(j) = Cells(3 + j, 11).Value 
    
        Next j 
    

    로이 조각은 WC(1) = Cells(14,11).Value해야한다. . . 훨씬 더 간단합니다.

아마도 몇 가지 다른 변경 사항이 있지만 경험을 통해 말할 수는 없지만 문제가 발생할 수 있습니다. 행운을 빕니다.

2

당신은 이중의 배열로 배열을 선언 할 필요가 :

Dim WC() As Double 
Redim WC(1 to NumMonth + 1) As Double 'Type is not necessary here, but no harm AFAIK 

는 그들이 시작하는 값을 할당하지 않는 변종의 배열로 선언되고있는 때문입니다. 합리적으로 계산 비용이 많이 드는 일을한다면이 변화는 계산 속도를 높일 것입니다.

두 가지 방법 중 하나를 사용하지 않으려면 배열을 사용하기 전에 0으로 설정하십시오.

귀하의 질문에서 최대한 많은 코드를 삭제 해 주셔서 감사합니다. 다시 돌아가서 편집 한 내용을 확인해야했지만, 많은 코드가 있었고 많은 정보가있었습니다. 문제를 재현 할 필요가 없었습니다. 당신이 그것을 다소 무차별 적으로 제거했다는 것은 말할 필요도 없습니다. 나는 당신이 턱에이 비판을 가지고 가지 않기를 바란다. 바라건대 내가 따라 와서 당신의 질문에 대답했다는 사실은 내가 진지하다는 것을 보여줍니다. 어쨌든, 이것이 당신의 문제를 해결했으면 좋겠다. :)

+0

이 문제는 도움이되지 않습니다. 나는 여전히 같은 문제를 겪고있다. WC (j) 및 WCinit (j) 배열은 비어있어 배열 – user1977802

+2

에서 값을 생성하지 않습니다. 파머. 좋아요.'WaterBalanceMediterranean' 루틴을 처음 실행했을 때,'j = 2', 맞습니까? 하지만 실제로 WC (j) (특히 WC (2))에 아무것도 넣지 않았습니까? 그래서 첫 조건부'WC (j)> = pwp'에서 빈 배열 원소를 항상 pwp와 비교할 것입니다. 이것은 의도적입니까? 틀 렸으면 고쳐줘. – mkingston