인프런 커뮤니티 질문&답변

stormsix123님의 프로필 이미지
stormsix123

작성한 질문수

엑셀 매크로와 VBA 기초부터 실무활용까지 완전 정복

VBA Solver 초기값에서 최적해 관련 파라미터 업데이트 안됨

작성

·

343

0

안녕하세요! VBA 수업을 듣고 열심히 개발중인데요..

강의내용중에 나오진 않았지만 물어볼곳이 없어서 여기다가 문의드립니다.

아래와 같이 모듈내에 일부를 발췌했습니다.

 

K1,K2값과 연동된 셀의 값들을 두개의 cdf(누적밀도함수) , pdf(확률밀도함수)로 정의하고 이를 더한 값을

K3 로 지정하여서

K3의 최적해를 구하는것을 vba로 표현하고자합니다.

엑셀상에서 데이터 - 해찾기 - 해법 GRG 비선형으로 구한 값은 최적해를 나름 수렴해서 값을 잘 찾아주는데

하기의 VBA는 K1,K2의 초기값으로 설정된값만 계속 내뱉습니다..

(beta , eta 값을 초기에 설정했음)

 

초기값을 계속 바꾸면 바꾼 초기값에서 더 변화없네요

K3에 대한 최적해가 VBA내에서 뭔가 잘 이뤄지지 않는데 코드를 봐서는 도무지 어느부분이 잘못되었는지 잘모르겠네요... 한번 봐주시면 감사드립니다..

 

  beta = 1.3
    eta = 700000

    RO_Ws.Range("K1").Value = eta
    RO_Ws.Range("K2").Value = beta
    
    
    cdf = 0
    
    For m = 1 To lastRow_Sale
        cellValue = Sale_Ws.Cells(m, 1).Value
      
        If cellValue <> 0 Then
        resultValue = WorksheetFunction.Ln(1 - (1 - Exp(-((cellValue / (RO_Ws.Range("K1").Value)) ^ (RO_Ws.Range("K2").Value)))))
        cdf = cdf + resultValue
        End If
        
    Next m
    '~여기까지 누적밀도함수 구함
    
    pdf = 0
    
    For n = 1 To lastRow_RO
        
        cellValue2 = RO_Ws.Cells(n, 3).Value
        If cellValue2 <> 0 Then
        resultValue2 = WorksheetFunction.Ln((RO_Ws.Range("K2").Value) / (RO_Ws.Range("K1").Value) * (cellValue2 / (RO_Ws.Range("K1").Value)) ^ ((RO_Ws.Range("K2").Value) - 1) * Exp(-((cellValue2 / (RO_Ws.Range("K1").Value)) ^ (RO_Ws.Range("K2").Value))))
        pdf = pdf + resultValue2
        End If
        
    Next n
    
   
    RO_Ws.Range("K3").Value = pdf + cdf
    
    'RO_Ws.Range("K1").Value = eta
    'RO_Ws.Range("K2").Value = beta
    'RO_Ws.Range("K3").Value = weibull
    
    SolverReset
    
    ' 조건 설정
    SolverOk SetCell:="$K$3", MaxMinVal:=1, ValueOf:=0, ByChange:="$K$1:$K$2", Engine:=2
    SolverAdd CellRef:="$K$1", Relation:=3, FormulaText:="10000"
    SolverAdd CellRef:="$K$2", Relation:=3, FormulaText:="0"
    
    ' Solver 실행
    SolverSolve UserFinish:=True
    
    eta = RO_Ws.Range("K1").Value
    beta = RO_Ws.Range("K2").Value
    weibull = RO_Ws.Range("K3").Value

답변 1

0

엑셀여신님의 프로필 이미지
엑셀여신
지식공유자

안녕하세요?

질문에 있는 코드는 문제가 없어보입니다.

 

엑셀 파일의 내용을 보고 하나씩 중간과정을 확인해보아야 문제점을 찾을 수 있을듯한데

엑셀 시트 창과 VBA 코드 창을 함께 열어 놓고 VBA코드 창에서 F8을 누르면서 한 문장씩 실행해보세요

 

실행하면서 beta나 eta 변수에 커서를 두면 현재 변수에 저장된 중간값도 확인할 수 있습니다.

(보기-지역창을 체크해서 화면 하단에 지역창이 표시되면 여기서 변수의 중간값도 확인 가능합니다)

 

F8을 누르면서 실행될 때마다 결과가 어떻게 변경되는지 확인을 하다보면 문제점을 파악하실 수 있을듯합니다.

 

그래도 안되시면 엑셀파일을 onwings@naver.com 메일로 보내주시면 제가 점검을 해 보겠습니다.

stormsix123님의 프로필 이미지
stormsix123
질문자

넵 메일 보내드렸습니다 확인 부탁드립니다.

감사합니다!

stormsix123님의 프로필 이미지
stormsix123

작성한 질문수

질문하기