Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать этот код? / 17 сообщений из 17, страница 1 из 1
31.07.2004, 21:26:22
    #32630480
Ukraina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Set xw = GetObject(CurrentProject.Path & "\contracts.xls", "Excel.sheet")
For i = 5 To 1000
z1 = xw.ActiveSheet.Cells(i, 1)
z2 = xw.ActiveSheet.Cells(i, 2)
z3 = xw.ActiveSheet.Cells(i, 3)
z4 = xw.ActiveSheet.Cells(i, 4)
z5 = xw.ActiveSheet.Cells(i, 5)
z6 = xw.ActiveSheet.Cells(i, 6)
z7 = xw.ActiveSheet.Cells(i, 7)
z8 = xw.ActiveSheet.Cells(i, 8)
z9 = xw.ActiveSheet.Cells(i, 9)
z10 = xw.ActiveSheet.Cells(i, 10)
z11 = xw.ActiveSheet.Cells(i, 11)
z12 = xw.ActiveSheet.Cells(2, 2)

If z2 = "" Then GoTo 777
Set rst = CurrentDb.OpenRecordset("Поступления")
rst.AddNew
rst![Товар] = z1
rst![Наименование] = z2
rst![Категория] = z3
rst![Единицы] = z4
rst![Кол-во] = z5
rst![Себестоимость] = z6
rst![Себестоимость TMM] = z7
rst![Валюта] = z8
rst![Дата] = z9
rst![Поставщик] = z10
rst![Контра] = z12
rst![Цена] = z11
rst.Update
rst.Close
Next i
Код работает, считывает из экса и вставляет как нужно, но немного, а иногда и долговато. Можно ли оптимизировать это для ускорения или есть другие методы экспорта из экса? DoCmd.TransferSpreadsheet пробывал, уже не надо. Вместо For вставлял While , но особой скорости не прибавилось
...
Рейтинг: 0 / 0
31.07.2004, 21:36:52
    #32630483
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Set rst = CurrentDb.OpenRecordset("Поступления")
z12 = xw.ActiveSheet.Cells(2, 2)

For i = 5 To 1000
With xw.ActiveSheet
z1 = .Cells(i, 1)
z2 = .Cells(i, 2)
z3 = .Cells(i, 3)
z4 = .Cells(i, 4)
z5 = .Cells(i, 5)
z6 = .Cells(i, 6)
z7 = .Cells(i, 7)
z8 = .Cells(i, 8)
z9 = .Cells(i, 9)
z10 = .Cells(i, 10)
z11 = .Cells(i, 11)
End With

If z2 = "" Then
GoTo 777
rst.Close
End If

With rst
.AddNew
![Товар] = z1
![Наименование] = z2
![Категория] = z3
![Единицы] = z4
![Кол-во] = z5
![Себестоимость] = z6
![Себестоимость TMM] = z7
![Валюта] = z8
![Дата] = z9
![Поставщик] = z10
![Контра] = z12
![Цена] = z11
.Update
End With
Next i

rst.Close

То, что изменилось, я выделил красным. Правда, не обещаю, что это поможет.
...
Рейтинг: 0 / 0
31.07.2004, 21:38:06
    #32630485
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Еще идея:

Set rst = CurrentDb.OpenRecordset("Поступления",dbOpenDynaset,dbForwardOnly)
...
Рейтинг: 0 / 0
31.07.2004, 23:26:25
    #32630512
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
для сброса данных лучше использовать
Код: plaintext
1.
Excel.Range("E1").CopyFromRecordset rst
...
Рейтинг: 0 / 0
31.07.2004, 23:53:37
    #32630516
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Виктор, сколько лет, сколько зим!

То, что ты предложил, - это из рекордсета в Эксель. А надо наоборот...
...
Рейтинг: 0 / 0
01.08.2004, 00:19:56
    #32630520
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
честно говоря, надо видеть весь код.
и наче остается мутное место с меткой 777
то, что "там" должно быть "здесь".

Не зная что там, невозможно сказать - что делать, например, с - рекордсетом - закрывать или так оставить.
Без учета 777 И соображений о скорости, (про скорость - ничего не скажу), а только принимая во внимание компактность, я бы написал так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 'рекордсет к этому моменту открыт
 

 'считываем все в один массив
 

Dim j as long, i as long
Dim v   'будет массивом, в который прочитем значения из ексель
 

