Страницы: 1
RSS
Как при помощи цикла найти нужное значение?, Научите пользоваться циклом
 
Привет всем.
Научите пожалуйста пользоваться циклом. Читаю я про них читаю, но без конкретного примера ничего не понимаю, а примеры которые нахожу и понимаю не подходят под мою задачу.
Нужно в ячейку В2 поставить нужное значение значение из столбца F (диапазон F12:F21 - сечение кабеля). Условие у цикла следующее: имеем значение в ячейке В5, цикл просматривает значения в диапазоне Е12:Е21 и когда в столбце Е дойдет до значения большего чем В5, то должен в ячейку В2 поставить значение ячейки из диапазона D12:D21.
Например в ячейке В5 значение 50, цикл просматривает диапазон Е12:Е21, останавливается на ячейке Е14 т.к. 55>50 и ставит в ячейку В2 значение из D14 -1х10
 
Название поправил.
Timur,  попробуйте такой макрос. Что будет непонятно - спрашивайте.
Код
Sub Macro1()
Dim i As Long, x As Long
    x = Range("B5") 'Присвоили переменной значение ячейки, чтобы каждый раз не обращаться к этой ячейке
    For i = 12 To 21 'Перебираем строки с 12 по 21
        If Cells(i, 5) > x Then 'Есои значение в текущей ячейке больше значения переменной, то
            'Здесь действия при выполнении условий
            Exit For 'Выходим из цикла
        End If
    Next
End Sub
 
Код
Sub Macro2()
    Dim x As Integer
    
    x = 12 'номер строки с которой начинается таблица

    With ThisWorkbook.Worksheets("Лист1")
        Do While .Range("E" & x) < .Range("B5") 'проходим циклом по столбцу "Е" и сразу проверяем, что значение в ячейке меньше чем в "В5"
            x = x + 1
        Loop
        .Range("B2") = .Range("D" & x)
    End With
    
End Sub
Можно и циклом Do While.
 
Спасибо
С первым кодом мне понятно вроде, добавил еще одно условие
Код
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
Изменено: Timur - 22.03.2020 10:26:05
 
Цитата
Timur написал:
что сделать чтобы не вставлялась абракадабра в коде
При копировании кода должна быть раскладка RU
 
Цитата
Timur написал:
в "В5"  например 45 т.е. код должен искать цифру больше чем в В5 в столбце Е и брать 55, собственно он это и делает, но ведь 55>45где ло
Цитата
Цикл while проверяет на истенность выражение. Т. е., пока в столбце Е значение будет меньше чем в B5 он будет заходить во внутрь цикла и увеличивать переменную x. Как только в Е(х) значение будет больше чем в B5, то цикл завершается.
 
nor, понял, спасибо.
А почему проверка по двум условиям не срабатывает?
 
Вроде со вторым циклом тоже получилось
Код
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
Но думаю что запись должна идти как-то по другому. По мне так вроде логично, но с точки зрения правильности кода не думаю что правильно)))
 
Всем привет. Экселисты посмотрите пжл код и объясните такую вещь:

Почему код работает
Код
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
то тоже все работает.
Для чего на этом участке кода объявлять переменные?
 
Без объявления или без явного указания типа Excel все переменные видит как Variant. А уже далее преобразует в наиболее подходящий, по его мнению, тип.
 
Цитата
Timur написал:
Для чего на этом участке кода объявлять переменные?
Это более грамотный подход к написанию кодов и лучше всегда объявлять. Ознакомьтесь на досуге: Variable not defined или что такое Option Explicit и зачем оно нужно?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Как проверить с помощью цикла vba, при каждом вводе данных в активную ячейку, есть ли значение(любое) в предыдущих(влево от активной ячейки) 6 ячейках строки, если есть во всех 6 подряд то запретить ввод(или msg) а если нет то можно дальше вводить данные. Нужно чтобы при составления графика дежурства на дому  вводить не больше 6 дней дежурств(одного работника), потом выходной и опять по новой. В графике реализована форма для заполнения. Хочу установить проверку, чтобы было заполнено не больше 6 ячеек дальше пустая ячейка и опять 6 дней дежурства.
Вот код одной кнопки(нужно сюда вставить цикл проверки заполненых ячеек):
Код
Private Sub CommandButton1_Click()
 If Not Intersect(ActiveCell, Range("B8:AF15")) Is Nothing Then
   If ActiveCell.Offset(, -1) = "/3" Then
            MsgBox ("ЗАПРЕЩЕНО!!!"), vbCritical + vbDefau, "ОШИБКА"
        ActiveCell.Offset(, 0) = ""
     Exit Sub
  Else
     If ActiveCell.Offset(, -1) = 1.5 Then
            MsgBox ("ЗАПРЕЩЕНО!!!"), vbCritical + vbDefau, "ОШИБКА"
        ActiveCell.Offset(, 0) = ""
     Exit Sub
  Else
    Selection = 1.75
        ActiveCell.Offset(, 1).Select
      End If
     End If
  End If
End Sub
Заранее спасибо!
 
Александр, создайте новую тему
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх