powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать этот код?
17 сообщений из 17, страница 1 из 1
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #32630485
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Еще идея:

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

То, что ты предложил, - это из рекордсета в Эксель. А надо наоборот...
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #32630523
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сильно!!! Сейчас попробую!
Объясняю "777"
Дело в том, что я не знаю, сколько строк займут данные в экселе. Я знаю, что начинаются они с 5 строки и заканчиваются черт знает где. Т.е. может быть это будет 10 строк с информацией, а в следующий раз 980 . Поэтому и использую с запасом 1000
в ячейке экселя
z2 = xw.ActiveSheet.Cells(i, 2)
заполняются наименования товара и поэтому в идеале они не должны быть пустыми (иначе это проблемы пользователя, т.к. согласитесь товар без наименования - это...). Поэтому я деляю проверку на наличие пустой ячейки, (z2="")т.е. если она пустая, то все работу прекратить. Так что за 777 ничего нет просто стоят ряд функций, которые не влияют на результат (мои вспомогательные)
А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #32630525
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ukraina А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?
http://sql.ru/forum/actualthread.aspx?tid=77517
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #32630531
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha!
Поразительно! Восхитительно! Вот это ДА! Здорово! Прекрасно!... (далее см. любой словарь русского языка в топиках о словах, выражающие восхищение).
Сработало, да еще как. Для 390 записей время сократилось с 12 секунд до 3 секунд. Обалдеть!!!
И где Вы всему этому учились?
Спасибо, простое человеческое спасибо.
Желаю дальнейших успехов и талантливых учеников!
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #32630655
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если после К следующий столбец - пустой,
и в интересующем нас диапазоне нет пустых строк,
то получение массива будет таким

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

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

Можно придумать более одной стратегии оптимизации скорости, но
1) до опыта у меня нет предпочтений
2) потенциальный объем кодирования не обнадеживает эффективностью полученного результата.
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #32630707
report
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
А вот можно ли перед считыванием данных из экселя как нибудь подсчитать сколько там "забитых" строк?


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

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

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

Н-да :(
...
Рейтинг: 0 / 0
Можно ли оптимизировать этот код?
    #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
Можно ли оптимизировать этот код?
    #32632255
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к Марван!!!
Работает, но все-таки почему-то медленнее, чем предложенный Виктошей!?
Плюс ко всему6 возникла таже проблема (проподание данных), но уже при использовании национальной раскладки клавы (в данном случае туркменской). Полностью игнорирует отличительными (от латиницы) литерами.
Почему такое могет быть? Может все-таки в установках Офиса?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать этот код?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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