2013-03-25 1 views
2

해 찾기를 사용하여 간단한 포트폴리오의 최대 수익을 찾으려고합니다. 워크 시트에서 Solver를 사용하면 문제가 해결되지만 VBA에서 명령을 설정할 때 Solver를 사용하지 않아도됩니다. 대신 (screengrab에서 볼 수 있듯이) 제약 조건 중 하나를 무시합니다 (T10에서 계산 된 가중치의 합은 = 1이어야 함). 흥미롭게도 제가 제 3의 라인을 바꾸면 잘 작동합니다 :VBA에서 Excel 해 찾기 제한 무시

SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100" 

또는 "1"이외의 정수. (다른 제약 조건도 무시할 수 있지만이를 확인할 수는 없습니다.) enter image description here

그리고 내 코드는 다음과 같습니다 : 표는 다음과 같습니다

Sub FindRange() 

       SolverReset 
       SolverOk SetCell:="$T$7", MaxMinVal:=1, ValueOf:="0", ByChange:="$O$10:$R$10" 
       SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="1" 
       SolverAdd CellRef:="$O$10:$R$10", Relation:=3, FormulaText:="0" 
       SolverSolve UserFinish:=True 
       SolverFinish KeepFinal:=1 
       Range("T9").Value = Range("T7").Value 
      End Sub 

어떤 제안을 기꺼이 환영!

+0

코드는 나에게 잘 어울립니다. 비 VBA 대 VBA를 반복하는 것처럼 보입니까? 어쩌면'SolverOK' 전에'CellRef'를 추가 해보시겠습니까? –

+0

아마도'FormulaText : = 1'을 사용해 보시겠습니까?(큰 따옴표 제외) [MSDN의 코드] (http://msdn.microsoft.com/en-us/library/office/ff838657.aspx)는 따옴표를 사용하지 않기 때문에 언급합니다. –

+0

감사합니다. 큰 따옴표를 제거하는 것이 도움이됩니다 (즉, 10 이하로 유지). 이제는 "$ O $ 10 : $ R $ 10"이 0이되도록 무시합니다. 따라서 두 제약 조건이 모두 무시됩니다. – Mary

답변

2

버그를 발견했습니다. 플래그 "FormulaText : = 1". 대신 1을 사용하는 대신 값 1 인 모든 셀에 대한 참조를 사용하십시오.

즉, 변경 "FormulaText : = 1"을 "FormulaText : = $ H $ 5"$ H $ 5의 전체 값이 나는 똑같은 문제를 가지고

+0

불행히도 이것은 여전히 ​​가끔 실패합니다. – Mary

0

1입니다. 나는 다음과 같은 방법으로 해결 : 그냥 인용문없이 FormulaText : = 1을 입력하십시오.

1

값이 정확히 1 일 때마다 여기 버그가 있다고 생각합니다. 다른 게시물에 위의 해결책 셀에) 신뢰할 수 없습니다. 내 코드가 작동하지 않는 것을 발견했습니다. 항상 제약 제한이있는 셀을 참조합니다. 내 (원유) 해결책은 제약 조건을 < 또는> 대신 < = 또는> =으로 제한하는 적절한 방향으로 10^12 이하에서 1 부분만큼 한계 값을 이동하는 것입니다. 그래서보다는 :

SolverAdd CellRef :. = 범위 ("SolverParam") 주소, 관계 = 3, _ FormulaText :. = 범위 ("SolverConstraint") 값

사용 :

SolverConstraint 값) + Abs (범위 ("SolverConstraint") 값) * 1e-12

그리고 관계 : = 1에 대해 반대 기호를 사용하십시오.

이 간단한 예에서 SolverParam은 조정할 단일 셀 매개 변수이며 SolverConstraint는 단일 셀 하한입니다.

이 내가 더 내가

FormulaText를 웹에서 다른 해결책을 발견 찾고에 모든 값의 균일 한 처리

을 가지고 예견 할 수있는 유일한 일관성있는 접근 방식입니다 : = "="& 범위 ("SolverConstraint "). 값

안정적으로 작동하는 것 같습니다.

+0

'Relation : = 2, FormulaText : 1'을'Relation : = 2, FormulaText : = "= 1"로 변경하면 내 문제가 해결됩니다. – sevenkul