Всем привет. Вот такое дело. Имеется две таблице(на двух разный листах) в одной книге, нужно идти по каждой строке первой таблице брать из нее необходимые данные, затем обращаться ко второй таблице и построчно находить нужные данные в ней, затем возвращаться к 1-й таблице и вставлять туда взятые из втрой данные.
Я написал макрос который так и делает. Однако когда из цикла по первой таблице я вызываю функцию для второй программа падает. Причем падает через некоторое время из того что я от страницы к странице обращаюсь вот таким способом.Worksheets("Таблица1").Activate и Worksheets("Таблица2").Activate
вот пример первого цикла (для таблицы1 )
Code
While schet_plat < KonT
Worksheets("Таблица").Activate
KolD = KolDog(schet_plat, KonT) INN = Cells(schet_plat, 3)
при вызове функции BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED) прога падает (если эту фукцию убрать из цикла программа нормально работает)
Code
While i < 100 Worksheets("Таблица2").Activate Worksheets("Таблица1").Activate i=i+1 Wend
ПОЧЕМУ ТАКОЕ МОЖЕТ ПРОИСХОДИТЬ????????? И МОЖНО ЛИ ОБРАЩАТЬСЯ К ДРУГОЙ СТРАНИЦЕ КНИГИ(для взятия данный), НО ЧТО БЫ ЭТО ПЕРЕКЛЮЧЕНИЕ НЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ???
Всем привет. Вот такое дело. Имеется две таблице(на двух разный листах) в одной книге, нужно идти по каждой строке первой таблице брать из нее необходимые данные, затем обращаться ко второй таблице и построчно находить нужные данные в ней, затем возвращаться к 1-й таблице и вставлять туда взятые из втрой данные.
Я написал макрос который так и делает. Однако когда из цикла по первой таблице я вызываю функцию для второй программа падает. Причем падает через некоторое время из того что я от страницы к странице обращаюсь вот таким способом.Worksheets("Таблица1").Activate и Worksheets("Таблица2").Activate
вот пример первого цикла (для таблицы1 )
Code
While schet_plat < KonT
Worksheets("Таблица").Activate
KolD = KolDog(schet_plat, KonT) INN = Cells(schet_plat, 3)
при вызове функции BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED) прога падает (если эту фукцию убрать из цикла программа нормально работает)
Code
While i < 100 Worksheets("Таблица2").Activate Worksheets("Таблица1").Activate i=i+1 Wend
ПОЧЕМУ ТАКОЕ МОЖЕТ ПРОИСХОДИТЬ????????? И МОЖНО ЛИ ОБРАЩАТЬСЯ К ДРУГОЙ СТРАНИЦЕ КНИГИ(для взятия данный), НО ЧТО БЫ ЭТО ПЕРЕКЛЮЧЕНИЕ НЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ???
' .Range(.Cells(i_dog, 6), .Cells(i_dog, 6)).Select 'а это зачем? В этом варианте не работает, отключил
Loop While i_dog < KolD + schet_plat
schet_plat = schet_plat + KolD Wend
End With
Так будет обращение к другому листу без отображения на экране, но без отключения отображения. И главное - быстрее. Вообще - собственно активация листов и ячеек практически никогда не нужна (мне казалось, что в одном случае не обойтись, но оказалось, что и там всё работает без активации). Во только непонятно, зачем строка Range(Cells(i_dog, 6), Cells(i_dog, 6)).Select - это без активации действительно работать не будет. И ещё - я бы всюду, где у Вас Cells(*, *) дописал .Value, т.е Cells(*, *).Value Хоть значение по умолчанию Value но лучше явно указать. Иногда кстати может быть нужно значение Text - например, если в обоих сравниваемых ячейках Вы видите 1,25, а их Value на самом деле округлённые 1,254 и 1,246. Тоже самое с датами - значения могут отличаться на минуты, но для Вас нужно сравнение видимых в ячейках дат.
А зачем собственно активировать? Може так попробуете:
Code
With Worksheets("Таблица")
While schet_plat < KonT
KolD = KolDog(schet_plat, KonT) INN = .Cells(schet_plat, 3)
' .Range(.Cells(i_dog, 6), .Cells(i_dog, 6)).Select 'а это зачем? В этом варианте не работает, отключил
Loop While i_dog < KolD + schet_plat
schet_plat = schet_plat + KolD Wend
End With
Так будет обращение к другому листу без отображения на экране, но без отключения отображения. И главное - быстрее. Вообще - собственно активация листов и ячеек практически никогда не нужна (мне казалось, что в одном случае не обойтись, но оказалось, что и там всё работает без активации). Во только непонятно, зачем строка Range(Cells(i_dog, 6), Cells(i_dog, 6)).Select - это без активации действительно работать не будет. И ещё - я бы всюду, где у Вас Cells(*, *) дописал .Value, т.е Cells(*, *).Value Хоть значение по умолчанию Value но лучше явно указать. Иногда кстати может быть нужно значение Text - например, если в обоих сравниваемых ячейках Вы видите 1,25, а их Value на самом деле округлённые 1,254 и 1,246. Тоже самое с датами - значения могут отличаться на минуты, но для Вас нужно сравнение видимых в ячейках дат.Hugo
Ребята, огромно спасибо!!! Очень полезные советы) И еще это конечно не важно, но я этот макрос таки дописал....все работает - УРЯЯЯЯ))))) Еще раз спасибо!!)
Ребята, огромно спасибо!!! Очень полезные советы) И еще это конечно не важно, но я этот макрос таки дописал....все работает - УРЯЯЯЯ))))) Еще раз спасибо!!)Michelangelo