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

Вход

Регистрация

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

 

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

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

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

Появился вопрос по 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(25Kb)


Сообщение отредактировал 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
Группа: Проверенные
Ранг: Старожил
Сообщений: 2111
Репутация: 453 ±
Замечаний: 0% ±

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

[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им! kuklp@mail.ru
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
Репутация: 136 ±
Замечаний: 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 2010
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
Группа: Проверенные
Ранг: Старожил
Сообщений: 2111
Репутация: 453 ±
Замечаний: 0% ±

[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им! kuklp@mail.ru
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
Группа: Проверенные
Ранг: Старожил
Сообщений: 2111
Репутация: 453 ±
Замечаний: 0% ±

Попробуйте еще вот это:
[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им! kuklp@mail.ru
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 2010
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
Группа: Проверенные
Ранг: Старожил
Сообщений: 2111
Репутация: 453 ±
Замечаний: 0% ±

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


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

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

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

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


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

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

Автор - Pelena
Дата добавления - 02.04.2016 в 10:42
al-Ex Дата: Суббота, 02.04.2016, 10:48 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 168
Репутация: 57 ±
Замечаний: 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
Группа: Проверенные
Ранг: Старожил
Сообщений: 2111
Репутация: 453 ±
Замечаний: 0% ±

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


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
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 2010
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
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 168
Репутация: 57 ±
Замечаний: 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
Группа: Модераторы
Ранг: Местный житель
Сообщений: 10996
Репутация: 2454 ±
Замечаний: 0% ±

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


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

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

Excel 2010
Можно и так

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
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 168
Репутация: 57 ±
Замечаний: 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 из 11
Поиск:

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