Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Применение логического or - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Применение логического or (Макросы/Sub)
Применение логического or
Aleksej Дата: Суббота, 02.04.2016, 04:26 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 69
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Всем доброго времени суток :)

Появился вопрос по VBA, а именно, почему у меня в коде не работает логическое "или"?

[vba]
Код
If s = ListName Then r = 9 Else
If s = ListName1 Or ListName2 Or ListName3 Then r = 15 ' <--- ------- здесь выдает ошибку "Run-time Error '13' " Type mismatch
If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
[/vba]

Если убираем "или" то все работает нормально

[vba]
Код
If s = ListName Then r = 9 Else
If s = ListName1 Then r = 15 ' Так все работает без проблем
If s = ListOPS1 Then r = 8
[/vba]

Код полностью:

[vba]
Код
Sub Очистка_Форм()
    Dim ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3 As String
    Dim aNames, s
    Dim CountRow, r As Long
     
                    ListName = Sheets("Данные").Cells(5, "D")
                    ListName1 = Sheets("Данные").Cells(6, "D")
                            ListName2 = Sheets("Данные").Cells(7, "D")
                        ListName3 = Sheets("Данные").Cells(8, "D")
                    ListOPS1 = Sheets("Данные").Cells(9, "D")
                ListOPS2 = Sheets("Данные").Cells(10, "D")
            ListOPS3 = Sheets("Данные").Cells(11, "D")
  
            aNames = Array(ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3)

    For Each s In aNames
    
            CountRow = Sheets(s).Range("B" & Rows.Count).End(xlUp).Row
            CountRow = CountRow + 5
            
            If s = ListName Then r = 9 Else
            If s = ListName1 Or ListName2 Or ListName3 Then r = 15
            If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
            
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With

    Next

End Sub
[/vba]

Помогите по синтаксису, что я делаю неправильно? :(
К сообщению приложен файл: 12345.xlsm (25.3 Kb)


Сообщение отредактировал Aleksej - Суббота, 02.04.2016, 10:09
 
Ответить
СообщениеВсем доброго времени суток :)

Появился вопрос по VBA, а именно, почему у меня в коде не работает логическое "или"?

[vba]
Код
If s = ListName Then r = 9 Else
If s = ListName1 Or ListName2 Or ListName3 Then r = 15 ' <--- ------- здесь выдает ошибку "Run-time Error '13' " Type mismatch
If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
[/vba]

Если убираем "или" то все работает нормально

[vba]
Код
If s = ListName Then r = 9 Else
If s = ListName1 Then r = 15 ' Так все работает без проблем
If s = ListOPS1 Then r = 8
[/vba]

Код полностью:

[vba]
Код
Sub Очистка_Форм()
    Dim ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3 As String
    Dim aNames, s
    Dim CountRow, r As Long
     
                    ListName = Sheets("Данные").Cells(5, "D")
                    ListName1 = Sheets("Данные").Cells(6, "D")
                            ListName2 = Sheets("Данные").Cells(7, "D")
                        ListName3 = Sheets("Данные").Cells(8, "D")
                    ListOPS1 = Sheets("Данные").Cells(9, "D")
                ListOPS2 = Sheets("Данные").Cells(10, "D")
            ListOPS3 = Sheets("Данные").Cells(11, "D")
  
            aNames = Array(ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3)

    For Each s In aNames
    
            CountRow = Sheets(s).Range("B" & Rows.Count).End(xlUp).Row
            CountRow = CountRow + 5
            
            If s = ListName Then r = 9 Else
            If s = ListName1 Or ListName2 Or ListName3 Then r = 15
            If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
            
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With

    Next

End Sub
[/vba]

