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

Вход

Регистрация

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

 

= Мир MS Excel/упростить/ускорить работу скрипта или алгоритма - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
упростить/ускорить работу скрипта или алгоритма
kaiser-id Дата: Воскресенье, 11.05.2014, 18:17 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
в файле более 6000 строк - компьютер стал долго думать
На листе обработка события - изменения столбца 1, в случае наступления события - выполнение функции fTotalSum
[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Count > 1 Then Exit Sub
If Target.Row < 5 Then Exit Sub
If Target.Column = 1 Then
Range("A3").Value = fTotalSum
End If
If Target.Column = 2 Then
Range("B3").Value = fTotalCheck
End If
End Sub
[/vba]

Вот сама функция
функция fTotalSum
[vba]
Код
Function fTotalSum()
ScreenOff 'отключение обновления экрана, автопересчёта, событий
Dim fLastRow As Integer
Dim fJ As Integer, fS As Long, fX As Integer, fY As Long
fTotalSum = 0
fLastRow = shAdmin.Cells(Rows.Count, 1).End(xlUp).Row

For fJ = 5 To fLastRow
If shAdmin.Cells(fJ, 1) <> "" And IsNumeric(shAdmin.Cells(fJ, 1)) Then
fX = shAdmin.Cells(fJ, 1)
fY = shAdmin.Cells(fJ, 8)
fS = fX * fY
shAdmin.Cells(fJ, 9) = fS
fTotalSum = fTotalSum + fS
Else: shAdmin.Cells(fJ, 9).ClearContents
End If
Next fJ

ScreenOn
End Function
[/vba]

чего можно сделать? %)
[moder]В следующий раз пользуйтесь спецтегами (кнопка #). Сейчас поправил.


Сообщение отредактировал kaiser-id - Воскресенье, 11.05.2014, 18:31
 
Ответить
Сообщениев файле более 6000 строк - компьютер стал долго думать
На листе обработка события - изменения столбца 1, в случае наступления события - выполнение функции fTotalSum
[vba]
Код

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Count > 1 Then Exit Sub
If Target.Row < 5 Then Exit Sub
If Target.Column = 1 Then
Range("A3").Value = fTotalSum
End If
If Target.Column = 2 Then
Range("B3").Value = fTotalCheck
End If
End Sub
[/vba]

Вот сама функция
функция fTotalSum
[vba]
Код
Function fTotalSum()
ScreenOff 'отключение обновления экрана, автопересчёта, событий
Dim fLastRow As Integer
Dim fJ As Integer, fS As Long, fX As Integer, fY As Long
fTotalSum = 0
fLastRow = shAdmin.Cells(Rows.Count, 1).End(xlUp).Row

For fJ = 5 To fLastRow
If shAdmin.Cells(fJ, 1) <> "" And IsNumeric(shAdmin.Cells(fJ, 1)) Then
fX = shAdmin.Cells(fJ, 1)
fY = shAdmin.Cells(fJ, 8)
fS = fX * fY
shAdmin.Cells(fJ, 9) = fS
fTotalSum = fTotalSum + fS
Else: shAdmin.Cells(fJ, 9).ClearContents
End If
Next fJ

ScreenOn
End Function
[/vba]

чего можно сделать? %)
[moder]В следующий раз пользуйтесь спецтегами (кнопка #). Сейчас поправил.

Автор - kaiser-id
Дата добавления - 11.05.2014 в 18:17
Alex_ST Дата: Воскресенье, 11.05.2014, 18:45 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3219
Репутация: 622 ±
Замечаний: 0% ±

2003
А где у Вас текст процедур ScreenOff и ScreenOn?
В них-то всё и дело скорее всего.
Правда, не понятно, зачем эти простейшие действия оформлять отдельными процедурами, когда достаточно записи в одну строчку отключения и включения всех "тормозилок":
вместо ScreenOff [vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]а вместо ScreenOn [vba]
Код
With Application: .EnableEvents = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Воскресенье, 11.05.2014, 18:47
 
Ответить
СообщениеА где у Вас текст процедур ScreenOff и ScreenOn?
В них-то всё и дело скорее всего.
Правда, не понятно, зачем эти простейшие действия оформлять отдельными процедурами, когда достаточно записи в одну строчку отключения и включения всех "тормозилок":
вместо ScreenOff [vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]а вместо ScreenOn [vba]
Код
With Application: .EnableEvents = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba]

