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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 22:34   #1
А)-(дрей
Пользователь
 
Аватар для А)-(дрей
 
Регистрация: 28.02.2011
Сообщений: 42
По умолчанию Как оптимизировать?

Подскажите пожалуйста, как правильно оптимизировать код для ускорения подсчетов. Проблема такая - во вложении есть файл с написанным кодом для подсчета значений. Хотелось бы оптимизировать код для ускорения его работы (ведь количество строк данных может быть очень большое). Что именно хочу сделать - так это избавиться от заполнения листа промежуточными вычислениями (важны столбцы подсвеченные красным цветом). Хотел запихать все эти столбцы в массивы и дальше работать с ними внутри кода. Наткнулся на такую проблему, попробую наглядно изобразить. Пусть в A и B столбцах имеютя какие либо данные, тогда:
Код:
Sub запись_в_ячейки()
For i = 1 To 10
Cells(i + 1, 3) = "=MAX(RC[-3]:RC[-2])"
Next
End Sub
Sub запись_в_массив()
 Dim massiv(1 To 10)
 For i = 1 To 10
 massiv(i) = "=MAX(B(i+1):E(i+1)" ' как правильно записать?
 Next
End Sub
Можно ли как то принцип реализованный в коде "запись в ячейке" заменить на "запись в массив", ну или что то в этом роде? Я знаю что напиши я например massiv(i) = i - тут проблем не было бы, а когда хочу оформить значения массива значениями формул, не могу сформулировать
Вложения
Тип файла: rar файл обработки.rar (62.0 Кб, 15 просмотров)
А)-(дрей вне форума Ответить с цитированием
Старый 02.04.2011, 07:30   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
massiv(i) = "=MAX(B(i+1):E(i+1)" ' как правильно записать?
Формулу нужно формировать по всем правилам работы со строками. Например, так:
Код:
massiv(i) = "=MAX(B" & i + 1 & ":E" & i + 1 & ")"
Может проще все подсчитать внутри VBA, а на лист поместить только полученные значения (результирующий массив)? Тогда рабочий лист вообще не будет содержать формул. Или Ваша конечная задача - получить именно формулы в ячейках?
Так, например, для рассматриваемой строки:
Код:
massiv(i) = Application.Max(Range(Cells(i + 1, 2), Cells(i + 1, 5)))
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 02.04.2011 в 07:37.
SAS888 вне форума Ответить с цитированием
Старый 02.04.2011, 07:30   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

**********
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 02.04.2011, 07:51   #4
А)-(дрей
Пользователь
 
Аватар для А)-(дрей
 
Регистрация: 28.02.2011
Сообщений: 42
По умолчанию

Вот я и хочу в принципе посчитать все внутри VBA, просто изначально это был лист с формулами, по мере моего изучения VBA - появился этот код, теперь я уже понял, что не обязательно все расчеты вести на листах книги - поэтому и хочу оптимизировать код записав все промежуточные вычисления в массивы, проделав с ними внутри кода все операции и заполнив в итоге лист только теми данными, которые собственно и хотел получить.
Спасибо за приведенные примеры, я это и хотел узнать.
У меня еще один вопрос из кода:
Код:
    Range("F1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(C[-4],"">0"")"
    Data = Range("F1")
Когда я хочу подставить параметр Data в массив
Код:
Dim M6(1 To Data)
В этой строчке возникает ошибка, как от неё избавиться?


Спасибо, синтаксис именно такой, какой нужно было узнать.
А)-(дрей вне форума Ответить с цитированием
Старый 02.04.2011, 08:42   #5
А)-(дрей
Пользователь
 
Аватар для А)-(дрей
 
Регистрация: 28.02.2011
Сообщений: 42
По умолчанию

И еще вопрос
Код:
Dim M8(1 To 999)
    M8(i) = "=IF(G" & i + 1 & "=G" & i + 2 & ",1,0)"
    
    Dim M9(1 To 999)
    M9(i) = "=IF(G" & i + 1 & "=G" & i & ",1,0)"
    
    Dim M10(1 To 999)
    M10(i) = "=IF(M8(i)+M9(i)>0,1,0)" ' Можно ли так?
Можно ли в такой формуле подставить значения ранее вычесленных массивов, либо нужно пользоваться If.. then... else?

Последний раз редактировалось А)-(дрей; 02.04.2011 в 08:45.
А)-(дрей вне форума Ответить с цитированием
Старый 02.04.2011, 09:24   #6
А)-(дрей
Пользователь
 
Аватар для А)-(дрей
 
Регистрация: 28.02.2011
Сообщений: 42
По умолчанию

Понял... вообще не так делаю, массивы создаю с текстами формул, а не с их значениями. Последний пост тогда вообще смысла не имеет.
Нужно тогда пользоваться принципом
Код:
M7(i) = Application.Max(Range(Cells(i + 1, 2), Cells(i + 1, 5)))
только вот другие формулы я уже сам не запишу, например
Код:
M8(i) = Application.If(Range(Cells(i + 1, 7)) = Range(Cells(i + 2, 7)), 1, 0)
уже не работает

Последний раз редактировалось А)-(дрей; 02.04.2011 в 09:48.
А)-(дрей вне форума Ответить с цитированием
Старый 02.04.2011, 10:58   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Код:
M8(i) = Application.If(Range(Cells(i + 1, 7)) = Range(Cells(i + 2, 7)), 1, 0)
уже не работает
Синтаксис VBA нужно соблюдать. В данном случае, можно так:
Код:
M8(i) = IIf(Cells(i + 1, 7) = Cells(i + 2, 7), 1, 0)
но, опять же, для ускорения работы макроса, от непосредственной работы с ячейками листа нужно уходить. Т.е. все значения (как исходные, так и результирующие) должны находиться в массивах. Например:
Код:
M8(i) = IIf(a(i + 1, 7) = a(i + 2, 7), 1, 0)
где a(x, y) - двумерный массив (строки х столбцы).

Цитата:
Когда я хочу подставить параметр Data в массив
Код:
Dim M6(1 To Data)
В этой строчке возникает ошибка, как от неё избавиться?
Сразу определять массив с переменной нельзя. Для этого, нужно сначала определить динамический массив, затем его можно переопределять сколько угодно раз, используя как константы, так и переменные:
Код:
Dim M6()
ReDim M6(1 To Data)
Цитата:
Range("F1").Select
ActiveCell.FormulaR1C1 = "=COUNTIF(C[-4],"">0"")"
Data = Range("F1")
Это можно заменить на:
Код:
Data = Application.CountIf([B:B], ">0")
Цитата:
Dim M8(1 To 999)
M8(i) = "=IF(G" & i + 1 & "=G" & i + 2 & ",1,0)"
Dim M9(1 To 999)
M9(i) = "=IF(G" & i + 1 & "=G" & i & ",1,0)"
Dim M10(1 To 999)
M10(i) = "=IF(M8(i)+M9(i)>0,1,0)" ' Можно ли так?
Нужно так:
Код:
If Cells(i, "G") = Cells(i + 1, "G") Or Cells(i + 1, "G") = Cells(i + 2, "G") Then M10(i) = 1 Else M10(i) = 0
Повторюсь, что вместо значений ячеек листа нужно использовать значения заранее сформированного массива. Это быстрее в десятки (иногда сотни) раз!!!
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 02.04.2011 в 11:41.
SAS888 вне форума Ответить с цитированием
Старый 02.04.2011, 12:02   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

SAS888, можно мне спросить?
Ведь работает и так:
Код:
Option Explicit
sub tt()
Dim Data
Data=10
ReDim M6(1 To Data)
end sub
Т.е. Dim M6() практически лишнее?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.04.2011, 12:36   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Отличия между массивами М5 и М6 видно.М6 заполнен 0
Код:
Option Explicit
sub tt()
Dim Data
Dim M6() As Double
Data=10
ReDim M6(1 To Data)
ReDim M5(1 To Data)
end sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 02.04.2011, 12:47   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Так работать будет. Но в данном случае, Вы делаете то же самое, т.е. переопределяете неопределенный (не объявленный ранее) массив (ReDim M6(1 To Data)). Если же определять массив (Dim M6(1 To Data), как пробовал делать автор вопроса, то будет ошибка. Описание Dim M6() нужно так же для того, чтобы массив был пуст.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как оптимизировать код C++ slim>>> Помощь студентам 10 25.01.2011 00:05
Очень большой цикл, как оптимизировать? Marsel737 Общие вопросы Delphi 3 06.09.2010 10:08
Как оптимизировать код Delphi OST_K Помощь студентам 1 30.05.2010 06:59
Как оптимизировать плиззз alex181264 Microsoft Office Excel 3 13.04.2009 06:27
как может оптимизировать в фунцию? w1ze Помощь студентам 2 07.01.2008 23:19