z12 = xw.ActiveSheet.Cells( 2 ,  2 )

 'считываем все остальные значения за раз в массив
 
v = cw.ActiveSheet.Range("A5:K1000").Value
 ' как будто ексель нам больше не нужен - все есть, кроме загадочного 777
 

 'цикл добавления в базу
 

For i= 1  to  996 

     'все потому, что просят оптимизировать, не показывая, что именно
 
    if IsEmpty((v(i, 2 )) then
     ' rst.Close  ???
 
     ' Set rst = Nothing ???
 
    GoTo  777   
    endif  

    rst.AddNew
       'если бы порядок полей в рекордсете точно совпадал с порядком полей в екселе, то можно было бы писать так как закоментировано
 
       'for j = 0 to 10
 
       '   rst(j).value = v(i,j+1)
 
       ' next j 
 
       ' rst(11) = z12
 
      
       ' если по каким-то причинам нельзя добиться одинакового порядка полей,
 
       ' писать придется в стиле
 
       ' rst![Товар] =v(i,1) ... и далее по списку
 
         
    rst.Update
 
Next i

rst.Close
Set rst= Nothing
...
Рейтинг: 0 / 0
01.08.2004, 00:37:31
    #32630523
Ukraina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Сильно!!! Сейчас попробую!
Объясняю "777"
Дело в том, что я не знаю, сколько строк займут данные в экселе. Я знаю, что начинаются они с 5 строки и заканчиваются черт знает где. Т.е. может быть это будет 10 строк с информацией, а в следующий раз 980 . Поэтому и использую с запасом 1000
в ячейке экселя
z2 = xw.ActiveSheet.Cells(i, 2)
заполняются наименования товара и поэтому в идеале они не должны быть пустыми (иначе это проблемы пользователя, т.к. согласитесь товар без наименования - это...). Поэтому я деляю проверку на наличие пустой ячейки, (z2="")т.е. если она пустая, то все работу прекратить. Так что за 777 ничего нет просто стоят ряд функций, которые не влияют на результат (мои вспомогательные)
А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?
...
Рейтинг: 0 / 0
01.08.2004, 00:46:50
    #32630525
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Ukraina А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?
http://sql.ru/forum/actualthread.aspx?tid=77517
...
Рейтинг: 0 / 0
01.08.2004, 01:19:35
    #32630531
Ukraina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Victosha!
Поразительно! Восхитительно! Вот это ДА! Здорово! Прекрасно!... (далее см. любой словарь русского языка в топиках о словах, выражающие восхищение).
Сработало, да еще как. Для 390 записей время сократилось с 12 секунд до 3 секунд. Обалдеть!!!
И где Вы всему этому учились?
Спасибо, простое человеческое спасибо.
Желаю дальнейших успехов и талантливых учеников!
...
Рейтинг: 0 / 0
01.08.2004, 02:08:06
    #32630535
Ukraina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Саныч!
Посмотрел я ссылку. Думал, что понял, но на самом деле нет.
В моей задаче я использую цикл
For i=1 to 1000
Для того, чтобы уменьшить этот цикл мне и нужно получить последнюю строку экса. Пробывал многое, но выдает различные ошибки. Как можно вклинить это в цикл типа

For i=1 to xs.Range("B5").End(xlDown).Select , где
xs.Range("B5").End(xlDown).Select будет равняться скажем 60

Т.е. как получить число строк в какой-нибудь переменной для использования в цикле ну к примеру так что ли?

y=xs.Range("B5").End(xlDown)
for i=1 to y
...
Рейтинг: 0 / 0
01.08.2004, 11:58:54
    #32630577
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
UkrainaВ моей задаче я использую цикл
For i=1 to 1000
dim r as excel.range
set r=xw.ActiveSheet.usedrange
for i=r.row to r.rows.count-r.row+1

Правда, пустые строки все равно могут попадаться, поэтому надо проверять, не пустая ли строка.
...
Рейтинг: 0 / 0
01.08.2004, 17:22:17
    #32630655
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Если после К следующий столбец - пустой,
и в интересующем нас диапазоне нет пустых строк,
то получение массива будет таким

v = cw.ActiveSheet.Range("A5:K5").CurrentRegion.Value
при этом проверка на пустоту в цикле исчезнет, т.к. все полученные "строки" - нужные.
--------------------

2 Ukraina
скорость получилась сама собой - как следствие сокращения к-ва обращений к Ексель.

Можно придумать более одной стратегии оптимизации скорости, но
1) до опыта у меня нет предпочтений
2) потенциальный объем кодирования не обнадеживает эффективностью полученного результата.
...
Рейтинг: 0 / 0
01.08.2004, 18:26:14
    #32630672
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
опять проврался

