Страницы: 1
RSS
Do Loop. Как узнать, на какой ячейке диапазона цикл остановится?, Научите пользоваться циклом
 
Всем привет!

Почитав в интернетах про циклы, я узнал что есть такая вещь как цикл Do Loop Until  - "предназначен для организации цикла-до. Инструкции будут выполняться до момента, когда выражение станет истинным."
вот я и пытаюсь написать цикл
Код
Function sechenie2(L, cosf, Ip)
Dim dU As Long
Dim S As Range
Set S = Range("F12:F21")
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
    S = Range("F12:F21")
    dU = 2 * ((0.0225 * L * cosf / S + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
    Loop Until dU < 4
    sechenie2 = S
     
    'For i = 12 To 21 'перебираем строки с 12 по 21
        'If Cells(i, 5) > Ip And Cells(i, 7) < dU Then 'если проходит проверка и по току и по потере напряжения
       '   sechenie2 = Cells(i, 4)  'выбираем кабель из перечня
        '    Exit For 'выходим из цикла
        'End If
   ' Next
End Function

но  я не понимаю следующего:
1. Правильно ли я задал диапазон и будут ли вообще из него браться числа для расчета и подставляться в формулу??? Т.е. как вообще узнать, что цикл понял, что ему нужно брать данные именно из диапазона S, и пойти вниз чтобы начать брать значения для расчета, а не в лево или куда еще.
2. Как узнать на какой ячейке из диапазона остановился цикл и узнать что написано в этой ячейке. Собственно это и должно стать ответом в пользовательской функции.
Изменено: Timur - 26.03.2020 14:41:55
 
Код
Function sechenie2(L, cosf, Ip)
    Dim dU As Long
    Dim S As Range
    Set S = Range("F12:F21")
    Dim a As Variant
    a = S
    Dim y As Long
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        S = a(y, 1)
        dU = 2 * ((0.0225 * L * cosf / S + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
    Loop Until dU < 4
    sechenie2 = S
End Function
А формат поправьте.
 
При чем тут цикл? С ним все в порядке. Но внутрь вы засунули то, что в принципе не может быть посчитано.
 
МатросНаЗебре, что-то не работает!
RAN, т.е. цикл не может перебрать значения из диапазона? и подставлять их в формулу до определенных пор, и потом вывести значение ячейки из диапазона на которой он остановился считать. т.е. это невозможно сделать циклом?
 
Почему не может? Может. Но вы в коде вообще не оперируете понятием "значения", а пытаетесь поделить какое-то значение на диапазон. А вот этого Excel не умеет.
 
Цитата
RAN написал:
Но вы в коде вообще не оперируете понятием "значения"
а я думал, что указав диапазон, эксель сам поймет что из него надо брать значения из ячеек по очереди! понимаю что моя логика неверная))) наверное нужно указать шаг.
МатросНаЗебре, вроде как раз и сделал то, о чем вы говорите.
Код
y = y + 1
S = a(y, 1)

Но формула все равно не работает
Изменено: Timur - 26.03.2020 15:31:07
 
как только начнете немного понимать как работает то, что вы пишете, оно тут же начнет работать
при наличие свободного времени и интереса - этот процесс не сложный, а реально интересный, это не напрягает а захватывает
если есть необходимость, а интереса нет - все становится гораздо сложнее((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
О да, я тоже люблю так говорить человеку, который чего-то не понимает. Говорить ему, что он всего лишь не захотел уделить этой задачи чуточку больше времени и при должном усердии у него обязательно получится. Ну и что, что ты этим никогда не занимался, это же твой новые (пресловутые) компетенции!!! Снисходительно так улыбаться при этом. И отвернувшись в сторону сказать: "Подойди в конце дня, посмотрим!"
И вот пришел конец дня, приходит этот человек, с глазками как у кота из Шрека и такой, ну что посмотрим!!! И вот я снизошел...даю этому человеку подсказки, где прочитать, у кого спросить, где взять аналог....
И человек такой: "что вот так? и все?" и я такой "ага" а человек такой: "ты че .... мат мат мат мат не мог раньше этого просто сказать???" а я просто снисходительно улыбаюсь и отворачиваюсь в монитор
ибо еще больший кайф сродни физиологическому оргазму я получаю от понимания того, что до человека реально дошло благодаря мне, моим страданиям! Чувство что я всемогущ в данном вопросе, как бог, начинает играть с новой силой.
Еще один падаван обрел силу....
 
Код
Function sechenie2(L, cosf, Ip)
    Dim dU As Long
    Dim S As Range
    Dim v As variant
    Set S = Range("F12:F21")
    Dim a As Variant
    a = S
    Dim y As Long
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        v = a(y, 1)
        dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
    Loop Until dU < 4
    sechenie2 = v
End Function

а так?
 
Цитата
Timur написал:
вот я и пытаюсь написать цикл
вот когда будете не просто писать цикл, а решать какую-то задачу с помощью циклов, и расскажете что именно за задачу вы решаете, вот тогда и можно будет помощь ее решить, а пока... не возможно ответить на вопрос:
Цитата
Timur написал:
на какой ячейке диапазона цикл остановится?
если цикл вообще не перебирает никаких ячеек записанного в макросе диапазона
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
МатросНаЗебре, спасибо. Макрос работает как надо, спасибо, кажется я даже понял что вы делаете. Сейчас попробую добавить в текст макроса еще одну проверку по второму условию, надеюсь получится
Изменено: Timur - 26.03.2020 17:08:44
 
Добавил в текст макроса второе условие
Код
Function sechenie3(L, cosf, Ip)
    Dim dU As Long
    Dim S As Range
    Dim Inom As Range
    Dim v As Variant
    Set S = Range("F12:F21")
   Set Inom = Range("E12:E21")
    Dim a As Variant
    Dim b As Variant
    a = S
    b = Inom
    Dim y As Long
    Dim Z As Long
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        v = a(y, 1)
        Z = Z + 1
        Z2 = b(Z, 1)
        dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
        
    Loop Until dU < 4 And Ip < Z2
    sechenie3 = v
      
End Function
И оно даже вроде корректно работает. Но может быть я чего-то не замечаю.

Подскажите пжл, куда в коде написать "что-то" чтобы, например, в ячейку А1 вышло значение dU на котором в итоге макрос остановился. И еще вопрос, как отловить ошибку, которая возникает, когда расчет выходит за пределы заданного диапазона, т.е. dU такое большое, что цикл не может подобрать значение из диапазона и макрос выдает ошибку "Знач"

Ігор Гончаренко, я пытаюсь решить тривиальную задачу выбора электрического кабеля, по двум параметрам - это по силе тока Iр и по падению напряжения dU.
Т.е. макрос должен проверить 1. что значение Iр (которое я задаю) не превышает значения Inom (которое задано в диапазоне)
2. Проверить кабель по падению напряжения dU которое не должно превышать заданного значения "4".
Т.е. макрос берет первое значение S из диапазона F12:F21 просчитывает его по заданной формуле и сравнивает как со значением "4" так и со значением "Inom" и так вот он перебирает пока не придет к варианту удовлетворяющему двум условиям. Буду вам премного благодарен за подсказки!
Изменено: Timur - 26.03.2020 19:17:37 (добавил вложение)
 
Так почему бы сразу не описать ЗАЗАЧУ и тему назвать ПО ЗАДАЧЕ?
 
Код
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        if y> Ubound(a,1) then exit do
        v = a(y, 1)
        Z = Z + 1
        if Z> Ubound(b,1) then exit do
        Z2 = b(Z, 1)
        dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
    Loop Until dU < 4 And Ip < Z2
    Range("A1").Value = dU
    sechenie3 = v

Цитата
Timur написал:
я даже понял что вы делаете
Неправда, ничего такого я не делал :)))
 
