Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2010, 15:56   #1
Djuleta86
 
Регистрация: 31.08.2010
Сообщений: 6
По умолчанию Импорт из excel

Всем привет. Помогите пожалуйста. У меня проблема. Есть файл excel - 123.xls, который состоит из нескольких листов. Нужно периодически импортировать колонки 8, 10, 13, 15 из листа 6 в access таблицу table1. Причем таблица должна обновляться, а не перезаписывать. Т.е. как-бы Причем сумма в колоноке 15 должна не заменяться, а плюсоваться.
Я в vba новичок. Кое-что накатала, но это совсем не то.

Private Sub Кнопка0_Click()

Dim rstN As ADODB.Recordset

Dim xlObj, xlWB As Object

Set xlObj = CreateObject("Excel.Application")
xlObj.Visible = False
Set xlWB = xlObj.Workbooks.Open("f:\123.xls")

Set rstN = New ADODB.Recordset

rstN.Open "table1", CurrentProject.Connection, adOpenDynamic, adLockOptimistiс

If rstN.BOF = False Then
i = 11
While xlWB.Sheets(6).Cells(i, 1) <> ""
rstN.Update "Телефон", xlWB.Sheets(6).Cells(i, 8)
rstN.Update "Дата", xlWB.Sheets(6).Cells(i, 10)
rstN.Update "Сумма1", xlWB.Sheets(6).Cells(i, 13)
rstN.Update "Сумма2", xlWB.Sheets(6).Cells(i, 15)
i = i + 1
MsgBox "Процес окончен"
Wend
Else

With xlWB.Sheets(6).Cells(i, 8)
For i = 11 To .UsedRange.Rows.Count
rstN.Update "Телефон", xlWB.Sheets(6).Cells(i, 8)
rstN.Update "Дата", xlWB.Sheets(6).Cells(i, 10)
rstN.Update "Сумма1", xlWB.Sheets(6).Cells(i, 13)
rstN.Update "Сумма2", xlWB.Sheets(6).Cells(i, 15)
rstN.MoveNext
Next i
End With
MsgBox "Процесс окончен"
End If
Set xlWB = Nothing
Set xlObj = Nothing


End Sub



Excel-файл на всяк. случай прикрепляю. Помогите, please. 3 дня уже над этим сижу и туплю
Вложения
Тип файла: zip 123.ZIP (235.9 Кб, 67 просмотров)
Djuleta86 вне форума Ответить с цитированием
Старый 04.09.2010, 14:33   #2
Nulex
Новичок
Джуниор
 
Регистрация: 04.09.2010
Сообщений: 6
По умолчанию

Насколько важно требование по перезаписи? Если не важно docmd вполне может помочь.
Если важно (данные меняются в table1 а в excel нет) можно импортировать эксельку во временную таблицу обработать ее напильником SQL и вставить в нужную.

Последний раз редактировалось Nulex; 04.09.2010 в 14:35.
Nulex вне форума Ответить с цитированием
Старый 08.09.2010, 12:28   #3
Chris D
Пользователь
 
Регистрация: 14.01.2010
Сообщений: 31
По умолчанию

Код:
On Error Resume Next

Dim dbs As DAO.Database
Dim cPath, counter As Integer

Const sFilePath = "C:\Total\"


    Set dbs = CurrentDb

    dbs.Execute "DELETE FROM Table1 Name;"
    
    With CreateObject("Excel.Application")
    cPath = .GetOpenFilename("Excel Files (*.xls), *.xls", , "Aiaaaeou Oaaeeou", , True)
    If Not IsArray(cPath) Then End
        For counter = 1 To UBound(cPath)
        DoCmd.TransferSpreadsheet acImport, 8, "Table1", cPath(counter), True, ""
    Next
    End With
    dbs.Close
Как один из вариантов
Писал в блокноте, заранее прошу прощения за возможные ошибки.
Chris D вне форума Ответить с цитированием
Старый 11.09.2010, 02:12   #4
Djuleta86
 
Регистрация: 31.08.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Nulex Посмотреть сообщение
Насколько важно требование по перезаписи? Если не важно docmd вполне может помочь.
Если важно (данные меняются в table1 а в excel нет) можно импортировать эксельку во временную таблицу обработать ее напильником SQL и вставить в нужную.

