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

Вход

Регистрация

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

 

= Мир MS Excel/Оператор Is Nothing Then - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оператор Is Nothing Then (Макросы/Sub)
Оператор Is Nothing Then
Elhust Дата: Пятница, 14.04.2017, 08:15 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
Доброго времени суток уважаемые гуру и просто знающие специалисты excel.
долго рылся в поиске ответа и ума не приложу почему так, есть макрос у меня использует метод find по какой то причине он не работает без оператора ( If Not @некое значение@ Is Nothing Then )
[vba]
Код

Sub tt()
Dim sh As Worksheet, wsDataSheet As Object, lLastrow As Long
Dim iCell As Range, iCell1 As Range, i As Long, iCell2 As Range, iCell3 As Range
Dim iSearchText$, iSearchText1$
'-------------------------------------------------------------------------------------------------------
iSearchText$ = "Номер один*"
iSearchText1$ = "Номер Два"
Set wsDataSheet = ActiveWorkbook.Sheets("Вывод")
'-------------------------------------------------------------------------------------------------------
lLastrow = wsDataSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each sh In Worksheets
If sh.Name = wsDataSheet.Name Then GoTo Point
'-------------------------------------------------------------------------------------------------------
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
'-------------------------------------------------------------------------------------------------------
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
'-------------------------------------------------------------------------------------------------------
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1
End If
'-------------------------------------------------------------------------------------------------------
Point:
Next sh

End Sub
[/vba]

без него вылезает ошибка 91
просто хочу понять и прошу мне такому не догоняющему объяснить...чтобы применять с умом


Каждый сам выбирает правила игры
 
Ответить
СообщениеДоброго времени суток уважаемые гуру и просто знающие специалисты excel.
долго рылся в поиске ответа и ума не приложу почему так, есть макрос у меня использует метод find по какой то причине он не работает без оператора ( If Not @некое значение@ Is Nothing Then )
[vba]
Код

Sub tt()
Dim sh As Worksheet, wsDataSheet As Object, lLastrow As Long
Dim iCell As Range, iCell1 As Range, i As Long, iCell2 As Range, iCell3 As Range
Dim iSearchText$, iSearchText1$
'-------------------------------------------------------------------------------------------------------
iSearchText$ = "Номер один*"
iSearchText1$ = "Номер Два"
Set wsDataSheet = ActiveWorkbook.Sheets("Вывод")
'-------------------------------------------------------------------------------------------------------
lLastrow = wsDataSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
For Each sh In Worksheets
If sh.Name = wsDataSheet.Name Then GoTo Point
'-------------------------------------------------------------------------------------------------------
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
'-------------------------------------------------------------------------------------------------------
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
'-------------------------------------------------------------------------------------------------------
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1
End If
'-------------------------------------------------------------------------------------------------------
Point:
Next sh

End Sub
[/vba]

без него вылезает ошибка 91
просто хочу понять и прошу мне такому не догоняющему объяснить...чтобы применять с умом

Автор - Elhust
Дата добавления - 14.04.2017 в 08:15
and_evg Дата: Пятница, 14.04.2017, 08:20 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
[vba]
Код
If Not iCell Is Nothing Then
[/vba]
"Если iCell не ничего", другими словами если нашлась хотя бы одна ячейка
 
Ответить
Сообщение[vba]
Код
If Not iCell Is Nothing Then
[/vba]
"Если iCell не ничего", другими словами если нашлась хотя бы одна ячейка

Автор - and_evg
Дата добавления - 14.04.2017 в 08:20
Elhust Дата: Пятница, 14.04.2017, 08:31 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
and_evg, тогда почему без этого не работает .. может метод Find должен обязательно находить а если не находит то ошибка ... не сходиться что то по моему


Каждый сам выбирает правила игры
 
Ответить
Сообщениеand_evg, тогда почему без этого не работает .. может метод Find должен обязательно находить а если не находит то ошибка ... не сходиться что то по моему

Автор - Elhust
Дата добавления - 14.04.2017 в 08:31
and_evg Дата: Пятница, 14.04.2017, 08:38 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
ну без файла сложно понять где и на какой строке данная ошибка вылетает
 
Ответить
Сообщениену без файла сложно понять где и на какой строке данная ошибка вылетает

