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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2009, 22:45   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Помогите оптимизировать код

Вот код, он работает, но жутко мне не нравиться. Это код построчно заполняет таблицу, состоящую из объединенных ячеек из другой таблицы той же структуры, но без объединенных ячеек.
ИОМЗ_всего - общее число строк.
x_tab - номер строки, в которую вносим данные.
rc - переменная для временного хранения информации.
n -переменная цикла
Как его можно оптимизировать:

With Workbooks(Документ).Worksheets(tab_ name)
For n = 1 To ИОМЗ_всего
Workbooks(Документ).Worksheets("Исх .данные").Activate
Range("ИОМЗ_начало").Select
rc = ActiveCell.Offset(0, 0).Cells(n, 0).Value
.Activate
.Cells(x_tab, 1) = rc 'Порядковый номер ОМЗ
Workbooks(Документ).Worksheets("Исх .данные").Activate
Range("ИОМЗ_начало").Select
rc = ActiveCell.Offset(0, 0).Cells(n, 1).Value
.Activate
.Cells(x_tab, 3) = rc 'Имя ОМЗ
Workbooks(Документ).Worksheets("Исх .данные").Activate
Range("ИОМЗ_начало").Select
rc = ActiveCell.Offset(0, 0).Cells(n, 2).Value
.Activate
.Cells(x_tab, 17) = rc 'Класс геод.сети
Workbooks(Документ).Worksheets("Исх .данные").Activate
Range("ИОМЗ_начало").Select
rc = ActiveCell.Offset(0, 0).Cells(n, 3).Value
.Activate
.Cells(x_tab, 24) = rc 'Координата X
Workbooks(Документ).Worksheets("Исх .данные").Activate
Range("ИОМЗ_начало").Select
rc = ActiveCell.Offset(0, 0).Cells(n, 4).Value
.Activate
.Cells(x_tab, 29) = rc 'Координата Y
x_tab = x_tab + 1
Next n
End With
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 10.02.2009, 03:17   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Как его можно оптимизировать
В следующий раз пишите код сразу как надо, а если надумаете его оптимизировать, то прикрепляйте к сообщению исходный файл.

Цитата:
он работает, но жутко мне не нравиться
Мне он тоже жутко не нравится.
Особенно не нравится разбираться в коде без примера файла...

Не надо использовать конструкции типа ActiveCell.Offset(0, 0).Cells(n, 0).Value

Во-первых, непонятно, зачем тут .Offset(0, 0)?

Во-вторых, почему в Cells(n, 0) последняя координата =0 ?
Получается, данные берутся, начиная не с первой ячейки диапазона Range("ИОМЗ_начало"), а с предыдущей...

Ещё раз повторю (ранее уже объяснял) - не надо использовать в коде методы .Activate и .Select

Вот Ваш код:
Код:
Sub test2()
    Dim Шаблон As Worksheet: Set Шаблон = Workbooks(Документ).Worksheets(tab_name)
    Dim Данные As Worksheet: Set Данные = Workbooks(Документ).Worksheets("Исх.данные")
    Dim ИОМЗ As Range: x_tab = 1 ' не забываем задавать начальное значение x_tab' 

    With Шаблон
        For n = 1 To ИОМЗ_всего
            Set ИОМЗ = Данные.Range("ИОМЗ_начало").Cells(1).Offset(n - 1, -1)
            .Cells(x_tab, 1) = ИОМЗ    'Порядковый номер ОМЗ'
            .Cells(x_tab, 3) = ИОМЗ.Offset(1)    'Имя ОМЗ'
            .Cells(x_tab, 17) = ИОМЗ.Offset(2)    'Класс геод.сети'
            .Cells(x_tab, 24) = ИОМЗ.Offset(3)    'Координата X'
            .Cells(x_tab, 29) = ИОМЗ.Offset(4)    'Координата Y'
            x_tab = x_tab + 1
        Next n
    End With
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 11.02.2009, 23:24   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Спасибо, за наводку. Заработало вот в каком виде.

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вот Ваш код:
Sub test2()
Dim Шаблон As Worksheet: Set Шаблон = Workbooks(Документ).Worksheets(tab_ name)
Dim Данные As Worksheet: Set Данные = Workbooks(Документ).Worksheets("Исх .данные")
Dim rc As Range: x_tab = 1 ' не забываем задавать начальное значение x_tab'
Код:
   With Шаблон
      For n = 1 To Evaluate(Names("ИОМЗ_всего").Value)
         Set rc = Данные.Range("ИОМЗ_начало").Cells(0).Offset(n, -1)
         .Cells(x_tab, 1) = rc                   'Порядковый номер ОМЗ.
         .Cells(x_tab, 3) = rc.Offset(0, 1)      'Имя ОМЗ.
         .Cells(x_tab, 17) = rc.Offset(0, 2)     'Класс геод.сети.
         .Cells(x_tab, 24) = rc.Offset(0, 3)     'Координата X.
         .Cells(x_tab, 29) = rc.Offset(0, 4)     'Координата Y.
         x_tab = x_tab + 1
      Next n
   End With
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Помогите оптимизировать! Altera Общие вопросы Delphi 6 25.03.2008 20:09
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57
Помогите оптимизировать HTML код после Publisher Гербера HTML и CSS 16 03.12.2007 11:46
Помогите оптимизировать сайт Nadejda HTML и CSS 4 07.01.2007 21:04