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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2015, 23:47   #1
diop
Пользователь
 
Регистрация: 09.01.2015
Сообщений: 26
По умолчанию Организация цикла (оптимизировать код)

Здраствуйте.

Помогите преобразовать набор команд в цыкл, если это возможно.
Код:
'1
     [G9:J36].Value = GetObject(f).Worksheets(1).[G9:J36].Value
     [G38:J41].Value = GetObject(f).Worksheets(1).[G38:J41].Value
     [G45:J67].Value = GetObject(f).Worksheets(1).[G45:J67].Value
     [G71:J110].Value = GetObject(f).Worksheets(1).[G71:J110].Value
'2
     [L9:O36].Value = GetObject(f).Worksheets(1).[L9:O36].Value
     [L38:O41].Value = GetObject(f).Worksheets(1).[L38:O41].Value
     [L45:O67].Value = GetObject(f).Worksheets(1).[L45:O67].Value
     [L71:O110].Value = GetObject(f).Worksheets(1).[L71:O110].Value
'3
     [Q9:T36].Value = GetObject(f).Worksheets(1).[Q9:T36].Value
     [Q38:T41].Value = GetObject(f).Worksheets(1).[Q38:T41].Value
     [Q45:T67].Value = GetObject(f).Worksheets(1).[Q45:T67].Value
     [Q71:T110].Value = GetObject(f).Worksheets(1).[Q71:T110].Value
'4
     [V9:Y36].Value = GetObject(f).Worksheets(1).[V9:Y36].Value
     [V38:Y41].Value = GetObject(f).Worksheets(1).[V38:Y41].Value
     [V45:Y67].Value = GetObject(f).Worksheets(1).[V45:Y67].Value
     [V71:Y110].Value = GetObject(f).Worksheets(1).[V71:Y110].Value
'5
     [AA9:AD36].Value = GetObject(f).Worksheets(1).[AA9:AD36].Value
     [AA38:AD41].Value = GetObject(f).Worksheets(1).[AA38:AD41].Value
     [AA45:AD67].Value = GetObject(f).Worksheets(1).[AA45:AD67].Value
     [AA71:AD110].Value = GetObject(f).Worksheets(1).[AA71:AD110].Value
'6
     [AF9:AI36].Value = GetObject(f).Worksheets(1).[AF9:AI36].Value
     [AF38:AI41].Value = GetObject(f).Worksheets(1).[AF38:AI41].Value
     [AF45:AI67].Value = GetObject(f).Worksheets(1).[AF45:AI67].Value
     [AF71:AI110].Value = GetObject(f).Worksheets(1).[AF71:AI110].Value
'7
     [AK9:AN36].Value = GetObject(f).Worksheets(1).[AK9:AN36].Value
     [AK38:AN41].Value = GetObject(f).Worksheets(1).[AK38:AN41].Value
     [AK45:AN67].Value = GetObject(f).Worksheets(1).[AK45:AN67].Value
     [AK71:AN110].Value = GetObject(f).Worksheets(1).[AK71:AN110].Value
'8
     [AP9:AS36].Value = GetObject(f).Worksheets(1).[AP9:AS36].Value
     [AP38:AS41].Value = GetObject(f).Worksheets(1).[AP38:AS41].Value
     [AP45:AS67].Value = GetObject(f).Worksheets(1).[AP45:AS67].Value
     [AP71:AS110].Value = GetObject(f).Worksheets(1).[AP71:AS110].Value
'9
     [AU9:AX36].Value = GetObject(f).Worksheets(1).[AU9:AX36].Value
     [AU38:AX41].Value = GetObject(f).Worksheets(1).[AU38:AX41].Value
     [AU45:AX67].Value = GetObject(f).Worksheets(1).[AU45:AX67].Value
     [AU71:AX110].Value = GetObject(f).Worksheets(1).[AU71:AX110].Value

Последний раз редактировалось Stilet; 05.06.2015 в 07:17.
diop вне форума Ответить с цитированием
Старый 05.06.2015, 00:08   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

В каждой группе 1-9 копируется диапазон из 4 столбцов, за исключением строк 37, 42-44, 68-70. На текущем листе в них что-то есть, что нельзя затирать?
Аналогично со столбцами K, P, ...
Было бы проще и быстрее скопировать один большой диапазон, а потом очистить упомянутые строки и столбцы.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 05.06.2015, 00:16   #3
diop
Пользователь
 
Регистрация: 09.01.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
В каждой группе 1-9 копируется диапазон из 4 столбцов, за исключением строк 37, 42-44, 68-70. На текущем листе в них что-то есть, что нельзя затирать?
Аналогично со столбцами K, P, ...
Было бы проще и быстрее скопировать один большой диапазон, а потом очистить упомянутые строки и столбцы.
в других ячейках, которые не копируются, есть формулы