Автор - and_evg
Дата добавления - 14.04.2017 в 08:38
RAN Дата: Пятница, 14.04.2017, 08:46 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
При чем тут Find? Он честно находит "ничего" (Nothing).
Ошибка возникает, когда вы пытаетесь передать в ячейку значение из ниоткуда.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПри чем тут Find? Он честно находит "ничего" (Nothing).
Ошибка возникает, когда вы пытаетесь передать в ячейку значение из ниоткуда.

Автор - RAN
Дата добавления - 14.04.2017 в 08:46
and_evg Дата: Пятница, 14.04.2017, 08:49 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
RAN, похоже верно... наверно на этой строке
[vba]
Код
wsDataSheet.Cells(lLastrow, 1).Value = iCell
[/vba]
 
Ответить
СообщениеRAN, похоже верно... наверно на этой строке
[vba]
Код
wsDataSheet.Cells(lLastrow, 1).Value = iCell
[/vba]

Автор - and_evg
Дата добавления - 14.04.2017 в 08:49
Kuzmich Дата: Пятница, 14.04.2017, 08:54 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 712
Репутация: 156 ±
Замечаний: 0% ±

Excel 2003
Цитата
может метод Find должен обязательно находить а если не находит

[vba]
Код
If Not iCell Is Nothing Then
   'действия, если нашли
Else
   Msgbox "В диапазоне нет значения: " & iSearchText
End if
[/vba]
 
Ответить
Сообщение
Цитата
может метод Find должен обязательно находить а если не находит

[vba]
Код
If Not iCell Is Nothing Then
   'действия, если нашли
Else
   Msgbox "В диапазоне нет значения: " & iSearchText
End if
[/vba]

Автор - Kuzmich
Дата добавления - 14.04.2017 в 08:54
Elhust Дата: Пятница, 14.04.2017, 09:26 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
RAN,
Вот файл
Макрос tt
К сообщению приложен файл: Test.xls (55.5 Kb)


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Пятница, 14.04.2017, 09:27
 
Ответить
СообщениеRAN,
Вот файл
Макрос tt

Автор - Elhust
Дата добавления - 14.04.2017 в 09:26
_Boroda_ Дата: Пятница, 14.04.2017, 10:15 | Сообщение № 9
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Вот смотрите - стираем на Лист1 "Номер два" в ячейке В2, получаем в строке
[vba]
Код
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
[/vba]что переменная iCell стала как бы ячейкой B1, а в строке
[vba]
Код
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
[/vba]мы бы тоже хотели сказать, что переменная iCell1 - это какая-то ячейка (которая должна была найтись методом Find), но, поскольку мы стерли ячейку В2 и не смогли найти поиском значение iSearchText1, то переменной iCell1 не присваивается никакая ячейка. И все бы ничего, но в следующем блоке кода
[vba]
Код
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
[/vba]мы пытаемся сместиться от этой никакой ячейки на 1 вниз и на 3 вправо. А поскольку у нас не определена начальная ячейка, то и смещаться получается неоткуда. Отсюда и ошибка


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВот смотрите - стираем на Лист1 "Номер два" в ячейке В2, получаем в строке
[vba]
Код
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
[/vba]что переменная iCell стала как бы ячейкой B1, а в строке
[vba]
Код
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
[/vba]мы бы тоже хотели сказать, что переменная iCell1 - это какая-то ячейка (которая должна была найтись методом Find), но, поскольку мы стерли ячейку В2 и не смогли найти поиском значение iSearchText1, то переменной iCell1 не присваивается никакая ячейка. И все бы ничего, но в следующем блоке кода
[vba]
Код
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
[/vba]мы пытаемся сместиться от этой никакой ячейки на 1 вниз и на 3 вправо. А поскольку у нас не определена начальная ячейка, то и смещаться получается неоткуда. Отсюда и ошибка

Автор - _Boroda_
Дата добавления - 14.04.2017 в 10:15
Elhust Дата: Пятница, 14.04.2017, 13:15 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Благодарю теперь всё встало на свои места ! как всегда ларчик прост был надо было потестить ещё раз спасибо .. надо было файл с самого начала кинуть


Каждый сам выбирает правила игры
 
Ответить
Сообщение_Boroda_, Благодарю теперь всё встало на свои места ! как всегда ларчик прост был надо было потестить ещё раз спасибо .. надо было файл с самого начала кинуть

Автор - Elhust
Дата добавления - 14.04.2017 в 13:15
Elhust Дата: Понедельник, 17.04.2017, 08:22 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Прошу прощение, а какой оператор может проверить все значение за раз

[vba]
Код

