Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2010, 11:33   #1
Bogusgl
Пользователь
 
Регистрация: 03.08.2010
Сообщений: 22
По умолчанию VBA Код жутко тормазит, помогите разобраться...

Мне нужно собрать данные с более чем 100 листов в один лист.
Нашел и подредактировал такой код, но он жудко тормазит (комп виснет на 20-30 минут).
Кто знает, подскажите почему и что делать?
ПОМАГИТЕ ПЛИЗ!!!
(Сам я чайник !!!)

Код Visual Basic
Код HTML:
  Private Sub Worksheet_Activate()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
Debug.Print sh.Name
If sh.Index <> ThisWorkbook.ActiveSheet.Index Then
Cells(sh.Index+1, 1).Value = sh.Name
Cells(sh.Index+1, 2).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-1],""'"",""!$D$16""))"
Cells(sh.Index+1, 3).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-2],""'"",""!$D$17""))"
Cells(sh.Index+1, 4).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-3],""'"",""!$D$18""))"
Cells(sh.Index+1, 5).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-4],""'"",""!$D$19""))"
Cells(sh.Index+1, 6).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-5],""'"",""!$D$20""))"
Cells(sh.Index+1, 7).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-6],""'"",""!$D$21""))"
Cells(sh.Index+1, 8).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-7],""'"",""!$D$22""))"
Cells(sh.Index+1, 9).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-8],""'"",""!$C$4""))"
Cells(sh.Index+1, 10).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-9],""'"",""!$C$12""))"
Cells(sh.Index+1, 11).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-10],""'"",""!$C$16""))"
Cells(sh.Index+1, 12).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-11],""'"",""!$C$17""))"
Cells(sh.Index+1, 13).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-12],""'"",""!$C$18""))"
Cells(sh.Index+1, 14).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-13],""'"",""!$D$19""))"
Cells(sh.Index+1, 15).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-14],""'"",""!$D$20""))"
Cells(sh.Index+1, 16).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-15],""'"",""!$D$21""))"
Cells(sh.Index+1, 17).FormulaR1C1 = "=INDIRECT(CONCATENATE(""'"",RC[-16],""'"",""!$D$22""))"
End If
Next sh
End Sub 
Bogusgl вне форума Ответить с цитированием
Старый 03.08.2010, 12:22   #2
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

На листе нужно заполнить именно формулы или достаточно перенести значения из ячеек с других листов?
nilem вне форума Ответить с цитированием
Старый 03.08.2010, 13:08   #3
Bogusgl
Пользователь
 
Регистрация: 03.08.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
На листе нужно заполнить именно формулы или достаточно перенести значения из ячеек с других листов?
Нужно просто забрать и вставить на Лист1 значения из ячеек других листов (правда в тех листах в ячейках попадаются формулы.)
Bogusgl вне форума Ответить с цитированием
Старый 03.08.2010, 14:12   #4
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Ну, у меня 2 варианта - Крупский и Дэлчев.
Код:
Private Sub Worksheet_Activate()
Dim sh As Worksheet, i As Integer
Application.ScreenUpdating = False
For Each sh In ThisWorkbook.Worksheets
With sh
    If .Index <> ThisWorkbook.ActiveSheet.Index Then
        i = .Index + 1
        Cells(i, 1).Value = .Name
        Cells(i, 2).Value = .[D16]: Cells(i, 3).Value = .[D17]
        Cells(i, 4).Value = .[D18]: Cells(i, 5).Value = .[D19]
        Cells(i, 6).Value = .[D20]: Cells(i, 7).Value = .[D21]
        Cells(i, 8).Value = .[D22]: Cells(i, 9).Value = .[C4]
        Cells(i, 10).Value = .[C12]: Cells(i, 11).Value = .[C16]
        Cells(i, 12).Value = .[C17]: Cells(i, 13).Value = .[C18]
        Cells(i, 14).Value = .[D19]: Cells(i, 15).Value = .[D20]
        Cells(i, 16).Value = .[D21]: Cells(i, 17).Value = .[D22]
    End If
