Доброго времени суток уважаемые гуру и просто знающие специалисты 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
and_evg, тогда почему без этого не работает .. может метод Find должен обязательно находить а если не находит то ошибка ... не сходиться что то по моему
and_evg, тогда почему без этого не работает .. может метод Find должен обязательно находить а если не находит то ошибка ... не сходиться что то по моемуElhust
Вот смотрите - стираем на Лист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 вправо. А поскольку у нас не определена начальная ячейка, то и смещаться получается неоткуда. Отсюда и ошибка
Вот смотрите - стираем на Лист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_
_Boroda_, Благодарю теперь всё встало на свои места ! как всегда ларчик прост был надо было потестить ещё раз спасибо .. надо было файл с самого начала кинуть
_Boroda_, Благодарю теперь всё встало на свои места ! как всегда ларчик прост был надо было потестить ещё раз спасибо .. надо было файл с самого начала кинутьElhust
_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
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]
Все тот-же [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
If Not iCell Is Nothing and Not iCell1 Is Nothing and Not iCell2 Is Nothing and Not iCell3 Is Nothing Then
[/vba] В макросе не проверял, но, думаю, смысл понятен - нужно написать условие для каждой переменной ЕСЛИ А не пусто и В не пусто и С...
Это если Вам нужно выполнять последующий код только при том условии, что ВСЕ значения нормальные. А если для каждого, то выше Андрей написал уже
Примерно так [vba]
Код
If Not iCell Is Nothing and Not iCell1 Is Nothing and Not iCell2 Is Nothing and Not iCell3 Is Nothing Then
[/vba] В макросе не проверял, но, думаю, смысл понятен - нужно написать условие для каждой переменной ЕСЛИ А не пусто и В не пусто и С...
Это если Вам нужно выполнять последующий код только при том условии, что ВСЕ значения нормальные. А если для каждого, то выше Андрей написал уже_Boroda_
_Boroda_, RAN, Благодарность вам добрые люди, а то я что то в тупик пришел .. в итоге пока ждал ответ решил просто "on error resume next" но это не дело хотя если не находит то ячейка просто пустая вставляется или если точнее не изменяется как я понимаю ,, но тем не менее благодарю и делюсь своим решением А у меня тут по ходу ещё вопрос появился сейчас тему только новую создам
_Boroda_, RAN, Благодарность вам добрые люди, а то я что то в тупик пришел .. в итоге пока ждал ответ решил просто "on error resume next" но это не дело хотя если не находит то ячейка просто пустая вставляется или если точнее не изменяется как я понимаю ,, но тем не менее благодарю и делюсь своим решением А у меня тут по ходу ещё вопрос появился сейчас тему только новую создам Elhust