vikttur, не думаю чтобы на форуме нашлись желающие которым захотелось бы решить задачу по подбору кабеля. Тем более я хотел и хочу сам понять как сделать цикл так как мне нужно, а не чтобы за меня кто-то бы взял и сделал, как бы пафосно это не звучало...
 
МатросНаЗебре, код не работает со строкой
Код
Range("A1").Value = dU
Формула выдает ошибку "Знач"
если эту строку заблокировать, то формула начинает работать
 
Никакой формулы в этой строке нет - есть присвоение значения ячейке. Проверьте, какое значение в этот момент у переменной.
 
Юрий М, я понимаю, что в этой строке нет формулы. Я имел ввиду пользовательскую формулу, которую я пытаюсь создать. Если эту часть кода заблокировать, то формула работает, если эта часть кода присутствует то выдается ошибка "Знач".
Цитата
Юрий М написал:
Проверьте, какое значение в этот момент у переменной.
Собственно как это проверить?
 
Господа программисты, подскажите пжл в чем ошибка?
Код пользовательской функции сделал так :
Код
Function sechenie4(L, cosf, Ip, Phase, dUnom) ' задаем нужное значение dUnom
    Dim dU As Long
    Dim S As Range
    Dim Inom As Range
    Dim v As Variant
    Set S = Sheets("Лист1").Range("F12:F21")
    Set Inom = Sheets("Лист1").Range("E12:E21")
    Dim a As Variant
    Dim b As Variant
    a = S
    b = Inom
    Dim y As Long
    Dim Z As Long
    
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        If y > UBound(a, 1) Then MsgBox "Не возможно подобрать кабель по сечению"
        v = a(y, 1)
        Z = Z + 1
        If Z > UBound(b, 1) Then MsgBox "Не возможно подобрать кабель по току" 'Exit Do
        Z2 = b(Z, 1)
        If Phase = "A" Or Phase = "B" Or Phase = "C" Then dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
        ElseIf Phase = "ABC" Then dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 380
        
    Loop Until dU < dUnom And Ip < Z2 'делаем проверку по dU и по Inom
        sechenie4 = v
      
