Страницы: 1
RSS
Выполняется только последнее IF
 
Здравствуйте. В коде выполняется загрузка картинки и последнее IF. У меня планируется много видов заполнения формы в зависимости от выбора ComboBox23. Не могу двинуться дальше. Прошу помочь в решении проблемы
Код
Public Sub ComboBox23_Change()
    Dim strSystemType As String
    Dim МодулиPath As String
    Dim strFullFilePath As String
    МодулиPath = ThisWorkbook.Path & "\Модули\"
    strSystemType = UserForm1.ComboBox23.Text
    strFullFilePath = МодулиPath & Application.PathSeparator & strSystemType & ".jpg"
     If IsExists(strFullFilePath) Then
        Image5.Picture = LoadPicture(strFullFilePath)
     End If
 
 Sheets("Расчёт").Range("E3") = ComboBox23.Text
   
  If (ComboBox23.Text = Sheets("Справочник").Range("F2")) Or (ComboBox23.Text = Sheets("Справочник").Range("F3")) Or (ComboBox23.Text = Sheets("Справочник").Range("F4")) Then
    Frame9.Visible = False
    Image3.Visible = False
    Image11.Visible = False
    Frame2.Left = 0
    Frame2.Width = 570
    Sheets("Расчёт").Range("E20") = ""
    ComboBox15.Visible = False
    ComboBox4.Visible = False
    ComboBox30.Visible = False
    ComboBox29.Visible = False
    ComboBox31.Visible = False
    Label139.Visible = False
    Label140.Visible = False
    Label144.Visible = False
    Label147.Visible = False
    Label148.Visible = False
    Label149.Visible = False
      Else
    Frame9.Visible = True
    Image3.Visible = True
    Image11.Visible = True
    Frame2.Left = 144
    Frame2.Width = 426
    ComboBox15.Visible = True
    ComboBox4.Visible = True
    ComboBox30.Visible = True
    ComboBox29.Visible = True
    ComboBox31.Visible = True
    Label139.Visible = True
    Label140.Visible = True
    Label144.Visible = True
    Label147.Visible = True
    Label148.Visible = True
    Label149.Visible = True
  End If
   If ComboBox23.Text = Sheets("Справочник").Range("F5") Then
   Frame9.Visible = False
   Image3.Visible = False
   Image11.Visible = False
   Frame2.Left = 0
   Frame2.Width = 570
   Sheets("Расчёт").Range("E20") = ""
   ComboBox18.RowSource = "Количество1"
   ComboBox2.RowSource = "Открывание_вбок"
   ComboBox15.Visible = False
   ComboBox4.Visible = False
   ComboBox30.Visible = False
   ComboBox29.Visible = False
   ComboBox31.Visible = False
   Label139.Visible = False
   Label140.Visible = False
   Label144.Visible = False
   Label147.Visible = False
   Label148.Visible = False
   Label149.Visible = False
     Else
   Frame9.Visible = True
   Image3.Visible = True
   Image11.Visible = True
   Frame2.Left = 144
   Frame2.Width = 426
   ComboBox18.RowSource = "Количество"
   ComboBox2.RowSource = "Открывание_фасада"
   ComboBox15.Visible = True
   ComboBox4.Visible = True
   ComboBox30.Visible = True
   ComboBox29.Visible = True
   ComboBox31.Visible = True
   Label139.Visible = True
   Label140.Visible = True
   Label144.Visible = True
   Label147.Visible = True
   Label148.Visible = True
   Label149.Visible = True
     End If
    End Sub
 
Почитайте статью Дмитрия Щербакова "Отлов ошибок и отладка кода VBA"
Владимир
 
В коде выполняются оба If. Но второй всегда затирает работу первого.
ElseIf не зря придуман.
 
Цитата
RAN написал:
ElseIf
Привет, тёзка.
ТС может с С++ или java пришёл - там нет ElseIf :)
 
RAN, Андрей, но ведь ElseIf  это просто укороченная запись, а по логике ничего не меняется. Так что если правильно построить логику то можно обойтись даже просто If - endif

vadim-kholkin, А вам удобно работать с таким количеством объектов, по стандартным именам. У мен уже на строке 17 отторжение началось.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
а по логике ничего не меняется
Привет, Михаил.
Увы меняется.
Код
If logicalExpression Then
    ' statement
Else
    If logicalExpression Then
        ' statement
    End If
End If

Не равно
Код
If logicalExpression Then
    ' statement
End I
If logicalExpression Then
    ' statement
End If
Изменено: Андрей VG - 16.06.2020 20:35:13
 
Привет, тёзка. А Select Case е?  :)
 
Off
Цитата
Андрей VG написал:
ТС может с С++ или java пришёл - там нет ElseIf
Не скажу по С++ но в Java есть такое ветвление    
Код
public static void main(String[] args) {
        String txt = "test2";
        if (txt.equals("test")) {
            System.out.println("if");
        }else if(txt.equals("test1")){
            System.out.println("else if 1");
        }else if(txt.equals("test2")){
            System.out.println("else if 2");
        }
    }
Вот вполне себе рабочий код
"Все гениальное просто, а все простое гениально!!!"
 
Андрей VG, Андрей, я про ElseIf связку. Ну и правильно построенная логика будет верна везде
Код
If A=2 then
    a=2
else
    if a=3
        a=3
    end if
end if


Код
If A=2 then
    A=2
end if
if a=3 then
    a=3
end if


Код
if a=2 then
    a=2
elseif a=3 then
    a=3