' проверяется только одно значение а если сделать
'If Not iCell or iCell1 or iCell2 or iCell3  Is Nothing Then ' не работает (
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
End If
'-------------------------------------------------------------------------------------------------------
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1

[/vba]


Каждый сам выбирает правила игры
 
Ответить
Сообщение_Boroda_, Прошу прощение, а какой оператор может проверить все значение за раз

[vba]
Код

' проверяется только одно значение а если сделать
'If Not iCell or iCell1 or iCell2 or iCell3  Is Nothing Then ' не работает (
If Not iCell Is Nothing Then
Set iCell = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 6)
Set iCell1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(1, 3)
Set iCell2 = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
Set iCell3 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1)
End If
'-------------------------------------------------------------------------------------------------------
wsDataSheet.Cells(lLastrow, 1).Value = iCell
wsDataSheet.Cells(lLastrow, 2).Value = iCell1
wsDataSheet.Cells(lLastrow, 3).Value = iCell2
wsDataSheet.Cells(lLastrow, 4).Value = iCell3
lLastrow = lLastrow + 1

[/vba]

Автор - Elhust
Дата добавления - 17.04.2017 в 08:22
RAN Дата: Понедельник, 17.04.2017, 09:04 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Все тот-же :D
[vba]
Код
Set iFind = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iFind1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
If Not iFind Is Nothing Then
Set iCell = iFind.Offset(1, 6)
Set iCell2 = iFind.Offset(0, 1)
End If
If Not iFind1 Is Nothing Then
Set iCell1 =iFind1.Offset(1, 3)
Set iCell3 = iFind1.Offset(0, 1)
End If
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеВсе тот-же :D
[vba]
Код
Set iFind = sh.UsedRange.Find(What:=iSearchText$, LookIn:=xlValues, LookAt:=xlWhole)
Set iFind1 = sh.UsedRange.Find(What:=iSearchText1$, LookIn:=xlValues, LookAt:=xlWhole)
If Not iFind Is Nothing Then
Set iCell = iFind.Offset(1, 6)
Set iCell2 = iFind.Offset(0, 1)
End If
If Not iFind1 Is Nothing Then
Set iCell1 =iFind1.Offset(1, 3)
Set iCell3 = iFind1.Offset(0, 1)
End If
[/vba]

Автор - RAN
Дата добавления - 17.04.2017 в 09:04
_Boroda_ Дата: Понедельник, 17.04.2017, 09:08 | Сообщение № 13
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Примерно так
[vba]
Код
If Not iCell Is Nothing and Not iCell1 Is Nothing and Not iCell2 Is Nothing and Not iCell3 Is Nothing Then
[/vba]
В макросе не проверял, но, думаю, смысл понятен - нужно написать условие для каждой переменной
ЕСЛИ А не пусто и В не пусто и С...

Это если Вам нужно выполнять последующий код только при том условии, что ВСЕ значения нормальные. А если для каждого, то выше Андрей написал уже


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПримерно так
[vba]
Код
If Not iCell Is Nothing and Not iCell1 Is Nothing and Not iCell2 Is Nothing and Not iCell3 Is Nothing Then
[/vba]
В макросе не проверял, но, думаю, смысл понятен - нужно написать условие для каждой переменной
ЕСЛИ А не пусто и В не пусто и С...

Это если Вам нужно выполнять последующий код только при том условии, что ВСЕ значения нормальные. А если для каждого, то выше Андрей написал уже

Автор - _Boroda_
Дата добавления - 17.04.2017 в 09:08
Elhust Дата: Понедельник, 17.04.2017, 10:16 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, RAN, Благодарность вам добрые люди, а то я что то в тупик пришел .. в итоге пока ждал ответ решил просто "on error resume next" но это не дело хотя если не находит то ячейка просто пустая вставляется или если точнее не изменяется как я понимаю ,, но тем не менее благодарю и делюсь своим решением
А у меня тут по ходу ещё вопрос появился сейчас тему только новую создам


Каждый сам выбирает правила игры
 
Ответить
Сообщение_Boroda_, RAN, Благодарность вам добрые люди, а то я что то в тупик пришел .. в итоге пока ждал ответ решил просто "on error resume next" но это не дело хотя если не находит то ячейка просто пустая вставляется или если точнее не изменяется как я понимаю ,, но тем не менее благодарю и делюсь своим решением
А у меня тут по ходу ещё вопрос появился сейчас тему только новую создам

Автор - Elhust
Дата добавления - 17.04.2017 в 10:16
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оператор Is Nothing Then (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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