Использование «До» в сочетании с «И, или» не ищет 2-го условия - PullRequest
1 голос
/ 04 июня 2019

Я запускаю цикл До, который понижает значение в целевых ячейках, начиная с 0,99 (х = 0,99), а затем использую эти значения для завершения вычисления. Мне нужно, чтобы этот цикл остановился, если выполнено 1 из 2 условий.

  1. Расчетное значение находится в пределах 10% от цели. OR
  2. х = 0,75

Если расчет не соответствует цели, цикл снизит x на 0,005 и попытается снова. Но я хочу, чтобы 0,75 было нижним пределом х.

Do Until 

(Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("J23").Value * -1 >= Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("U28").Value * 0.9 And Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("J23").Value * -1 <= Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("U28").Value * 1.1) Or (x = 0.75)

    Deal_ID = VBA.Right(Workbooks("Weekly Option Update (Master).xlsm").Sheets("GDD Group").Cells(i, "G").Value, 7)
    Sheets("Correlation").Range("E7").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("F8").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("C9").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("D10").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Calculate
    x = x - 0.005
    Workbooks("Weekly Option Update (Master).xlsm").Sheets("GDD Group").Cells(i, "H") = x + 0.005

Loop

Мой код может быть не самым эффективным, но в настоящее время он выполняется. Проблема в том, что он не смотрит на 2-е условие нижнего предела x. Он просто продолжает идти, пока расчетное значение не окажется в пределах 10% от целевого значения.

Заранее прошу прощения за формат кода. Блок под «До» - это код с «и» и «или».

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Мальчик глоток! Извлекайте локальные переменные, нет необходимости многократно разыменовывать одни и те же объекты снова и снова и снова!

Локальные переменные также значительно упрощают отладку.

Dim solverBook As Workbook
Set solverBook = Application.Workbooks("Group 4 Correlation Solver")

Dim weeklyOptionBook As Workbook
Set weeklyOptionBook = Application.Workbooks("Weekly Option Update (Master).xlsm")

Dim gddGroupSheet As Worksheet
Set gddGroupSheet = weeklyOptionBook.Worksheets("GDD Group")

Dim structureSheet As Worksheet
Set structureSheet = solverBook.Worksheets("STRUCTURETOOL")

Dim currentValue As Double
currentValue = structureSheet.Range("J23").Value ' CAUTION: possible type mismatch here

Dim targetValue As Double
targetValue = structureSheet.Range("U28").Value ' CAUTION: possible type mismatch here

Const threshold As Double = 0.1
Const limit As Double = 0.75

Dim correlationSheet As Worksheet
Set correlationSheet = solverBook.Worksheets("Correlation")

Do Until (currentValue * -1 >= targetValue * (1 - threshold) _
  And currentValue * -1 <= targetValue * (1 + threshold)) _
  Or x <= limit

    Deal_Id = Right$(gddGroupSheet.Cells(i, "G").Value, 7)
    correlationSheet.Range("E7,F8,C9,D10").Value = x
    structureSheet.Calculate

    gddGroupSheet.Cells(i, "H") = x
    x = x - 0.005

    currentValue = structureSheet.Range("J23").Value ' CAUTION: possible type mismatch here
    targetValue = structureSheet.Range("U28").Value ' CAUTION: possible type mismatch here
Loop

Не используйте = при работе с плавающей точкой. Or x <= limit, вероятно, решение вашей непосредственной проблемы.

0 голосов
/ 04 июня 2019

Я бы просто использовал If для проверки второго условия:

x = 1

Do Until x = 0.75

    if Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("J23").Value * -1 >= Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("U28").Value * 0.9 And Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("J23").Value * -1 <= Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Range("U28").Value * 1.1 then exit do

    Deal_ID = VBA.Right(Workbooks("Weekly Option Update (Master).xlsm").Sheets("GDD Group").Cells(i, "G").Value, 7)
    Sheets("Correlation").Range("E7").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("F8").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("C9").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("Correlation").Range("D10").Value = x
    Workbooks("Group 4 Correlation Solver").Sheets("STRUCTURETOOL").Calculate
    x = x - 0.005
    Workbooks("Weekly Option Update (Master).xlsm").Sheets("GDD Group").Cells(i, "H") = x + 0.005

Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...