작성
·
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 메일로 보내주시면 제가 점검을 해 보겠습니다.
넵 메일 보내드렸습니다 확인 부탁드립니다.
감사합니다!