Помогите по синтаксису, что я делаю неправильно? :(

Автор - Aleksej
Дата добавления - 02.04.2016 в 04:26
KuklP Дата: Суббота, 02.04.2016, 07:33 | Сообщение № 2
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Начнем с того что в строке

[vba]
Код
Dim ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2,ListOPS3 As String
[/vba]только ListOPS3 As String. остальное variant(Хотите , чтоб все были string - объявляйте каждую как string)
Поэтому какое свойство ячейки присваивается в строках типа:
ListName = Sheets("Данные").Cells(5, "D") - еще вопрос. Может просто range. Ну и пример надо выкладывать.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеНачнем с того что в строке

[vba]
Код
Dim ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2,ListOPS3 As String
[/vba]только ListOPS3 As String. остальное variant(Хотите , чтоб все были string - объявляйте каждую как string)
Поэтому какое свойство ячейки присваивается в строках типа:
ListName = Sheets("Данные").Cells(5, "D") - еще вопрос. Может просто range. Ну и пример надо выкладывать.

Автор - KuklP
Дата добавления - 02.04.2016 в 07:33
МВТ Дата: Суббота, 02.04.2016, 08:33 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 137 ±
Замечаний: 0% ±

Excel 2007
В это строке
[vba]
Код
If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
[/vba]
В следующей - аналогично
 
Ответить
СообщениеВ это строке
[vba]
Код
If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
[/vba]
В следующей - аналогично

Автор - МВТ
Дата добавления - 02.04.2016 в 08:33
Aleksej Дата: Суббота, 02.04.2016, 10:11 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 69
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KuklP, МВТ, Добрый день! :)

Цитата
пример надо выкладывать.

Файл великоват был. Выкинул лишнее выложил в первом посте.

Цитата
Хотите , чтоб все были string - объявляйте каждую как string

Попробовал, объявил, не помогло. Формат ячеек тоже поставил текстовый, не помогло.

Цитата
В следующей - аналогично

Да аналогично, если из первой строки убрать ИЛИ то вторая начинает ошибку выдавать.


Сообщение отредактировал Aleksej - Суббота, 02.04.2016, 10:23
 
Ответить
СообщениеKuklP, МВТ, Добрый день! :)

Цитата
пример надо выкладывать.

Файл великоват был. Выкинул лишнее выложил в первом посте.

Цитата
Хотите , чтоб все были string - объявляйте каждую как string

Попробовал, объявил, не помогло. Формат ячеек тоже поставил текстовый, не помогло.

Цитата
В следующей - аналогично

Да аналогично, если из первой строки убрать ИЛИ то вторая начинает ошибку выдавать.

Автор - Aleksej
Дата добавления - 02.04.2016 в 10:11
KuklP Дата: Суббота, 02.04.2016, 10:21 | Сообщение № 5
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
[vba]
Код
Sub Очистка_Форм()
    Dim ListName$, ListName1$, ListName2$, ListName3$, ListOPS1$, ListOPS2$, ListOPS3$
    Dim aNames, s
    Dim CountRow&, r As Long
     
                    ListName = Sheets("Данные").Cells(5, "D") 'Задаем имя, листа для сбора данных
                    ListName1 = Sheets("Данные").Cells(6, "D") 'Задаем имя листа для НПП ДО
                            ListName2 = Sheets("Данные").Cells(7, "D") 'Задаем имя листа для НПП РНС
                        ListName3 = Sheets("Данные").Cells(8, "D") 'Задаем имя листа для НПП ДМТР
                    ListOPS1 = Sheets("Данные").Cells(9, "D") 'Задаем имя листа для ОПС ДО
                ListOPS2 = Sheets("Данные").Cells(10, "D") 'Задаем имя листа для ОПС РНС
            ListOPS3 = Sheets("Данные").Cells(11, "D") 'Задаем имя листа для ОПС ДМТР
  
            aNames = Array(ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3)

    For Each s In aNames
    
            CountRow = Sheets(s).Range("B" & Rows.Count).End(xlUp).Row
            CountRow = CountRow + 5
            
            If s = ListName Then r = 9 Else
            

If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
            If s = ListOPS1 Or s = ListOPS2 Or s = ListOPS3 Then r = 8
            
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With

    Next