End Function
Почему эксель ругается на строку
Код
ElseIf Phase = "ABC" Then dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 380
ведь перед ней есть условие if
И по прежнему не могу понять почему формула не работает со строкой.
Код
Range("A1").Value = dU
Изменено: Timur - 28.03.2020 14:04:14
 
Цитата
Timur написал:
не думаю чтобы на форуме нашлись желающие которым захотелось бы решить задачу по подбору кабеля
- ошибаетесь:
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=search&tags=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81&q=%D0%BA%D0%B0%D0%B1%D0%B5%D0%BB%D1%8F&FORUM_ID%5B%5D=0&DATE_CHANGE=0&order=topic&s=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8
 
Игорь, да не задачу автор решает, а разбирается с работой цикла  Do Loop. ) Ну вот не нравятся автору другие методы - хочет именно этот вариант.
 
Юра, это понятно, но не смог не среагировать :)
 
Опытные экселисты, подскажите пожалуйста почему после цикла, или после выполнения условия цикла (не знаю как правильнее выразиться)
Код
Function sechenie4(L, cosf, Ip, Phase, dUnom) ' задаем нужное значение dUnom
    Dim dU As Long
    Dim S As Range
    Dim Inom As Range
    Dim v As Variant
    Set S = Sheets("Лист1").Range("D5:D20")
    Set Inom = Sheets("Лист1").Range("C5:C20")
    Dim a As Variant
    Dim b As Variant
    a = S
    b = Inom
    Dim y As Long
    Dim Z As Long
    
    Do ' подставляем значения сечений из диапазона до тех пор пока значение dU не станет меньше 4 процентов
        y = y + 1
        If y > UBound(a, 1) Then MsgBox "Не возможно подобрать кабель по сечению"
        v = a(y, 1)
        Z = Z + 1
        If Z > UBound(b, 1) Then MsgBox "Не возможно подобрать кабель по току" 'Exit Do
        Z2 = b(Z, 1)
        If Phase = "A" Or Phase = "B" Or Phase = "C" Then dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 220
        If Phase = "ABC" Then dU = 2 * ((0.0225 * L * cosf / v + 0.00008 * L * (1 - (cosf) ^ 2) ^ 0.5)) * Ip * 100 / 380
    Loop Until dU < dUnom And Ip < Z2 'делаем проверку по dU и по Inom
        'Range("A7").Value = dU
        'ActiveCell.Offset(0, 1).Value = dU
        sechenie4 = v
        
End Function
если вот оставлять строки
Код
Range("A7").Value = dU
ActiveCell.Offset(0, 1).Value = dU
то макрос уже перестает работать, в чем подвох?
 
функция пользователя использованная на листе не может модифицировать другие ячейки, кроме той в которой записана
почитать можно тут ...не может менять параметры среды Excel и пр.
(физически чувствую как обретаю силу очередного подавана)
Изменено: Ігор Гончаренко - 29.03.2020 14:15:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
функция пользователя использованная на листе не может модифицировать другие ячейки
понятно, спасиб.

Нельзя обретать силу падавана... не будет тогда падавана... учитель направляет своего падавана, чтобы он обрел силу и не ступил на черную сторону силы...  
Страницы: 1
Наверх