Не, DoCmd точно не подойдет. Во первых надо выкинуть шапку, во вторых перезапись очень важна. Это одна из главных задач. Ща попробую тем способом, который вы подсказали. Огромное спасибо за помощь. Как что получится, обязательно выложу.
Djuleta86 вне форума Ответить с цитированием
Старый 11.09.2010, 02:14   #5
Djuleta86
 
Регистрация: 31.08.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Chris D Посмотреть сообщение
Код:
On Error Resume Next

Dim dbs As DAO.Database
Dim cPath, counter As Integer

Const sFilePath = "C:\Total\"


    Set dbs = CurrentDb

    dbs.Execute "DELETE FROM Table1 Name;"
    
    With CreateObject("Excel.Application")
    cPath = .GetOpenFilename("Excel Files (*.xls), *.xls", , "Aiaaaeou Oaaeeou", , True)
    If Not IsArray(cPath) Then End
        For counter = 1 To UBound(cPath)
        DoCmd.TransferSpreadsheet acImport, 8, "Table1", cPath(counter), True, ""
    Next
    End With
    dbs.Close
Как один из вариантов
Писал в блокноте, заранее прошу прощения за возможные ошибки.
О,спасибо огромное спасибо за код .Сейчас попробую этим способом. Большое спасибо за то, что отозвались на призыв о помощи
Djuleta86 вне форума Ответить с цитированием
Старый 11.09.2010, 18:15   #6
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Djuleta86.
возможно стоит рассмотреть вариант подключения к диапазону таблицы:
Код:
SELECT F8, F10, [Сумма вознаграждения за текущий период] as F13, [Всего] as F15
FROM ["Excel 8.0;DATABASE=C:\Documents and Settings\User\Мои документы\123.xls"].[Приложение 5 $A10:R20000]
WHERE F8 Is Not Null
это может быть сохраненный запрос, данными из которого будет обновляться таблица Table1.
Но идея "..таблица должна обновляться, а не перезаписывать.. ..в колонке 15 должна не заменяться, а плюсоваться. .." не правильное решение.
Сохраняйте все данные с учетом уникальности составного ключа (например Номер телефона абонента, Дата заключения договора,...),
т.к. "плюсоваться" (приплюсовывать) данные из поля F15 необходимости нет,
для этого существуют запросы с группировкой, которые в любой момент могут отобразить итоговое значение.
это моё мнение, решение за Вами.

Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 12.09.2010, 16:26   #7
Djuleta86
 
Регистрация: 31.08.2010
Сообщений: 6
Радость

Цитата:
Сообщение от Teslenko_EA Посмотреть сообщение
Здравствуйте Djuleta86.
возможно стоит рассмотреть вариант подключения к диапазону таблицы:
Код:
SELECT F8, F10, [Сумма вознаграждения за текущий период] as F13, [Всего] as F15
FROM ["Excel 8.0;DATABASE=C:\Documents and Settings\User\Мои документы\123.xls"].[Приложение 5 $A10:R20000]
WHERE F8 Is Not Null
это может быть сохраненный запрос, данными из которого будет обновляться таблица Table1.
Но идея "..таблица должна обновляться, а не перезаписывать.. ..в колонке 15 должна не заменяться, а плюсоваться. .." не правильное решение.
Сохраняйте все данные с учетом уникальности составного ключа (например Номер телефона абонента, Дата заключения договора,...),
т.к. "плюсоваться" (приплюсовывать) данные из поля F15 необходимости нет,
для этого существуют запросы с группировкой, которые в любой момент могут отобразить итоговое значение.
это моё мнение, решение за Вами.

Евгений.
Спасибо огромное, Евгений. Идея отличная. По времени будет гораздо быстрее обрабатываться, мне кажется.Займусь ее реализацией.
Djuleta86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
импорт данных из access в excel. romale_80 Microsoft Office Access 8 25.03.2010 01:26
Импорт AD users в Excel sirius24 Microsoft Office Excel 1 18.03.2010 06:23
Импорт данных в Excel mMAg Microsoft Office Excel 2 20.08.2009 17:50
Импорт из Excel в Access AD_min БД в Delphi 0 28.10.2008 09:29