End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение[vba]
Код
Sub Очистка_Форм()
    Dim ListName$, ListName1$, ListName2$, ListName3$, ListOPS1$, ListOPS2$, ListOPS3$
    Dim aNames, s
    Dim CountRow&, r As Long
     
                    ListName = Sheets("Данные").Cells(5, "D") 'Задаем имя, листа для сбора данных
                    ListName1 = Sheets("Данные").Cells(6, "D") 'Задаем имя листа для НПП ДО
                            ListName2 = Sheets("Данные").Cells(7, "D") 'Задаем имя листа для НПП РНС
                        ListName3 = Sheets("Данные").Cells(8, "D") 'Задаем имя листа для НПП ДМТР
                    ListOPS1 = Sheets("Данные").Cells(9, "D") 'Задаем имя листа для ОПС ДО
                ListOPS2 = Sheets("Данные").Cells(10, "D") 'Задаем имя листа для ОПС РНС
            ListOPS3 = Sheets("Данные").Cells(11, "D") 'Задаем имя листа для ОПС ДМТР
  
            aNames = Array(ListName, ListName1, ListName2, ListName3, ListOPS1, ListOPS2, ListOPS3)

    For Each s In aNames
    
            CountRow = Sheets(s).Range("B" & Rows.Count).End(xlUp).Row
            CountRow = CountRow + 5
            
            If s = ListName Then r = 9 Else
            

If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
            If s = ListOPS1 Or s = ListOPS2 Or s = ListOPS3 Then r = 8
            
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With

    Next


End Sub
[/vba]

Автор - KuklP
Дата добавления - 02.04.2016 в 10:21
KuklP Дата: Суббота, 02.04.2016, 10:28 | Сообщение № 6
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Попробуйте еще вот это:
[vba]
Код
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With
[/vba]заменить этим:
[vba]
Код
Sheets(s).Range("A" & r & ":AG" & CountRow).Clear
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеПопробуйте еще вот это:
[vba]
Код
            With Sheets(s).Range("A" & r & ":AG" & CountRow)
                .ClearContents
                    .Borders(xlDiagonalDown).LineStyle = xlNone
                        .Borders(xlDiagonalUp).LineStyle = xlNone
                            .Borders(xlEdgeLeft).LineStyle = xlNone
                    .Borders(xlEdgeTop).LineStyle = xlNone
                            .Borders(xlEdgeRight).LineStyle = xlNone
                        .Borders(xlInsideVertical).LineStyle = xlNone
                    .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Interior.Pattern = xlNone
            End With
[/vba]заменить этим:
[vba]
Код
Sheets(s).Range("A" & r & ":AG" & CountRow).Clear
[/vba]

Автор - KuklP
Дата добавления - 02.04.2016 в 10:28
Aleksej Дата: Суббота, 02.04.2016, 10:38 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 69
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KuklP, Спасибо! Заработало. :)

[vba]
Код
If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
[/vba]
А я мучался как этот ИЛИ прописать. Все просто оказалось. :)

[vba]
Код
Sheets(s).Range("A" & r & ":AG" & CountRow).Clear
[/vba]
Хех. Всё гениальное просто. Спасибо Вам. hands


Сообщение отредактировал Aleksej - Суббота, 02.04.2016, 10:53
 
Ответить
СообщениеKuklP, Спасибо! Заработало. :)

[vba]
Код
If s = ListName1 Or s = ListName2 Or s = ListName3 Then r = 15
[/vba]
А я мучался как этот ИЛИ прописать. Все просто оказалось. :)

[vba]
Код
Sheets(s).Range("A" & r & ":AG" & CountRow).Clear
[/vba]
Хех. Всё гениальное просто. Спасибо Вам. hands

Автор - Aleksej
Дата добавления - 02.04.2016 в 10:38
KuklP Дата: Суббота, 02.04.2016, 10:41 | Сообщение № 8
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
МВТ, Вам это еще в №3 показал.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеМВТ, Вам это еще в №3 показал.

Автор - KuklP
Дата добавления - 02.04.2016 в 10:41
Pelena Дата: Суббота, 02.04.2016, 10:42 | Сообщение № 9
Группа: Админы
Ранг: Местный житель
Сообщений: 19174
Репутация: 4413 ±
Замечаний: ±

Excel 365 & Mac Excel
А я мучался как этот ИЛИ прописать

МВТ ещё в третьем посте эту строку прописал :)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
А я мучался как этот ИЛИ прописать