Автор - Alex_ST
Дата добавления - 11.05.2014 в 18:45
_Boroda_ Дата: Воскресенье, 11.05.2014, 19:19 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 16885
Репутация: 6599 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Более того, цикл тут вообще не нужен. Конечно он тормознутый - Вы каждую итерацию обращаетесь к 2-м ячейкам и меняете значение третьей. Все гораздо проще. Файл положите - покажу как. Или не я, а еще кто-нибудь.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеБолее того, цикл тут вообще не нужен. Конечно он тормознутый - Вы каждую итерацию обращаетесь к 2-м ячейкам и меняете значение третьей. Все гораздо проще. Файл положите - покажу как. Или не я, а еще кто-нибудь.

Автор - _Boroda_
Дата добавления - 11.05.2014 в 19:19
Hugo Дата: Воскресенье, 11.05.2014, 20:21 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 0% ±

365
Не к двум, а к четырём - к одной правда три раза, но это тоже считается :)
И кроме того для счётчика строк Integer не годится, используйте Long. Но это конечно на 6000 не сыграет, а вот к середине самого маленького листа - почувствуете.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНе к двум, а к четырём - к одной правда три раза, но это тоже считается :)
И кроме того для счётчика строк Integer не годится, используйте Long. Но это конечно на 6000 не сыграет, а вот к середине самого маленького листа - почувствуете.

Автор - Hugo
Дата добавления - 11.05.2014 в 20:21
kaiser-id Дата: Вторник, 13.05.2014, 18:26 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
всем спасибо за рекомендации!
выкладываю файл целиком, он ещё не готов, но с учётом уровня знаний, - уверен там уже очень много ложных алгоритмов, которые замедляют работу.
http://yadi.sk/d/zHt-YxB2Q6nwZ

немного о файле
оставил меньше чем 6000 строк, дома нормально по скорости считает, а на рабочем ПК медленно (там ноутбук с Core2Duo 1.8 ГГц, вроде не прошлый век ещё)
на первом листе - в столбце "А" вводиться количество товара, далее скрипт считает общую сумму, вот на подсчёте и тупит
и доступны разные операции с выбранными пунктами
 
Ответить
Сообщениевсем спасибо за рекомендации!
выкладываю файл целиком, он ещё не готов, но с учётом уровня знаний, - уверен там уже очень много ложных алгоритмов, которые замедляют работу.
http://yadi.sk/d/zHt-YxB2Q6nwZ

немного о файле
оставил меньше чем 6000 строк, дома нормально по скорости считает, а на рабочем ПК медленно (там ноутбук с Core2Duo 1.8 ГГц, вроде не прошлый век ещё)
на первом листе - в столбце "А" вводиться количество товара, далее скрипт считает общую сумму, вот на подсчёте и тупит
и доступны разные операции с выбранными пунктами

Автор - kaiser-id
Дата добавления - 13.05.2014 в 18:26
kaiser-id Дата: Вторник, 13.05.2014, 18:32 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
защита листа и везде - пароль: 11


Сообщение отредактировал kaiser-id - Вторник, 13.05.2014, 18:33
 
Ответить
Сообщениезащита листа и везде - пароль: 11

Автор - kaiser-id
Дата добавления - 13.05.2014 в 18:32
kaiser-id Дата: Воскресенье, 18.05.2014, 03:28 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
в ScreenOff и ScreenOn то же самое что и у вас было
ну, вроде, разобрался, без цикла, так быстрей

[vba]
Код

Function fTotalSum()
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With

Dim fLastRow As Long
      fLastRow = shAdmin.Cells(Rows.Count, 1).End(xlUp).Row
         
Dim fArray1 As Variant
Dim fArray8 As Variant
Dim fRes()

fArray1 = shAdmin.Range(shAdmin.Cells(5, 1), shAdmin.Cells(fLastRow, 1))   
fArray8 = shAdmin.Range(shAdmin.Cells(5, 8), shAdmin.Cells(fLastRow, 8))

