2017-02-04 1 views
0

Я пытаюсь написать макрос для квадратичной оптимизации. У меня есть очень ограниченные навыки VBA, но я вручную используется решатель и записи макроса, мой код в настоящее время выглядит следующим образом:установка решателя для изменения ссылок на ячейки, смежные столбцы

Sub Macro2() 
' 
' Macro2 Macro 
' 

' 
    SolverReset 
    SolverAdd CellRef:="$C$179:$C$185", Relation:=3, FormulaText:="0" 
    SolverAdd CellRef:="$C$186", Relation:=2, FormulaText:="1" 
    SolverOk SetCell:="$C$174", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$179:$C$185" _ 
    , Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverSolve UserFinish:=True 
    SolverFinish KeepFinal:=1 

End Sub 

То, что я пытаюсь сделать, это сделать петлю решатель, так что в следующий раз, колонка C в ссылках на ячейки и клетке-мишени изменится на D, все остальное останется неизменным. Я хочу сделать это для 20 соседних столбцов, от C до V. любая помощь будет очень признательна!

+0

Привет @orkanoid, имея немного трудное время расшифровки, что вы пытаетесь DO- так, когда вы говорите: «так что в следующий раз, когда столбец C в ссылках на ячейки и целевая ячейка изменятся на D, все остальное останется неизменным », вы говорите, что вам просто нужно расширить код, который вы работают выше для столбца B в столбце V? – TheSilkCode

+0

Привет @TheSilkCode, я хочу, чтобы это работало для всех столбцов, между (и включая) C и V. так что следующий шаг будет: Sub Macro2() ' ' Macro2 Макро ' ' SolverReset SolverAdd CellRef: = "$ D $ 179: $ D $ 185", Отношение: = 3, FormulaText: = "0" SolverAdd CellRef: = "$ D $ 186", Отношение: = 2, FormulaText: = "1" SolverOk SetCell: = "$ D $ 174", MaxMinVal: = 2, ValueOf: = 0, ByChange: = "$ D $ 179: $ D $ 185" _ , Двигатель: = 1, EngineDesc: = "GRG Nonlinear" SolverSolve UserFinish: = True SolverFinish KeepFinal: = 1 End Sub , а затем для столбца E и т. Д. Спасибо за быстрый ответ! – orkanoid

+0

Я не вижу, что вы только что набрали, отличается от вашего исходного кода, но посмотрите на примерный код ниже и, надеюсь, приблизитесь к вам, вы можете нажать его немного с небольшими настройками. – TheSilkCode

ответ

0

Если мои предположения, которые я поставил в моем комментарии выше, верны, то следующий код будет делать то, что вы ищете, однако я не смог проверить все это, потому что у меня нет кода для решателя функции ... смотрите ниже:

Public Sub sampleCode() 
Dim targetWS As Worksheet 
Dim colCounter As Long 
Dim colAddress As String 
Dim colLetter As String 

Set targetWS = ThisWorkbook.Sheets(1) 'Make sure to replace sheet(1) with sheet(<your sheet name>) 
For colCounter = 3 To 22 'Loop through columns C through V 
    'Get the column letter you want to run solver on 
    colAddress = Replace(targetWS.Range("A1")(1, colCounter).address, "$", "") 
    colLetter = Left(colAddress, InStr(1, colAddress, "1") - 1) 
    SolverReset 
    'Run solver but with the references being set by using colLetter 
    SolverAdd CellRef:=colLetter & "179:" & colLetter & "185", Relation:=3, FormulaText:="0" 
    SolverAdd CellRef:=colLetter & "186", Relation:=2, FormulaText:="1" 
    SolverOk SetCell:=colLetter & "174", MaxMinVal:=2, ValueOf:=0, ByChange:=colLetter & "179:" & colLetter & "185", Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverSolve UserFinish:=True 
    SolverFinish KeepFinal:=1 
Next 
End Sub 

Надеется, что это помогает, TheSilkCode

+0

Я пробовал код выше, и он сказал: «Ошибка времени выполнения» 9: «Подстрочный код вне диапазона». Затем я ударил debug, и строка, начинающаяся с «Set targetWS», была отмечена желтым цветом. – orkanoid

+0

Вы заменили 'Таблицы (1)' in 'Set targetWS = ThisWorkbook.Sheets (1)' со ссылкой на ваш листок, как я отметил здесь: «Обязательно замените лист (1) листом (<ваш лист имя>) " – TheSilkCode

+0

О да! Это работало как прелесть! Большое спасибо @TheSilkCode, когда я положил имя листа между скобками, я в конечном итоге получил «Ошибка времени выполнения» 9: «Подстрочный код вне диапазона». Затем я попробовал его с помощью «ThisWorkbook.Sheets (1)». В любом случае у меня был только один лист в книге, и он отлично поработал (после нескольких сбоев в excel). Ты мне очень помог, спасибо еще раз! – orkanoid

Смежные вопросы