Ігор Гончаренко написал: функция пользователя использованная на листе не может модифицировать другие ячейки
понятно, спасиб.
Нельзя обретать силу падавана... не будет тогда падавана... учитель направляет своего падавана, чтобы он обрел силу и не ступил на черную сторону силы...
Опытные экселисты, подскажите пожалуйста почему после цикла, или после выполнения условия цикла (не знаю как правильнее выразиться)
Код
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
Господа программисты, подскажите пжл в чем ошибка? Код пользовательской функции сделал так :
Код
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 И по прежнему не могу понять почему формула не работает со строкой.
Юрий М, я понимаю, что в этой строке нет формулы. Я имел ввиду пользовательскую формулу, которую я пытаюсь создать. Если эту часть кода заблокировать, то формула работает, если эта часть кода присутствует то выдается ошибка "Знач".
Цитата
Юрий М написал: Проверьте, какое значение в этот момент у переменной.
vikttur, не думаю чтобы на форуме нашлись желающие которым захотелось бы решить задачу по подбору кабеля. Тем более я хотел и хочу сам понять как сделать цикл так как мне нужно, а не чтобы за меня кто-то бы взял и сделал, как бы пафосно это не звучало...
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(добавил вложение)
МатросНаЗебре, спасибо. Макрос работает как надо, спасибо, кажется я даже понял что вы делаете. Сейчас попробую добавить в текст макроса еще одну проверку по второму условию, надеюсь получится
О да, я тоже люблю так говорить человеку, который чего-то не понимает. Говорить ему, что он всего лишь не захотел уделить этой задачи чуточку больше времени и при должном усердии у него обязательно получится. Ну и что, что ты этим никогда не занимался, это же твой новые (пресловутые) компетенции!!! Снисходительно так улыбаться при этом. И отвернувшись в сторону сказать: "Подойди в конце дня, посмотрим!" И вот пришел конец дня, приходит этот человек, с глазками как у кота из Шрека и такой, ну что посмотрим!!! И вот я снизошел...даю этому человеку подсказки, где прочитать, у кого спросить, где взять аналог.... И человек такой: "что вот так? и все?" и я такой "ага" а человек такой: "ты че .... мат мат мат мат не мог раньше этого просто сказать???" а я просто снисходительно улыбаюсь и отворачиваюсь в монитор ибо еще больший кайф сродни физиологическому оргазму я получаю от понимания того, что до человека реально дошло благодаря мне, моим страданиям! Чувство что я всемогущ в данном вопросе, как бог, начинает играть с новой силой. Еще один падаван обрел силу....
RAN написал: Но вы в коде вообще не оперируете понятием "значения"
а я думал, что указав диапазон, эксель сам поймет что из него надо брать значения из ячеек по очереди! понимаю что моя логика неверная))) наверное нужно указать шаг. МатросНаЗебре, вроде как раз и сделал то, о чем вы говорите.
МатросНаЗебре, что-то не работает! RAN, т.е. цикл не может перебрать значения из диапазона? и подставлять их в формулу до определенных пор, и потом вывести значение ячейки из диапазона на которой он остановился считать. т.е. это невозможно сделать циклом?
Почитав в интернетах про циклы, я узнал что есть такая вещь как цикл 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 sechenie(Tok, dU)
Dim i As Long
For i = 12 To 21 'перебираем строки с 12 по 21
If Cells(i, 5) > Tok And Cells(i, 7) < dU Then 'если проходит проверка и по току и по потере напряжения
sechenie = Cells(i, 4) 'выбираем кабель из перечня
Exit For 'выходим из цикла
End If
Next
End Function
без объявления переменных Tok и dU как Long или эксель и так видит, что это числовые значения Если в коде в сообщении 4 удалить
Код
x As Long, x2 As Long
то тоже все работает. Для чего на этом участке кода объявлять переменные?
Sub Macro23()
Dim x As Integer
x = 12 'номер строки с которой начинается таблица
With ThisWorkbook.Worksheets("Лист1")
Do While .Range("E" & x) < .Range("B5") 'проверяем по току
x = x + 1
Loop
Do While .Range("G" & x) > .Range("B3") 'проверяем по падению напряжения
x = x + 1
Loop
.Range("B2") = .Range("D" & x)
End With
End Sub
Но думаю что запись должна идти как-то по другому. По мне так вроде логично, но с точки зрения правильности кода не думаю что правильно)))
Спасибо С первым кодом мне понятно вроде, добавил еще одно условие
Код
Sub Macro11()
Dim i As Long, x As Long, x2 As Long
x = Range("B5") 'проверка по току
x2 = Range("B3") 'проверка по потере напряжения
For i = 12 To 21 'перебираем строки с 12 по 21
If Cells(i, 5) > x And Cells(i, 7) < x2 Then 'если проходит проверка и по току и по потере напряжения
Range("B2") = Cells(i, 4) 'выбираем кабель из перечня
Exit For 'выходим из цикла
End If
Next
End Sub
А вот со вторым кодом вопрос, почему стоит знак меньше чем в "В5"
Код
Do While .Range("E" & x) < .Range("B5") 'проходим циклом по столбцу "Е" и сразу проверяем, что значение в ячейке меньше чем в "В5"
x = x + 1
т.е. у нас значение в "В5" например 45 т.е. код должен искать цифру больше чем в В5 в столбце Е и брать 55, собственно он это и делает, но ведь 55>45 где логика? почему код не выглядит так
Код
Range("E" & x) > .Range("B5")
если знак стоит > То ерунда полная)))) И еще вопрос. он не хочет делать проверку по еще одному условию через And как это делает первый код Почитал про "Until", но как прописать синтаксис Until. И что сделать чтобы не вставлялась абракадабра в коде на сайт?
Код
Sub Macro23()
Dim x As Integer
x = 12 'номер строки с которой начинается таблица
With ThisWorkbook.Worksheets("Лист1")
Do While .Range("E" & x) < .Range("B5") And .Range("G" & x) < .Range("B3") 'проходим циклом по столбцу "Е" и сразу проверяем, что значение в ячейке меньше чем в "В5"
x = x + 1
Loop
.Range("B2") = .Range("D" & x)
End With
End Sub
Sub Macro24()
Dim x As Integer
x = 12 'номер строки с которой начинается таблица
With ThisWorkbook.Worksheets("Лист1")
Do Until .Range("E" & x) < .Range("B5") And .Range("G" & x) < .Range("B3") 'проходим циклом по столбцу "Е" и сразу проверяем, что значение в ячейке меньше чем в "В5"
x = x + 1
Loop
.Range("B2") = .Range("D" & x)
End With
End Sub
Привет всем. Научите пожалуйста пользоваться циклом. Читаю я про них читаю, но без конкретного примера ничего не понимаю, а примеры которые нахожу и понимаю не подходят под мою задачу. Нужно в ячейку В2 поставить нужное значение значение из столбца F (диапазон F12:F21 - сечение кабеля). Условие у цикла следующее: имеем значение в ячейке В5, цикл просматривает значения в диапазоне Е12:Е21 и когда в столбце Е дойдет до значения большего чем В5, то должен в ячейку В2 поставить значение ячейки из диапазона D12:D21. Например в ячейке В5 значение 50, цикл просматривает диапазон Е12:Е21, останавливается на ячейке Е14 т.к. 55>50 и ставит в ячейку В2 значение из D14 -1х10
Добрый день, гуру эксель! Начальника озадачил(((, сделал он график отпусков. В нем по дням отмечено кто в какой день идет (зеленая заливка с цифрой 1). График получается очень длинным - листать ему лениво. И задача передо мной такая, нужно сделать такую ячейку в которой будет показываться промежуток в который человек идет в отпуск, т.е. чтобы писалось, например, с 25.02.219 по 3.03.2019. Т.е. формула просматривает всю строку и пишет с какой и по какую дату у человека первый отпуск (второй отпуск) Как сделать такую формулу, чтобы она брала первую и последнею дату отпуска человека, т.е. по сути первое и последнее значение из диапазона. При этом еще эти единицы нужно переделать в даты! А при условии что у человека может быть несколько отпусков в году, как это возможно реализовать?
Добрый день, гуру эксель! Начальника озадачил(((, сделал он график отпусков. В нем по дням отмечено кто в какой день идет (зеленая заливка с цифрой 1). График получается очень длинным - листать лениво. И задача передо мной такая, нужно сделать такую ячейку в которой будет показываться промежуток в который человек идет в отпуск, т.е. чтобы писалось, например, с 25.02.219 по 3.03.2019. Как сделать такую формулу, чтобы она брала первую и последнею дату отпуска человека. А при условии что у человека может быть несколько отпусков в году, как это возможно реализовать?
Добрый день, гуру экселя. Нашел тут у себя на работе форму кабельного журнала и пытаюсь ее под себя адаптировать. Но не могу разобраться в части кода, которая копирует марку и длину трубы. И так в чем суть работы таблицы. На вкладке КТЖ я рассчитываю всю свою сеть, указываю типы кабелей и труб, их длины; потом с нее формирую кабельный журнал на вкладке "Кабельный журнал". Кабели встают нормально, а вот трубы не очень. В коде прописано как вставлять трубы, но я хочу чтобы они просто вставлялись так же как и кабели. Но в коде очень для меня все не понятно в той части. Думаю для программиста там все логично, но мне как-то вообще не ясна логика. Помогите!!
круто, только если у меня будет произвольное количество строк, каким образом мне применить этот макрос к каждой конкретной строке. Будет ли работать такой макрос только внутри пользовательской формулы Function а вот только как там быть с диапазонами. диапазоны внутри функции могут быть ее аргументами? тогда если это так можно копировать формулу скопировавв строку
Работает не верно, проверяет только по условию падения напряжения я так понял. Например если поставить 5 кВт в ячейке А2 и 1 метр G2 макрос предложит взять 3х1,5 не проверив по току т.е. по D2 только сравнив с 5%. и выдает неверный результат. и что странно позапускав макрос несколько раз он потом перестает вообще выполняться.
МатросНаЗебре, спасибо, формула работает как надо. Только придется иметь лист заготовку, впринципе он у меня и так есть, формула всяко быстрее макроса будет. Ну если кто то покажет как это делается макросом, буду премного благодарен.
Добрый день Гуру эксель. И так по рекомендации vikttur создал новую тему. vikttur, увы за 6 лет научился делать только самые простые макросы, и допиливать чужие коды под свои нужды, но тем не менее создал для полезную штуку (если интересно вот она https://cloud.mail.ru/public/2Rt1/UHydUYVX2, она тяжелая поэтому положил на сервер). Но теперь решил сделать что то реально сложное, ну для меня по крайней мере сложное. И так нужно решить задачу подбора кабеля по мощности нагрузки: 1. Имеем мощность нагрузки - А2, значение может быть любым в пределах разумного. В примере 5 кВт 2. Считаем ток в ячейке D2 (для этого мы выбираем на какой фазе будет сидеть потребитель А, В, С или АВС - но это не так важно). В примере фаза А и ток равен 36А 3. В ячейке F2 выбираю из списка кабель чтобы его номинальный ток который показывается в С2 был больше тока расчетного который показывается в D2. Т.е. 3х1,5 удовлетворяет условию. Теперь нужно сделать вторую проверку кабеля по потере напряжения 4. В ячейку G2 заносим длину кабеля до потребителя. например 100 м 5. В результате в ячейке I2 видим что потери составляют 34,62% (по норме не более 5) 6. Теперь перебирая сечения в F12 и дойдя по порядку до кабеля 3х16 мы видим выполнение двух условий: значение I2меньше 5 значение в С2 больше D2 все, кабель выбрали. Вот такую вещь с двумя проверками не могу сделать. Жду подзатыльников
И так постановка задачи. изначально дается мощность В10 и длина S10, и я предполагаю что достаточно самого минимального сечения из списка т.е. М10=3х1,5. При например значениях B10=20 и S10=300, тогда значение Y10=36,22 что больше значительно 5%. значит нужно перейти к следующему сечению из списка 2,5, и так до тех пор пока Y10 не станет меньше 5. Т.е. дойти до значения М10=3х16 и остановиться на нем! вот как то так
И так дано: B10 пишем в нее мощность, в S10 пишем длину кабеля. у нас считается ток в Н10, теперь вручную я выбираю сечение кабеля в М10, до тех пор пока значение потерь в Y10 не будет меньшим 5% и так нужно проверять чтобы значение H10 не было больше G10 ( G10 это номинальный ток). Задача чтобы макрос или хитрая формула сама провела две проверки на потерю напряжения в H10 и на значение тока в G10 и перебором выбрало нужное сечение кабеля из списка на БД кабели
Здравствуйте Гуру экселя. Кошмар прошло уже 6 лет как я задал свой первый вопрос тут. http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=19545&TITLE_SEO=19545&MID=172... конечно вы скажете что за 6 лет наверное можно научиться программировать, ну согалсен можно, признаюсь честно, не очень то хотел, т.е. хотеть то хотел, но вот глубоко копнуть так и не получилось, хотя можно сказать что не хотел копнуть глубоко. Но благодаря вам научился писать макросы (понимать что нужно изменить в макросе других участников сайта под себя) которые мне как проектировщику помогли облегчить жизнь в некоторой степени. Это я все к чему, к тому что я стараюсь не лениться и учиться. Теперь решил выйти на новый уровень программирования, ура!:-) Так вот как решить следующую задачу подбора кабеля: имеем нагрузку - ячейка B10, по ней считаю ток J10, ставлю длину кабеля S10, получаю какое то значение потерь в Y10 и руками выбираю кабель в AI10 пока значение потерь напряжения в BS10 не достгнет значения меньше 5%. Понимаю что эту задачу нужно решать циклом, и что это просто, но кааааааак..... я так и не понял сколько не читал про циклы как заставить цикл идти по диапазону сечений кабеля, потом считать потерю напряжения и сравнивать его с 5%, и остановить его. жуть просто для меня. Прошу направить на путь истинный(((
Эх да, не уточнил. Задача найти нужное сечение. Т.е. у нас всегда разное падение напряжения - I2 и есть всегда заданное нормативное падение J2, мы задали мощность - кВт и длину кабеля и все остальные параметры... и эта хитрая формула должна пробежаться по диапазону по очереди подставить значение сечений из списка, сравнивая при этом какое падение получится при каждой подстановке и в итоге остановиться на каком то сечении