Последний раз редактировалось diop; 05.06.2015 в 00:20.
diop вне форума Ответить с цитированием
Старый 05.06.2015, 00:22   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Тогда так
Код:
Dim i As Long
With GetObject(f).Worksheets(1)
  For i = 0 To 40 Step 5
    [G9:J36].Offset(, i).Value = .[G9:J36].Offset(, i).Value
    [G38:J41].Offset(, i).Value = .[G38:J41].Offset(, i).Value
    [G45:J67].Offset(, i).Value = .[G45:J67].Offset(, i).Value
    [G71:J110].Offset(, i).Value = .[G71:J110].Offset(, i).Value
  Next
End With
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 05.06.2015, 00:27   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Вариант:
Код:
    Dim r1 As Range, r2 As Range, r3 As Range, r4 As Range, sh As Worksheet, i&

    Set r1 = [G9:J36]
    Set r2 = [G38:J41]
    Set r3 = [G45:J67]
    Set r4 = [G71:J110]

    Set sh = GetObject(f).Worksheets(1)

    For i = 1 To 9
        r1.Value = sh.Range(r1.Address).Value
        r2.Value = sh.Range(r2.Address).Value
        r3.Value = sh.Range(r3.Address).Value
        r4.Value = sh.Range(r4.Address).Value
        Set r1 = r1.Offset(, 5)
        Set r2 = r2.Offset(, 5)
        Set r3 = r3.Offset(, 5)
        Set r4 = r4.Offset(, 5)
    Next

    sh.Parent.Close 0    'если нужно
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 05.06.2015, 00:51   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub GetSameCells()
  Dim n As Long
  For n = 1 To 9
    Cells(9, 2 + 5 * n).Resize(28, 4).Value = GetObject(f).Worksheets(1).Cells(9, 2 + 5 * n).Resize(28, 4).Value
    Cells(38, 2 + 5 * n).Resize(4, 4).Value = GetObject(f).Worksheets(1).Cells(38, 2 + 5 * n).Resize(4, 4).Value
    Cells(46, 2 + 5 * n).Resize(22, 4).Value = GetObject(f).Worksheets(1).Cells(46, 2 + 5 * n).Resize(22, 4).Value
    Cells(71, 2 + 5 * n).Resize(40, 4).Value = GetObject(f).Worksheets(1).Cells(71, 2 + 5 * n).Resize(40, 4).Value
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.06.2015 в 00:53.
IgorGO вне форума Ответить с цитированием
Старый 05.06.2015, 10:11   #7
diop
Пользователь
 
Регистрация: 09.01.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
Sub GetSameCells()
  Dim n As Long
  For n = 1 To 9
    Cells(9, 2 + 5 * n).Resize(28, 4).Value = GetObject(f).Worksheets(1).Cells(9, 2 + 5 * n).Resize(28, 4).Value
    Cells(38, 2 + 5 * n).Resize(4, 4).Value = GetObject(f).Worksheets(1).Cells(38, 2 + 5 * n).Resize(4, 4).Value
    Cells(46, 2 + 5 * n).Resize(22, 4).Value = GetObject(f).Worksheets(1).Cells(46, 2 + 5 * n).Resize(22, 4).Value
    Cells(71, 2 + 5 * n).Resize(40, 4).Value = GetObject(f).Worksheets(1).Cells(71, 2 + 5 * n).Resize(40, 4).Value
  Next
End Sub
большое спасиба. отличное решение задачи.
diop вне форума Ответить с цитированием
Старый 05.06.2015, 10:46   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Мне больше нравится с одним GetObject(f), а не с 36.
Хотя есть ли практическая разница - точно не знаю, но кажется что должна быть...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 05.06.2015, 12:05   #9
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

сначала желательно решить - вам цикл нужен или код оптимизировать?

вообще-то смысла делать цикл особенного нет - слишком мало данных
я понимаю, если бы несколько тысяч(пусть десятков) строк было..
может быть красивее? или чуть проще изменения вносить...
единственное оптимизируещее действие - это один раз объект получить, да и то цикла не требует..
slan вне форума Ответить с цитированием
Старый 05.06.2015, 12:08   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

или так:
Код:
Sub GetSameCells()
  Dim i As Long, j As Long, s, ard As String
  s = Split("9 38 46 71 28 4 22 40")
  With GetObject(f).Worksheets(1)
    For i = 1 To 9
      For j = 0 To 3
        adr = Cells(s(j), 2 + 5 * i).Resize(s(4 + j), 4).Address:   Range(adr).Value = .Range(adr).Value
      Next
    Next
  End With
End Sub
уйдем от прозрачно понятного кода в сторону арифметических абстакций
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.06.2015 в 12:12.
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация цикла лесяя Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.06.2011 00:00
Организация цикла If ... else 4e4en JavaScript, Ajax 5 07.11.2010 21:30
Организация цикла While Ra88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 29.09.2010 09:11
Организация цикла DartDayring Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 21.03.2010 12:58
Организация цикла mephist Microsoft Office Excel 2 17.07.2009 16:27