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

Вход

Регистрация

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

 

= Мир MS Excel/Работа со страницами - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Работа со страницами
Работа со страницами
Michelangelo Дата: Суббота, 12.03.2011, 01:05 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Всем привет.
Вот такое дело. Имеется две таблице(на двух разный листах) в одной книге, нужно идти по каждой строке первой таблице брать из нее необходимые данные, затем обращаться ко второй таблице и построчно находить нужные данные в ней, затем возвращаться к 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)
          
         i_dog = schet_plat
             'счетчик по договорам плательщика
             Do
                 NomerIT = Cells(i_dog, 7)
                 DataIT = Cells(i_dog, 8)
                 SumVTek = 0
                 i_kolplat = KolPlatDog(i_dog)
                  
                 BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED)
                  
                 i_dog = i_dog + i_kolplat
                  
                 Range(Cells(i_dog, 6), Cells(i_dog, 6)).Select
                  
             Loop While i_dog < KolD + schet_plat
              
         schet_plat = schet_plat + KolD
     Wend

при вызове функции 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)
          
         i_dog = schet_plat
             'счетчик по договорам плательщика
             Do
                 NomerIT = Cells(i_dog, 7)
                 DataIT = Cells(i_dog, 8)
                 SumVTek = 0
                 i_kolplat = KolPlatDog(i_dog)
                  
                 BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED)
                  
                 i_dog = i_dog + i_kolplat
                  
                 Range(Cells(i_dog, 6), Cells(i_dog, 6)).Select
                  
             Loop While i_dog < KolD + schet_plat
              
         schet_plat = schet_plat + KolD
     Wend

при вызове функции 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

ПОЧЕМУ ТАКОЕ МОЖЕТ ПРОИСХОДИТЬ?????????
И МОЖНО ЛИ ОБРАЩАТЬСЯ К ДРУГОЙ СТРАНИЦЕ КНИГИ(для взятия данный), НО ЧТО БЫ ЭТО ПЕРЕКЛЮЧЕНИЕ НЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ???


Автор - Michelangelo
Дата добавления - 12.03.2011 в 01:05
Serge_007 Дата: Суббота, 12.03.2011, 15:29 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Michelangelo)
МОЖНО ЛИ ОБРАЩАТЬСЯ К ДРУГОЙ СТРАНИЦЕ КНИГИ(для взятия данный), НО ЧТО БЫ ЭТО ПЕРЕКЛЮЧЕНИЕ НЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ?

Можно.
Application.ScreenUpdating = False - перед кодом
Application.ScreenUpdating = True - после.


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Michelangelo)
МОЖНО ЛИ ОБРАЩАТЬСЯ К ДРУГОЙ СТРАНИЦЕ КНИГИ(для взятия данный), НО ЧТО БЫ ЭТО ПЕРЕКЛЮЧЕНИЕ НЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ?

Можно.
Application.ScreenUpdating = False - перед кодом
Application.ScreenUpdating = True - после.

Автор - Serge_007
Дата добавления - 12.03.2011 в 15:29
Hugo Дата: Суббота, 12.03.2011, 22:10 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
А зачем собственно активировать? Може так попробуете:

Code
With Worksheets("Таблица")
                      
While schet_plat < KonT
                      
                KolD = KolDog(schet_plat, KonT)
                INN = .Cells(schet_plat, 3)
                        
                i_dog = schet_plat
                    'счетчик по договорам плательщика
                    Do
                        NomerIT = .Cells(i_dog, 7)
                        DataIT = .Cells(i_dog, 8)
                        SumVTek = 0
                        i_kolplat = KolPlatDog(i_dog)
                      
                        BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED)
                      
                        i_dog = i_dog + i_kolplat
                      
                       ' .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.
Тоже самое с датами - значения могут отличаться на минуты, но для Вас нужно сравнение видимых в ячейках дат.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеА зачем собственно активировать? Може так попробуете:

Code
With Worksheets("Таблица")
                      
While schet_plat < KonT
                      
                KolD = KolDog(schet_plat, KonT)
                INN = .Cells(schet_plat, 3)
                        
                i_dog = schet_plat
                    'счетчик по договорам плательщика
                    Do
                        NomerIT = .Cells(i_dog, 7)
                        DataIT = .Cells(i_dog, 8)
                        SumVTek = 0
                        i_kolplat = KolPlatDog(i_dog)
                      
                        BUF = InsertTabl(INN, NomerIT, DataIT, SumVTek, i_dog, i_kolplat, KonTSED)
                      
                        i_dog = i_dog + i_kolplat
                      
                       ' .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
Дата добавления - 12.03.2011 в 22:10
Michelangelo Дата: Вторник, 15.03.2011, 02:09 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Ребята, огромно спасибо!!!
Очень полезные советы)
И еще это конечно не важно, но я этот макрос таки дописал....все работает - УРЯЯЯЯ)))))
Еще раз спасибо!!)
 
Ответить
СообщениеРебята, огромно спасибо!!!
Очень полезные советы)
И еще это конечно не важно, но я этот макрос таки дописал....все работает - УРЯЯЯЯ)))))
Еще раз спасибо!!)

Автор - Michelangelo
Дата добавления - 15.03.2011 в 02:09
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Работа со страницами
  • Страница 1 из 1
  • 1
Поиск:

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