Два вопроса по взаимодействию с excel

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Два вопроса по взаимодействию с excel

Сообщение Юджин » 10.11.2005 (Чт) 13:18

1. прога запускает применение к xls файлу экселевского макроса, а в диспетчере задач почему-то отображаются 2 запущенных excel (я лишнее не запускал). использую цепь обработки закачка файла-распаковка-применение макроса. и так раз 10 (файлы разные). Пробовал вставлять в конец маросов прописывать принудительное закрытие excel, запуск обработки следующего файла после изменения глобальной переменной (изменялась в конце предыдущего макроса). не помогает. как быть?
2. в макросах куча циклов, прога сильно подвисает когда выполняется, например, цикл по 10000 раз. как сделать так, что б работающий цикл не мешал сворачивать и перемещать окно проги, а так же не влиял на работающий секундомер этой проги?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2005 (Чт) 13:22

1. Как прога запускает применение к xls файлу экселевского макроса?
2. DoEvents внутрь цикла вставь. Но лучше дай ему отработать.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Сообщение Юджин » 10.11.2005 (Чт) 13:29

1. для чтения xlm файла в каждом макросе идет код:

Dim xl As Excel.Application, xBook As Excel.Workbook
Set xl = CreateObject("Excel.Application.11")
xl.DisplayAlerts = False
Set xBook = xl.Workbooks.OpenXML(tmpName1, , 2)

2. doevents вставил как
If i Mod 10 = 0 Then DoEvents
после обозначения количества циклов, но перед самим циклом
результат не сильно меняется - как только сам цикл запускается прога виснет, таймер (секундомер) тормозит очень сильно

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2005 (Чт) 13:34

1. Откуда запускается код?
2. А что такое "после обозначения количества циклов, но перед самим циклом"?
Последний раз редактировалось GSerg 10.11.2005 (Чт) 13:39, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.11.2005 (Чт) 13:37

Из листа Excel читается таблица? Если это просто таблица, то работай с ней примерно так:

Код: Выделить всё
Set cn = New ADODB.Connection
cn.CursorLocation = adUseClient
cn.Mode = adModeRead
cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=""" & sFile & """;Mode=Read;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"""
   
r.Open "SELECT * FROM [a1:j65536]", cn, adOpenStatic, adLockReadOnly
...


быстрее будет...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Сообщение Юджин » 10.11.2005 (Чт) 13:51

не просто читается, таблица меняется: удаляются, втавляются значения, сортируются.
код обработки такой:
Dim xl As Excel.Application
Dim xlBook As Excel.Workbook
Dim numoRecs As Long, i As Long, intzeroline As Long, str11 As String, str12 As String, str13 As String, str14 As String
Set xl = New Excel.Application
xl.DisplayAlerts = False
Set xlBook = xl.Workbooks.OpenXML(tmpName2, , 2)

DoEvents
With xlBook.ActiveSheet


.Columns("A:f").Delete Shift:=xlToLeft

numoRecs = 0
For i = 1 To 14000 '.Columns("A:f").Rows.Count
If i Mod 10 = 0 Then DoEvents
If Trim(.Cells(i, 1).Text) = "" Then
Exit For
Else
numoRecs = numoRecs + 1
End If
Next i
numoRecs = (numoRecs - 1) / intN

' сортируем значения
For i = 1 To numoRecs
If i Mod 10 = 0 Then DoEvents
.Cells(i, 6).Value = .Cells((i - 1) * intN + 31, 1).Value '
.Cells(i, 7).Value = .Cells((i - 1) * intN + 21, 1).Value '
.Cells(i, 8).Value = .Cells((i - 1) * intN + 13, 1).Value '
.Cells(i, 9).Value = .Cells((i - 1) * intN + 18, 1).Value '
.Cells(i, 10).Value = .Cells((i - 1) * intN + 14, 1).Value '
.Cells(i, 11).Value = .Cells((i - 1) * intN + 38, 1).Value '
.Cells(i, 12).Value = .Cells((i - 1) * intN + 40, 1).Value '
.Cells(i, 13).Value = .Cells((i - 1) * intN + 35, 1).Value '
Next
.Columns("A:E").Delete Shift:=xlToLeft
и так далее
как видите - впихивал doevents куда мог (ламер, что еще взять!!!)

Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Сообщение Юджин » 10.11.2005 (Чт) 21:21

И все-таки, как ускорить работу проги?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.11.2005 (Чт) 21:42

Имеет значение не реальная, а ощущая скорость работы.
Если юзеру показывать прогрессбар, обновляемый каждую секунду, ожидание покажется короче. Доказано лучшими собаководами (c). Поэтому делаем всё как обычно, в блокирующем режиме, просто прогресс или похожее что рисуем.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.11.2005 (Пт) 8:49

Юджин писал(а):И все-таки, как ускорить работу проги?


Не менять существующий Excel-файл, а создавать его самому.
Можно как XML.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Сообщение Юджин » 11.11.2005 (Пт) 12:12

по поводу собаководов сильно сомневаюсь - важно не время работы, а отсутствие зависаний (невозможность свернуть окно и тп).

Юджин
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.10.2005 (Ср) 12:49

Сообщение Юджин » 11.11.2005 (Пт) 12:15

делал создание xml, а не его открытие - бесполезно. цикл повторяется 14000 раз, и в это время прогу вообще лучше не трогать (а хотелось бы)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.11.2005 (Пт) 13:32

Юджин писал(а):делал создание xml, а не его открытие - бесполезно. цикл повторяется 14000 раз, и в это время прогу вообще лучше не трогать (а хотелось бы)


Ну значит так делал - побежаться по 14000 записям Recordset-a и сформировать из них строку для XML - займет явно менее секунды.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

    TopList