v = cw.ActiveSheet.Range("A5:K5").CurrentRegion.Value

сработает, если 4-я строка пустая. Если перед 5-й строкой есть несколько строк заголовков, то они все попадут в массив.
Обойти можно двумя путями.
1) пропустить лишние строки в полученном массиве, начав обработку с нужной
2) вычислить позицию последней строки
LastRowPos = cw.ActiveSheet.Range("A5:K5").CurrentRegion.SpecialCells(xlCellTypeLastCell).Row
...
Рейтинг: 0 / 0
02.08.2004, 01:48:11
    #32630707
report
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
автор
А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?


appXls.wkbXls.wksXls.Cells.SpecialCells(xlCellTypeLastCell)

возвращает последний элемент
...
Рейтинг: 0 / 0
02.08.2004, 09:08:50
    #32630814
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
Владимир СанычВиктор, сколько лет, сколько зим!

То, что ты предложил, - это из рекордсета в Эксель. А надо наоборот...

Н-да :(
...
Рейтинг: 0 / 0
02.08.2004, 10:41:17
    #32630928
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
стоит попробовать TransferSpreadsheet:
Код: plaintext
1.
Public Sub ImportXls(FilePath As String, SheetName As String, mRange As String, mCol As Long, mRow As Long)    Dim mRow2 As Long    Dim mCol1 As String    Dim mCol2 As String    Dim nRange As String    Dim myDb As Access.Application    Dim strPath As String, strMyFile As String    tIni.Seek "ImportXls", adSeekFirstEQ\'    If tIni!iniVal <> FilePath & "!" & SheetName Then        If mRow <> 0 Then        \'указанное число сторк            mRow2 = mRow        Else        \'сколько есть            mRow2 = GetRangeRow2(mRange)        End If        mCol1 = GetRangeCol1(mRange)        If mCol <> 0 Then        \'указанное число колонок            mCol2 = GetRangeCol2(mCol)        Else        \'сколько есть            mCol2 = GetRangeCol20(mRange)        End If        Set myDb = CreateObject("Access.Application")        myDb.OpenCurrentDatabase App.Path & "\\xls2dbf.mdb"        Call modTime.ProfileStart(frmTask, 0, 0, (mRow2 \\ 1000) + 1, , "Преобразование таблицы")        For i = 1 To mRow2 Step 1000            If i + 1000 < mRow2 Then                nRange = mCol1 & i & ":" & mCol2 & i + 999            Else                nRange = mCol1 & i & ":" & mCol2 & mRow2            End If            Call modTime.GetTime(frmTask, 0, nRange)            DoEvents                        myDb.DoCmd.TransferSpreadsheet acImport, 8, "tXls", FilePath, False, SheetName & "!" & nRange            If EndTask = True Then            \'если задача была прервана пользователем                Call modTime.EndTime("Прервано пользователем", frmTask)                Exit For            End If        Next i        Set myDb = Nothing        tIni.Update "IniVal", FilePath & "!" & SheetName\'    End If    Set tXls = New ADODB.Recordset    With tXls    .ActiveConnection = CnPro    .Source = "tXls"    .CursorType = adOpenKeyset    .LockType = adLockOptimistic    .CursorLocation = adUseServer    Start = Timer   \' Задает начало паузы.    Do While Timer < Start + 4        DoEvents    \' Передает управление другим процессам.    Loop    .Open    End WithEnd Sub
Как отформатирован этот код?
...
Рейтинг: 0 / 0
02.08.2004, 23:26:23
    #32632255
Ukraina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать этот код?
к Марван!!!
Работает, но все-таки почему-то медленнее, чем предложенный Виктошей!?
Плюс ко всему6 возникла таже проблема (проподание данных), но уже при использовании национальной раскладки клавы (в данном случае туркменской). Полностью игнорирует отличительными (от латиницы) литерами.
Почему такое могет быть? Может все-таки в установках Офиса?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать этот код? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]