Dim i As Long
ReDim fRes(LBound(fArray1) To UBound(fArray1))
For i = LBound(fArray1) To UBound(fArray1)
      If IsNumeric(fArray1(i, 1)) And IsNumeric(fArray8(i, 1)) Then 'And fArray1(i, 1) >= 1
          fRes(i) = fArray1(i, 1) * fArray8(i, 1)
      Else: fRes(i) = 0
      End If
Next
fRes = Application.Transpose(fRes)
shAdmin.Range(shAdmin.Cells(5, 9), shAdmin.Cells(fLastRow, 9)) = fRes

Dim fDiapason As Variant
For Each fDiapason In fRes
      fTotalSum = fTotalSum + fDiapason
Next fDiapason
     
With Application: .EnableEvents = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
End Function
[/vba]


Сообщение отредактировал kaiser-id - Воскресенье, 18.05.2014, 03:29
 
Ответить
Сообщениев ScreenOff и ScreenOn то же самое что и у вас было
ну, вроде, разобрался, без цикла, так быстрей

[vba]
Код

Function fTotalSum()
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With

Dim fLastRow As Long
      fLastRow = shAdmin.Cells(Rows.Count, 1).End(xlUp).Row
         
Dim fArray1 As Variant
Dim fArray8 As Variant
Dim fRes()

fArray1 = shAdmin.Range(shAdmin.Cells(5, 1), shAdmin.Cells(fLastRow, 1))   
fArray8 = shAdmin.Range(shAdmin.Cells(5, 8), shAdmin.Cells(fLastRow, 8))

Dim i As Long
ReDim fRes(LBound(fArray1) To UBound(fArray1))
For i = LBound(fArray1) To UBound(fArray1)
      If IsNumeric(fArray1(i, 1)) And IsNumeric(fArray8(i, 1)) Then 'And fArray1(i, 1) >= 1
          fRes(i) = fArray1(i, 1) * fArray8(i, 1)
      Else: fRes(i) = 0
      End If
Next
fRes = Application.Transpose(fRes)
shAdmin.Range(shAdmin.Cells(5, 9), shAdmin.Cells(fLastRow, 9)) = fRes

Dim fDiapason As Variant
For Each fDiapason In fRes
      fTotalSum = fTotalSum + fDiapason
Next fDiapason
     
With Application: .EnableEvents = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
End Function
[/vba]

Автор - kaiser-id
Дата добавления - 18.05.2014 в 03:28
Hugo Дата: Воскресенье, 18.05.2014, 15:12 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3854
Репутация: 814 ±
Замечаний: 0% ±

365
Ну как же без цикла? А цикл по массиву не считается? :)
Ну и ресурсоёмкую операцию
[vba]
Код
fRes = Application.Transpose(fRes)
[/vba]
можно сделать лишним, если
[vba]
Код
ReDim fRes(LBound(fArray1) To UBound(fArray1), 1 to 1)
[/vba]
и соответственно заполнять
[vba]
Код
fRes(i,1)
[/vba]

Ну и ScreenUpdating действительно можно не отключать - т.к. из действий на листе всего одна выгрузка из массива. В итоге отключение/включение обновления экрана только немного тормозит весь процесс.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу как же без цикла? А цикл по массиву не считается? :)
Ну и ресурсоёмкую операцию
[vba]
Код
fRes = Application.Transpose(fRes)
[/vba]
можно сделать лишним, если
[vba]
Код
ReDim fRes(LBound(fArray1) To UBound(fArray1), 1 to 1)
[/vba]
и соответственно заполнять
[vba]
Код
fRes(i,1)
[/vba]

Ну и ScreenUpdating действительно можно не отключать - т.к. из действий на листе всего одна выгрузка из массива. В итоге отключение/включение обновления экрана только немного тормозит весь процесс.

Автор - Hugo
Дата добавления - 18.05.2014 в 15:12
kaiser-id Дата: Воскресенье, 18.05.2014, 18:54 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
да - то, что нужно, благодарю за помощь :D
 
Ответить
Сообщениеда - то, что нужно, благодарю за помощь :D

Автор - kaiser-id
Дата добавления - 18.05.2014 в 18:54
  • Страница 1 из 1
  • 1
Поиск:

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