2017-01-13 1 views
-1

저는 VBA, MACRO에 완전히 익숙합니다. 나는 그것이 제약 세포 (R10) Excel에서 구속 조건을 가진 객관적인 셀을 최적화하기 위해 루프에서 솔버를 실행하려면

  • 그런 다음이 목표와 제약 모두에 대해 다음 열로 이동해야와 목적 함수 세포 (N10)를 실행한다 먼저

    • 을 최적화하기 위해 루프가 필요합니다. 즉 Cell O10 & 셀 S10에 대해서도 마찬가지로 2 회 더 반복합니다.
    • 그런 다음 i + 9 번째 행으로 이동하고 동일한 단계 분석을 반복해야합니다.

    정밀도가 좋은 두 개의 루프가 있고, 마지막으로 도달 할 때까지 열 루프 4 회 및 행 루프 1 개가 있습니다. 몇 가지 문제가 있습니다

    Excel snapshot of Data

  • +0

    코드 스크린 샷은 수행 한 작업의 예를 제공하는 좋지 않은 방법입니다. – OldUgly

    +0

    실례합니다. 나는 초보자이다. 그것을 재현 할 수있는 방법으로 표현하는 법을 배웁니다. 그리고 입력에 감사드립니다. –

    답변

    0

    ...

    • 당신은 항상 당신의 코드에서 명시 적 옵션을 사용해야합니다. 이렇게하면 유형 불일치로 인한 오류를 포착하는 데 도움이됩니다.
    • Cells(x,y)을 사용할 때 항상 워크 시트를 사용하여 인증해야합니다.
    • 솔버 루틴에 대한 입력으로 범위를 사용하는 것이 때때로 작동하는 것처럼 보이지만 항상 문자열을 사용하는 것이 좋습니다.
    • SolverReset을 사용하면 Excel이 수동 계산 모드로 전환됩니다. 이런 루프에서 사용될 때는 먼저 호출해야합니다. 마지막이 아닙니다.
    • SolverOK에서 Engine과 EngineDesc를 모두 지정하면 불일치가 발생하여 오류가 발생할 수 있습니다. 항상 EngineDesc를 생략하는 것이 좋습니다.
    • SolverOK에서 "ByChange"필드가 있어야하는 것이 명확하지 않습니다. 나는 당신의 제약 조건과 같다고 생각하지만, 이것을 해결할 필요가있다.
    • 샘플 데이터가 없습니다. 테스트되지 않았습니다.

    다음 코드는 플래그가 지정된대로 수정하여 목표를 달성해야합니다.

    Option Explicit 
    Sub mySolve() 
    Dim totalrows As Long 
    totalrows = 1000 ' *** use whatever formula finds your last row 
    
    Dim row As Long 
    Dim col As Long 
    Dim myWS As Worksheet 
    Dim SetAddr As String, ChgAddr As String, ConAddr As String 
    
    Set myWS = ActiveSheet 
    For row = 10 To totalrows Step 9 
        For col = 14 To 17 Step 1 
         SetAddr = myWS.Cells(row, col).Address 
         ChgAddr = myWS.Cells(row, col + 4).Address '*** you don't specify in your question 
         ConAddr = myWS.Cells(row, col + 4).Address 
         SolverReset 
         SolverOk SetCell:=SetAddr, MaxMinVal:=2, ByChange:=ChgAddr, Engine:=3 
         SolverAdd CellRef:=ConAddr, Relation:=1, FormulaText:="2" '*** what is your constraint 
         SolverSolve Userfinish:=True 
        Next col 
    Next row 
    
    End Sub 
    
    관련 문제