End With
Next sh
Application.ScreenUpdating = True
End Sub
и этот, наверное, лучше
Код:
Private Sub Worksheet_Activate()
Dim sh As Worksheet, i As Long, X(), rng As Range
i = 1
For Each sh In ThisWorkbook.Worksheets
With sh
    If .Index <> ThisWorkbook.ActiveSheet.Index Then
        ReDim Preserve X(1 To 17, 1 To i)
        X(1, i) = .Name: X(2, i) = .[D16]: X(3, i) = .[D17]: X(4, i) = .[D18]
        X(5, i) = .[D19]: X(6, i) = .[D20]: X(7, i) = .[D21]: X(8, i) = .[D22]
        X(9, i) = .[C4]: X(10, i) = .[C12]: X(11, i) = .[C16]: X(12, i) = .[C17]
        X(13, i) = .[C18]: X(14, i) = .[D19]: X(15, i) = .[D20]
        X(16, i) = .[D21]: X(17, i) = .[D22]: i = i + 1
    End If
End With
Next sh
Set rng = [A3].Resize(UBound(X, 2), 17)
rng.Value = WorksheetFunction.Transpose(X)
End Sub
Может, будет лучше назначить на кнопку?
nilem вне форума Ответить с цитированием
Старый 03.08.2010, 17:20   #5
Bogusgl
Пользователь
 
Регистрация: 03.08.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Может, будет лучше назначить на кнопку?
На кнопку... А пожалуй что и лучше...Ща попробую коды... )))
Спасибо!
Bogusgl вне форума Ответить с цитированием
Старый 03.08.2010, 17:30   #6
Bogusgl
Пользователь
 
Регистрация: 03.08.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Код:
Private Sub Worksheet_Activate()
Dim sh As Worksheet, i As Long, X(), rng As Range
i = 1
For Each sh In ThisWorkbook.Worksheets
With sh
    If .Index <> ThisWorkbook.ActiveSheet.Index Then
        ReDim Preserve X(1 To 17, 1 To i)
        X(1, i) = .Name: X(2, i) = .[D16]: X(3, i) = .[D17]: X(4, i) = .[D18]
        X(5, i) = .[D19]: X(6, i) = .[D20]: X(7, i) = .[D21]: X(8, i) = .[D22]
        X(9, i) = .[C4]: X(10, i) = .[C12]: X(11, i) = .[C16]: X(12, i) = .[C17]
        X(13, i) = .[C18]: X(14, i) = .[D19]: X(15, i) = .[D20]
        X(16, i) = .[D21]: X(17, i) = .[D22]: i = i + 1
    End If
End With
Next sh
Set rng = [A3].Resize(UBound(X, 2), 17)
rng.Value = WorksheetFunction.Transpose(X)
End Sub
не работает, говорит : Type mismatch (Error 13)
Bogusgl вне форума Ответить с цитированием
Старый 03.08.2010, 17:45   #7
Bogusgl
Пользователь
 
Регистрация: 03.08.2010
Сообщений: 22
По умолчанию

А первый код работает просто отлично!
Спасибо!
Посадил на кнопку, проверил - изЮмительно!
Bogusgl вне форума Ответить с цитированием
Старый 03.08.2010, 17:48   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Но второй должен работать намного быстрее.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.08.2010, 17:56   #9
аналитика
Форумчанин
 
Регистрация: 14.05.2009
Сообщений: 311
По умолчанию

у меня работает!
аналитика вне форума Ответить с цитированием
Старый 03.08.2010, 18:55   #10
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Цитата:
Сообщение от Bogusgl Посмотреть сообщение
не работает, говорит : Type mismatch (Error 13)
Будет очень жаль, если не заработает. Вот смотрите в моем файле - на первом листе зеленая кнопка.
Вложения
Тип файла: rar БогусГл.rar (17.8 Кб, 9 просмотров)
nilem вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блоковый код Хемминга в VBA Dju_Vava Microsoft Office Excel 1 10.12.2009 18:14
Есть код программы Сортировка строк в файле...помогите разобраться) defol-777 Общие вопросы C/C++ 8 29.09.2009 11:42
Жутко назойливый БАННЕР ! ! ! Fisk Безопасность, Шифрование 7 21.09.2009 17:24
Помогите разобраться в реализации поразрядной сортировки(код внутри) CooCkoo Помощь студентам 0 15.06.2009 23:52
не получается разобраться в коде ! разъясните пожалуйста! код внутри! Lion_paint Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2009 09:30