Страницы: 1
RSS
Условие как переменная
 
Ребят, доброго здоровья всем!)
Подскажите пожалуйста следующее...

Код
Sub test ()
Dim value As String
value = TextBox1.Text
If ComboBox1 = "часть" Then
For i = 1 To L
If Cells(i, 3)) Like "*" & value & "*" Then
ListBox1.AddItem ""
ListBox1.List(x, 0) = Cells(i, 1)
ListBox1.List(x, 1) = Cells(i, 2)
x = x + 1
Next i
End If
If ComboBox1 = "целое" Then
If Cells(i, 3)) = value Then
ListBox1.AddItem ""
ListBox1.List(x, 0) = Cells(i, 1)
ListBox1.List(x, 1) = Cells(i, 2)
x = x + 1
Next i
End If
End sub

Как видите я делаю одно и тоже действие с листбоксом но только по разным условиям.
Если в оригинале, то заполнение лб более обширнее а условий может быть тоже много, и если прописывать каждый раз условие я естественно повторяю один и тот же кусок кода что будет делать его более громоздким! Это вроде бы и не трудно но именно поэтому и возникает у меня вопрос:
можно ли каким-то образом условие задавать как "переменную" чтобы не прописывать одни и те же действия много раз?

 
Если правильно понял, что Вам нужно
Код
Sub test()
Select Case ComboBox1.value
    Case Is = "часть"
        s = "*" & TextBox1.Text & "*"
    Case Is = "целое"
        s = TextBox1.Text
End Select
For i = 1 To L
    If Cells(i, 3) Like s Then
        ListBox1.AddItem ""
        ListBox1.List(i - 1, 0) = Cells(i, 1)
        ListBox1.List(i - 1, 1) = Cells(i, 2)
    End If
Next
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja, спасибо! Именно этот пример Вы подсказали как решить через переменную, но если усложнять условие например
Код
if Cells(i, 3)) = value And Cells(i, 4)) > Me.TextBoxDataN And Cells(i, 4)) < Me.TextBoxDataK 
а во втором случае например мне не нужно value:
Код
if Cells(i, 4)) > Me.TextBoxDataN And Cells(i, 4)) < Me.TextBoxDataK
а действия с листбоксом я провожу опять таки те же самые
возможно ли это решить через переменную?
 
Примерно так:
Код
Select Case True
Case Cells(i, 3) = Value And Cells(i, 4) > Me.TextBoxDataN And Cells(i, 4) < Me.TextBoxDataK
    s = "*" & TextBox1.Text & "*"
Case Cells(i, 4) > Me.TextBoxDataN And Cells(i, 4) < Me.TextBoxDataK
    s = TextBox1.Text
End Select
'Действия с переменной "s"
Главное, в теле Select Case...End Select расположить условия в требуемом порядке.
Чем шире угол зрения, тем он тупее.
 
SAS888, Вы не так меня поняли.
Сейчас исправлю пример
 
вот допустим так:
Код
Sub test()
Dim value As String
value = TextBox1.Text
If ComboBox1 = "1" Then
    For i = 1 To L
        If Cells(i, 3) Like "*" & value & "*" Then
            ListBox1.AddItem ""
            ListBox1.List(x, 0) = Cells(i, 1)
            ListBox1.List(x, 1) = Cells(i, 2)
            x = x + 1
        End If
    Next i
End If
If ComboBox1 = "2" Then
    For i = 1 To L
        If Cells(i, 3) = value And Cells(i, 4) > Me.TextBoxDataN And Cells(i, 4) < Me.TextBoxDataK Then
            ListBox1.AddItem ""
            ListBox1.List(x, 0) = Cells(i, 1)
            ListBox1.List(x, 1) = Cells(i, 2)
            x = x + 1
        End If
    Next i
End If
If ComboBox1 = "3" Then
    For i = 1 To L
        If Cells(i, 3) Like "*" & value & "*" And Year(Cells(i, 4)) <> 2017 Then
            ListBox1.AddItem ""
            ListBox1.List(x, 0) = Cells(i, 1)
            ListBox1.List(x, 1) = Cells(i, 2)
            x = x + 1
        End If
    Next i
End If
End Sub
 
В таком случае, я бы пошел другим путем.
Лучше не трогать эти сложные условия, а вынести повторяющийся код в отдельную процедуру. Например, так:
Код
Sub test()
    Dim value As String, L As Long, i As Long, x As Long
    value = TextBox1.Text
    For i = 1 To L
        Select Case ComboBox1.value
        Case 1
            If Cells(i, 3) Like "*" & value & "*" Then qq x, i:
        Case 2
            If Cells(i, 3) = value And Cells(i, 4) > Me.TextBoxDataN And Cells(i, 4) < Me.TextBoxDataK Then qq x, i
        Case 3
            If Cells(i, 3) Like "*" & value & "*" And Year(Cells(i, 4)) <> 2017 Then qq x, i
        End Select
        x = x + 1
    Next
End Sub

Sub qq(x As Long, i As Long)
    ListBox1.AddItem ""
    ListBox1.List(x, 0) = Cells(i, 1)
    ListBox1.List(x, 1) = Cells(i, 2)
End Sub
Чему рано L ?
Изменено: SAS888 - 24.05.2017 10:40:48
Чем шире угол зрения, тем он тупее.
 
SAS888, ххммм... а ведь упрощает дело!))) спасибо
L это последняя строка. Я просто не стал писать ее определение.
А можно ли пояснить мне пожалуйста ... Then qq x, i
qq - процедура, x - индекс, i - строка
я вот думал что для вызова всегда надо писать Call qq
можете пояснить почему именно так пишется Then qq x, i
 
Можно использовать
Код
qq x, i
Можно
Код
Call qq(x, i)
Можно
Код
Run "qq", x, i
Все равно.
Изменено: SAS888 - 24.05.2017 11:08:13
Чем шире угол зрения, тем он тупее.
 
SAS888, я бы раньше написал Call qq, но теперь вопрос почему дописываете к этому x, i
я так не писал никогда и поэтому не понимаю
Изменено: Azakia - 24.05.2017 11:08:46
 
Это аргументы, которые передаются в подпрограмму для использования в ее коде.
Чем шире угол зрения, тем он тупее.
 
SAS888, почитал Call Statement. Понял)
Спасибо за помощь

Страницы: 1
Наверх