МВТ ещё в третьем посте эту строку прописал :)

Автор - Pelena
Дата добавления - 02.04.2016 в 10:42
al-Ex Дата: Суббота, 02.04.2016, 10:48 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Все просто
[vba]
Код
            If s = ListName Then r = 9 Else
            If s = ListName1 Or ListName2 Or ListName3 Then r = 15
            If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
            ' ...
            ' ...
             ,End If забыл вот и ругается
[/vba]


Сообщение отредактировал al-Ex - Суббота, 02.04.2016, 10:54
 
Ответить
Сообщение
Все просто
[vba]
Код
            If s = ListName Then r = 9 Else
            If s = ListName1 Or ListName2 Or ListName3 Then r = 15
            If s = ListOPS1 Or ListOPS2 Or ListOPS3 Then r = 8
            ' ...
            ' ...
             ,End If забыл вот и ругается
[/vba]

Автор - al-Ex
Дата добавления - 02.04.2016 в 10:48
KuklP Дата: Суббота, 02.04.2016, 10:51 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
End If забыл вот и ругается
А Вы пробовали? Там End If не нужен.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
End If забыл вот и ругается
А Вы пробовали? Там End If не нужен.

Автор - KuklP
Дата добавления - 02.04.2016 в 10:51
Aleksej Дата: Суббота, 02.04.2016, 10:56 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 69
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Pelena,
Цитата
МВТ ещё в третьем посте эту строку прописал

KuklP,
Цитата
МВТ, Вам это еще в №3 показал.


А-А-А точно, видимо у меня уже глаз замылился. Я думал он меня спрашивает. :D

МВТ, Респект. :)


Сообщение отредактировал Aleksej - Суббота, 02.04.2016, 11:07
 
Ответить
СообщениеPelena,
Цитата
МВТ ещё в третьем посте эту строку прописал

KuklP,
Цитата
МВТ, Вам это еще в №3 показал.


А-А-А точно, видимо у меня уже глаз замылился. Я думал он меня спрашивает. :D

МВТ, Респект. :)

Автор - Aleksej
Дата добавления - 02.04.2016 в 10:56
al-Ex Дата: Суббота, 02.04.2016, 10:57 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Не, не пробовал, меня так учили
Стандартная конструкция:
If (условие) Then
...
Else
...
End If
 
Ответить
СообщениеНе, не пробовал, меня так учили
Стандартная конструкция:
If (условие) Then
...
Else
...
End If

Автор - al-Ex
Дата добавления - 02.04.2016 в 10:57
Pelena Дата: Суббота, 02.04.2016, 11:00 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 19174
Репутация: 4413 ±
Замечаний: ±

Excel 365 & Mac Excel
Ещё одна стандартная конструкция
If условие Then ... Else ...


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЕщё одна стандартная конструкция
If условие Then ... Else ...

Автор - Pelena
Дата добавления - 02.04.2016 в 11:00
Aleksej Дата: Суббота, 02.04.2016, 11:01 | Сообщение № 15
Группа: Пользователи
Ранг: Участник
Сообщений: 69
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Можно и так

If условие Then ...
If условие Then ...
If условие Then ...
и т.д.

Else не обязателен


Сообщение отредактировал Aleksej - Суббота, 02.04.2016, 11:23
 
Ответить
СообщениеМожно и так

If условие Then ...
If условие Then ...
If условие Then ...
и т.д.

Else не обязателен

Автор - Aleksej
Дата добавления - 02.04.2016 в 11:01
al-Ex Дата: Суббота, 02.04.2016, 11:15 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 190
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
If условие Then ... Else ...
Спасибо, Pelena, просто у меня на автомате правило сработало,
"Увидел Else , - ищи End If ниже"


Сообщение отредактировал al-Ex - Суббота, 02.04.2016, 11:16
 
Ответить
Сообщение
If условие Then ... Else ...
Спасибо, Pelena, просто у меня на автомате правило сработало,
"Увидел Else , - ищи End If ниже"

Автор - al-Ex
Дата добавления - 02.04.2016 в 11:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Применение логического or (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!