end if
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
А вам удобно работать с таким количеством объектов
Тут как то пару лет назад выкладывали форму на которой объектов было столько что даже машина с 16 (или 32) гигабайтами оперативки выдавала Out of Memory
Ну а если по теме , то тут весь код нужно оптимизировать, в таком если, что сломается потом, думаю даже автор не разберется через пару тройку месяцев :)
Изменено: Nordheim - 16.06.2020 20:58:20
"Все гениальное просто, а все простое гениально!!!"
 
Всем спасибо за участие. Я не понял как использовать elseif. Если отбросить кучу текста, то код выглядит:

если ComboBox23.Text="Шкаф" То "данные-1 для элементов управления" иначе "данные-2 элементов управления;
если ComboBox23.Text="Стол" То "данные-3 для элементов управления" иначе "данные-4 элементов управления;
и планируется около 15 "Если-то-иначе".

Я по сравнению с вами использую "клинопись", но пытаюсь выйти из положения, используя пока то, что есть в голове. Вот и прошу направить на путь истинный. Как код будет выглядеть при многих блоках "если-то-иначе", чтобы они все работали?
По поводу статьи по отлову ошибок: ну я совсем "динозавр"; прочитал и не понял как использовать в моём случае.
Спасибо, надеюсь, что вопрос решится с вашей помощью
 
Цитата
vadim-kholkin написал:
Я не понял как использовать elseif.
Пока не поймете, дело не двинется.
Цитата
vadim-kholkin написал:
около 15 "Если-то-иначе".
никогда работать не будет
нужно
1 если (If)
13 иначе если (ElseIf)
1 иначе (Else)
А сейчас у вас на условие Else привязано 2 различных кода.
 
Цитата
А сейчас у вас на условие Else привязано 2 различных кода
Кажется получилось. Допишу код до конца, по-тестирую, посмотрю как будет работать, напишу результат. Всем большое спасибо.
 
vadim-kholkin, Если
Цитата
vadim-kholkin написал:
и планируется около 15 "Если-то-иначе".
то 14 раз выполнится ИНАЧЕ и один раз ТО. Вам это нужно?

Не совсем по теме. но у вас часть операций, даже если закрыть глаза на названия объектов , одинаковы, но строк много. Это только усложняет понимание, Уберите в отдельную процедуру примерно так

Код
If (ComboBox23.Text = Sheets("Справочник").Range("F2")) Or (ComboBox23.Text = Sheets("Справочник").Range("F3")) Or (ComboBox23.Text = Sheets("Справочник").Range("F4")) Then
    Sheets("Расчёт").Range("E20") = ""
    Call MeFormat(False)
Else
    Call MeFormat(True)
End If
If ComboBox23.Text = Sheets("Справочник").Range("F5") Then
   Sheets("Расчёт").Range("E20") = ""
   ComboBox18.RowSource = "Количество1"
   ComboBox2.RowSource = "Открывание_вбок"
   Call MeFormat(False)
Else
    ComboBox18.RowSource = "Количество"
    ComboBox2.RowSource = "Открывание_фасада"
    Call MeFormat(True)
End If


Sub MeFormat(Switch As Boolean)
   If Switch Then
       Frame2.Left = 144
       Frame2.Width = 426 '
   Else
       Frame2.Left = 0
       Frame2.Width = 570
   End If
   Frame9.Visible = Switch
   Image3.Visible = Switch
   Image11.Visible = Switch
   ComboBox15.Visible = Switch
   ComboBox4.Visible = Switch
   ComboBox30.Visible = Switch
   ComboBox29.Visible = Switch
   ComboBox31.Visible = Switch
   Label139.Visible = Switch
   Label140.Visible = Switch
   Label144.Visible = Switch
   Label147.Visible = Switch
   Label148.Visible = Switch
   Label149.Visible = Switch
End Sub


а для краткости  процедурку записать еще короче
Код
Sub MeFormat(Switch As Boolean)
   If Switch Then
    Frame2.Left = 144
    Frame2.Width = 426 '
   Else
       Frame2.Left = 0
    Frame2.Width = 570
    End If
    For Each obj In Array(Frame9, Image3, Image11, ComboBox15, ComboBox4, ComboBox30, ComboBox29, ComboBox31, _
        Label139, Label140, Label144, Label147, Label148, Label149)
        obj.Visible = Switch
    Next
End Sub
По вопросам из тем форума, личку не читаю.
 
БМВ, для меня это очень навороченно. Спасибо, но я даже ничего не понял.
Код дописал. Получил "Войну и мир" в четырёх томах. Всё работает. Спасибо. Заходите в гости
 
Цитата
vadim-kholkin написал: Заходите в гости
и это после такого?
Цитата
Получил "Войну и мир" в четырёх томах
Вряд ли кто рискнет, разве только со своей бутылкой версией на замену :)
 
Цитата
vadim-kholkin написал:
БМВ , для меня это очень навороченно.
Попробуйте разобраться, там ничего навороченного, наоборот все упрощено, а вот в вашем коде разобраться действительно та еще задачка  8-0
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, если я правильно разобрался, то все свойства элементов управления собраны в  отдельную процедуру с переключателем Visible=False или True и переключаться будут все разом. Дело в том, что в дальнейшем, при ComboBox23.Text =новое значение, некоторые элементы могут быть  Visible=False, а некоторые Visible=True. Как быть в таком случае? Если для каждого случая писать свою процедуру MeFormat1,2 и т.д., то, в итоге, получится то же, что и у меня сейчас. Я повторюсь - если я всё правильно понял.
 
Цитата
vadim-kholkin написал:
то, в итоге, получится то же, что и у меня сейчас.
Не совсем. Я не сторонник все декомпозировать до мелочей, но вы разделите на части, где логика в одной, а сами действия по этой логике в отдельных процедурах. для корректировки или понимания так проще.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх