Почитав в интернетах про циклы, я узнал что есть такая вещь как цикл 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. Как узнать на какой ячейке из диапазона остановился цикл и узнать что написано в этой ячейке. Собственно это и должно стать ответом в пользовательской функции.
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 написал: Но вы в коде вообще не оперируете понятием "значения"
а я думал, что указав диапазон, эксель сам поймет что из него надо брать значения из ячеек по очереди! понимаю что моя логика неверная))) наверное нужно указать шаг. МатросНаЗебре, вроде как раз и сделал то, о чем вы говорите.
как только начнете немного понимать как работает то, что вы пишете, оно тут же начнет работать при наличие свободного времени и интереса - этот процесс не сложный, а реально интересный, это не напрягает а захватывает если есть необходимость, а интереса нет - все становится гораздо сложнее((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
О да, я тоже люблю так говорить человеку, который чего-то не понимает. Говорить ему, что он всего лишь не захотел уделить этой задачи чуточку больше времени и при должном усердии у него обязательно получится. Ну и что, что ты этим никогда не занимался, это же твой новые (пресловутые) компетенции!!! Снисходительно так улыбаться при этом. И отвернувшись в сторону сказать: "Подойди в конце дня, посмотрим!" И вот пришел конец дня, приходит этот человек, с глазками как у кота из Шрека и такой, ну что посмотрим!!! И вот я снизошел...даю этому человеку подсказки, где прочитать, у кого спросить, где взять аналог.... И человек такой: "что вот так? и все?" и я такой "ага" а человек такой: "ты че .... мат мат мат мат не мог раньше этого просто сказать???" а я просто снисходительно улыбаюсь и отворачиваюсь в монитор ибо еще больший кайф сродни физиологическому оргазму я получаю от понимания того, что до человека реально дошло благодаря мне, моим страданиям! Чувство что я всемогущ в данном вопросе, как бог, начинает играть с новой силой. Еще один падаван обрел силу....
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 написал: на какой ячейке диапазона цикл остановится?
если цикл вообще не перебирает никаких ячеек записанного в макросе диапазона
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
МатросНаЗебре, спасибо. Макрос работает как надо, спасибо, кажется я даже понял что вы делаете. Сейчас попробую добавить в текст макроса еще одну проверку по второму условию, надеюсь получится
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" и так вот он перебирает пока не придет к варианту удовлетворяющему двум условиям. Буду вам премного благодарен за подсказки!
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
vikttur, не думаю чтобы на форуме нашлись желающие которым захотелось бы решить задачу по подбору кабеля. Тем более я хотел и хочу сам понять как сделать цикл так как мне нужно, а не чтобы за меня кто-то бы взял и сделал, как бы пафосно это не звучало...
Юрий М, я понимаю, что в этой строке нет формулы. Я имел ввиду пользовательскую формулу, которую я пытаюсь создать. Если эту часть кода заблокировать, то формула работает, если эта часть кода присутствует то выдается ошибка "Знач".
Цитата
Юрий М написал: Проверьте, какое значение в этот момент у переменной.
Господа программисты, подскажите пжл в чем ошибка? Код пользовательской функции сделал так :
Код
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 И по прежнему не могу понять почему формула не работает со строкой.
Опытные экселисты, подскажите пожалуйста почему после цикла, или после выполнения условия цикла (не знаю как правильнее выразиться)
Код
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 и пр. (физически чувствую как обретаю силу очередного подавана)
Ігор Гончаренко написал: функция пользователя использованная на листе не может модифицировать другие ячейки
понятно, спасиб.
Нельзя обретать силу падавана... не будет тогда падавана... учитель направляет своего падавана, чтобы он обрел силу и не ступил на черную сторону силы...