
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.141] |
![]() |
|
Сообщ.
#1
,
|
|
|
Весь фак перерыл - ничего не нашел....
Хотя скорее всего уже не раз обсасывалось. из Аксеса хочу открыть екселевский файл в который экспортировал данные. Числовые поля которые упрямо воспринимаются как текст привести в нормальный вид следующим кодом: ![]() ![]() ActiveSheet.UsedRange.Select For Each tt In Selection.Cells tt.Value = tt.Value Next tt ____________________________ Хор Веревки: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Добавлено ![]() ![]() Shell "cmd /X /C start c:\mydoc\example.xls" Добавлено Вот что получилось: ![]() ![]() sse = "D:\My_doc\sliv.xls" Dim objExcel As Object Set objExcel = CreateObject("Excel.application") With objExcel .Workbooks.Add Template:=sse .Visible = True End With objExcel.ActiveSheet.UsedRange.Select For Each tt In objExcel.Selection.Cells tt.Value = tt.Value Next tt objExcel.Workbooks(1).Save objExcel.Application.Quit Set objExcel = Nothing Единственное думает очень долго.... Если исходный макрос запускать из екселся - раз в 20 быстрее. за наведение на мысль спасибо Mongol и maxim84_ |
Сообщ.
#2
,
|
|
|
немного модифицировал
![]() ![]() sse = "D:\My_doc\sliv.xls" Dim objExcel As Object Set objExcel = CreateObject("Excel.application") With objExcel .Workbooks.Add Template:=sse .Visible = True End With objExcel.ActiveSheet.UsedRange.Select For Each tt In objExcel.Selection.Cells tt.Value = tt.Value rreee = tt.Address Next tt objExcel.Application.DisplayAlerts = False objExcel.Workbooks(1).SaveAs sse objExcel.Application.Quit Set objExcel = Nothing Но грабли вылезли в следующем: на полной базе это займет около часа (напомню в екселе это занимает 20 сек) Может есть нормальный способ выливать в ексель числа чтобы не приходилось так корячиться???? напомню: при экспорте в ексель из аксеса числовые поля стают текстом - спасает от этого только процедура повторного присвоения значения(см код выше) ХЕЛП!!!!!!!!!! ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Сообщ.
#3
,
|
|
|
Этого надо избегать
![]() ![]() For Each tt In objExcel.Selection.Cells Вот так будет быстрее: ![]() ![]() Const xlPasteValues = -4163 Const xlCellTypeBlanks = 4 Const xlPasteSpecialOperationAdd = 2 Dim objExcel As Object, sse As String sse = "D:\My_doc\sliv.xls" Set objExcel = CreateObject("Excel.application") With objExcel .Workbooks.Open Filename:=sse, ReadOnly:=False .Cells.SpecialCells(xlCellTypeBlanks).Copy .ActiveSheet.UsedRange.PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd .DisplayAlerts = False .Workbooks(1).SaveAs Filename:=sse .Quit End With Set objExcel = Nothing |
Сообщ.
#4
,
|
|
|
pvr даааа.....
Повис ексель с аксесом и надежно - снял только через три пальца и то через 10 мин. То ли лыжи не едут толи я не лыжник.... может как-то можно в екселе создавать макрос-запускать на выполнение-удалять макрос-закрывать с сохранением? pvr- все равно спасибо - показал иной подход. Вопрос остаётся открытым... ![]() Добавлено Манипуляции привели к твердому решению - никаких действий с ячейками в екселе из под объекта в аксесе. Уже на выделении ячеек связка виснет на минут 5. Следовательно уточняю задачу: Открыть ексель - это решено Создать в нем макрос определенного содержания - не решено Передать управление екселю и запустить макрос - не решено по окончании выполнения макроса - удалить все макросы в екселе - не решено сохранить и закрыть ексель - это решено передать управление аксесу - не решено |
Сообщ.
#5
,
|
|
|
Nick
С точки зрения выполнения макроса - абсолютно всё-равно, кто его запускает, работать будет одинаково. Попробуй мой код выполнить по F8 из аксесса - какой его участок тормозит? И тот же код из самого Excel - только objExcel замени на Application. У меня одинаково отрабатывает..... Может у тебя при старте Excel куча каких-нибудь надстроек грузится? |
Сообщ.
#6
,
|
|
|
я же говорю - макрос сначала был написан в екселе - время выполнения - 20-40 секунд на всё.
Даже операция выделения непустых ячеек - это 1-3 секунды если запускаешь макрос в екселе (по упомянутому тобой F8) против 5 минут - если это делаешь в аксесе. Операция копирования в твоём коде приводит к подвисанию связки (это если дождаться пока оно все выделит) - на работе процесора и памяти данный процес никак не отражается почему-то... ![]() в моём же коде процес идет, но на каждую ячейку тратится очень много времени (10-20ячеек за секунду) при минимальном размере 2000*40 - это на долго.... ![]() ![]() ![]() |
![]() |
Сообщ.
#7
,
|
|
Цитата Nick @ Создать в нем макрос определенного содержания - не решено Передать управление екселю и запустить макрос - не решено по окончании выполнения макроса - удалить все макросы в екселе - не решено Динамическое добавление и запуск макроса на языке VBA в среде разработки Visual Basic |
Сообщ.
#8
,
|
|
|
Nick
Так какая строка моего кода подвисает - Copy или PasteSpecial ??? |
Сообщ.
#9
,
|
|
|
2 pvr копирование.
2 Rust - спасибки - по виду самое оно! пробовать не буду - уже далеко ушел. Думаю линк в ФАК добавить стоит. С учетом поста Rust думаю можно закрывать тему. |