Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подправить макрос для импорта - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Access » Подправить макрос для импорта (Макросы/Sub)
Подправить макрос для импорта
nick812 Дата: Пятница, 01.05.2015, 22:22 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Всем привет.

Есть макрос:

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.TableDefs("Таблица1").OpenRecordset
          
     For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
             rst.AddNew
             rst("Поле1").Value = Range("a" & 1 + i).Value
             rst("Поле2").Value = Range("b" & 1 + i).Value
             rst("Поле3").Value = Range("c" & 1 + i).Value
         rst.Update
     Next
          
End Sub
[/vba]

Необходимо подправить его таким образом, чтобы перед импортом данных из excel в access, он проверял есть ли в таблице access строки, в которых первая и вторая ячейка совпадают с импортируемыми и в этом случае, только обновлял значение третьей ячейки, не добавляя новую строку.

Буду очень признателен.
 
Ответить
СообщениеВсем привет.

Есть макрос:

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.TableDefs("Таблица1").OpenRecordset
          
     For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
             rst.AddNew
             rst("Поле1").Value = Range("a" & 1 + i).Value
             rst("Поле2").Value = Range("b" & 1 + i).Value
             rst("Поле3").Value = Range("c" & 1 + i).Value
         rst.Update
     Next
          
End Sub
[/vba]

Необходимо подправить его таким образом, чтобы перед импортом данных из excel в access, он проверял есть ли в таблице access строки, в которых первая и вторая ячейка совпадают с импортируемыми и в этом случае, только обновлял значение третьей ячейки, не добавляя новую строку.

Буду очень признателен.

Автор - nick812
Дата добавления - 01.05.2015 в 22:22
DJ_Marker_MC Дата: Пятница, 01.05.2015, 22:39 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 991
Репутация: 213 ±
Замечаний: 0% ±

Excel 2019
nick812, привет. Для того чтоб было более понятно что откуда и куда и было на чем протестить, приложите два своих файла ексель и акцес (кроме того, это необходимо делать согласно правил форума).
 
Ответить
Сообщениеnick812, привет. Для того чтоб было более понятно что откуда и куда и было на чем протестить, приложите два своих файла ексель и акцес (кроме того, это необходимо делать согласно правил форума).

Автор - DJ_Marker_MC
Дата добавления - 01.05.2015 в 22:39
nick812 Дата: Пятница, 01.05.2015, 23:02 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
DJ_Marker_MC, извиняюсь, что сразу не выложил.

Прикладываю excel файл, в третьем столбце количество, и вот оно как раз может измениться, его то и надо обновлять в access при совпадении первых двух полей (Дата, Название)

access файл сюда выложить не удалось (более 100 кб), его положил по ссылке Удалено. нарушение Правил форума
[moder]Файл можно заархивировать[/moder]

Исправился, приложил архив с файлом.
К сообщению приложен файл: 1209329.xlsm (14.1 Kb) · Test.rar (14.7 Kb)


Сообщение отредактировал nick812 - Суббота, 02.05.2015, 00:39
 
Ответить
СообщениеDJ_Marker_MC, извиняюсь, что сразу не выложил.

Прикладываю excel файл, в третьем столбце количество, и вот оно как раз может измениться, его то и надо обновлять в access при совпадении первых двух полей (Дата, Название)

access файл сюда выложить не удалось (более 100 кб), его положил по ссылке Удалено. нарушение Правил форума
[moder]Файл можно заархивировать[/moder]

Исправился, приложил архив с файлом.

Автор - nick812
Дата добавления - 01.05.2015 в 23:02
nick812 Дата: Суббота, 02.05.2015, 00:07 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Предложили вот такое решение, но к сожалению макрос дает и ошибку, может сможете помочь подредактировать его, чтобы заработал.

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.TableDefs("Таблица1").OpenRecordset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
     rst.findfirst "Поле1='" & Range("a" & 1 + i).Value & "' And Поле2='" & Range("b" & 1 + i).Value & "'"
    If rst.nomatch Then
       rst.AddNew
       rst("Поле1").Value = Range("a" & 1 + i).Value
       rst("Поле2").Value = Range("b" & 1 + i).Value
       rst("Поле3").Value = Range("c" & 1 + i).Value
    Else
       rst.Edit
       rst("Поле3").Value = Range("c" & 1 + i).Value
    End If
    rst.Update
  Next
          
End Sub
[/vba]
 
Ответить
СообщениеПредложили вот такое решение, но к сожалению макрос дает и ошибку, может сможете помочь подредактировать его, чтобы заработал.

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.TableDefs("Таблица1").OpenRecordset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
     rst.findfirst "Поле1='" & Range("a" & 1 + i).Value & "' And Поле2='" & Range("b" & 1 + i).Value & "'"
    If rst.nomatch Then
       rst.AddNew
       rst("Поле1").Value = Range("a" & 1 + i).Value
       rst("Поле2").Value = Range("b" & 1 + i).Value
       rst("Поле3").Value = Range("c" & 1 + i).Value
    Else
       rst.Edit
       rst("Поле3").Value = Range("c" & 1 + i).Value
    End If
    rst.Update
  Next
          
End Sub
[/vba]

Автор - nick812
Дата добавления - 02.05.2015 в 00:07
AndreTM Дата: Суббота, 02.05.2015, 03:06 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Скорее всего, ошибка возникает из-за того, что у вас первое поле - дата. В Excel нет отдельного типа "дата", а вот в акцессе...
Нужно либо делать приведение к единому формату (т.е., например, и из рекордсета, и из ячейки - к однотипной строке), либо рыть на предмет представления констант даты используемый движок DAO и используемую версию офиса. Чтобы правильно сформировать строку параметров поиска для rst.findfirst

Ну или вообще сделать ход конём (если все действия должны именно исполняться на стороне Excel) - считать таблицу из базы акцесса целиком в отдельный лист/диапазон рабочей книги, затем сравнить эти два диапазона (ваш и скачанный) только средствами Excel, и сформировать новый набор данных, а затем одним движением полностью заменить содержимое таблицы в базе акцесса.

А, да, ещё - вы точно уверены, что в базе данных у вас всё именно так и называется - Таблица1, Поле1, Поле2,.. ?


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Суббота, 02.05.2015, 03:09
 
Ответить
СообщениеСкорее всего, ошибка возникает из-за того, что у вас первое поле - дата. В Excel нет отдельного типа "дата", а вот в акцессе...
Нужно либо делать приведение к единому формату (т.е., например, и из рекордсета, и из ячейки - к однотипной строке), либо рыть на предмет представления констант даты используемый движок DAO и используемую версию офиса. Чтобы правильно сформировать строку параметров поиска для rst.findfirst

Ну или вообще сделать ход конём (если все действия должны именно исполняться на стороне Excel) - считать таблицу из базы акцесса целиком в отдельный лист/диапазон рабочей книги, затем сравнить эти два диапазона (ваш и скачанный) только средствами Excel, и сформировать новый набор данных, а затем одним движением полностью заменить содержимое таблицы в базе акцесса.

А, да, ещё - вы точно уверены, что в базе данных у вас всё именно так и называется - Таблица1, Поле1, Поле2,.. ?

Автор - AndreTM
Дата добавления - 02.05.2015 в 03:06
nick812 Дата: Суббота, 02.05.2015, 11:44 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
AndreTM, по поводу даты было предположение, но так и не проверил его, так как сделал в access, все поля текстовые.
А насчет кода, то вот, что вышло, в рабочем варианте, выкладываю здесь вдруг кому пригодиться:

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.OpenRecordset("select * from Таблица1", 2)  'dbopendynaset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
       rst.findfirst "Поле1='" & Range("a" & 1 + i).Value & "' And Поле2='" & Range("b" & 1 + i).Value & "'"
     If rst.nomatch Then
     rst.AddNew
     rst("Поле1").Value = Range("a" & 1 + i).Value
     rst("Поле2").Value = Range("b" & 1 + i).Value
     rst("Поле3").Value = Range("c" & 1 + i).Value
     Else
     rst.Edit
     rst("Поле3").Value = Range("c" & 1 + i).Value
     End If
     rst.Update
  Next
  MsgBox "Готово!"
End Sub
[/vba]
 
Ответить
СообщениеAndreTM, по поводу даты было предположение, но так и не проверил его, так как сделал в access, все поля текстовые.
А насчет кода, то вот, что вышло, в рабочем варианте, выкладываю здесь вдруг кому пригодиться:

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.OpenRecordset("select * from Таблица1", 2)  'dbopendynaset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
       rst.findfirst "Поле1='" & Range("a" & 1 + i).Value & "' And Поле2='" & Range("b" & 1 + i).Value & "'"
     If rst.nomatch Then
     rst.AddNew
     rst("Поле1").Value = Range("a" & 1 + i).Value
     rst("Поле2").Value = Range("b" & 1 + i).Value
     rst("Поле3").Value = Range("c" & 1 + i).Value
     Else
     rst.Edit
     rst("Поле3").Value = Range("c" & 1 + i).Value
     End If
     rst.Update
  Next
  MsgBox "Готово!"
End Sub
[/vba]

Автор - nick812
Дата добавления - 02.05.2015 в 11:44
nick812 Дата: Суббота, 02.05.2015, 12:05 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Для дат, так же нашел решение, т.е. когда в access, тип данных в ячейке - дата и время.

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.OpenRecordset("select * from Таблица1", 2)  'dbopendynaset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
       rst.findfirst "Поле1=" & Format(Range("a" & 1 + i).Value, "\#mm\/dd\/yyyy\#") & " And Поле2='" & Range("b" & 1 + i).Value & "'"
     If rst.nomatch Then
     rst.AddNew
     rst("Поле1").Value = Range("a" & 1 + i).Value
     rst("Поле2").Value = Range("b" & 1 + i).Value
     rst("Поле3").Value = Range("c" & 1 + i).Value
     Else
     rst.Edit
     rst("Поле3").Value = Range("c" & 1 + i).Value
     End If
     rst.Update
  Next
  MsgBox "Готово!"
End Sub
[/vba]
 
Ответить
СообщениеДля дат, так же нашел решение, т.е. когда в access, тип данных в ячейке - дата и время.

[vba]
Код
Sub fromExcelToAccess()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
     Dim i As Long
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\Test.accdb")
     Set rst = db.OpenRecordset("select * from Таблица1", 2)  'dbopendynaset
          
   For i = 1 To Range("A" & Cells.Rows.Count).End(xlUp).Row - 1
       rst.findfirst "Поле1=" & Format(Range("a" & 1 + i).Value, "\#mm\/dd\/yyyy\#") & " And Поле2='" & Range("b" & 1 + i).Value & "'"
     If rst.nomatch Then
     rst.AddNew
     rst("Поле1").Value = Range("a" & 1 + i).Value
     rst("Поле2").Value = Range("b" & 1 + i).Value
     rst("Поле3").Value = Range("c" & 1 + i).Value
     Else
     rst.Edit
     rst("Поле3").Value = Range("c" & 1 + i).Value
     End If
     rst.Update
  Next
  MsgBox "Готово!"
End Sub
[/vba]

Автор - nick812
Дата добавления - 02.05.2015 в 12:05
AndreTM Дата: Суббота, 02.05.2015, 18:49 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
nick812, да, все правильно - в DAO метод .FindFirst применяется к dynaset


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщениеnick812, да, все правильно - в DAO метод .FindFirst применяется к dynaset

Автор - AndreTM
Дата добавления - 02.05.2015 в 18:49
Tarasov_Ivan Дата: Четверг, 20.08.2015, 09:33 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
У нас есть несколько разных файлов экселя, по содержимому столбцы схожи, но вот расположены они по разному. Возможно ли сделать привязку XML шаблона к названию столбца, чтобы перетащил метки шаблона в нужные места, а не создавал постоянно одинаковую структуру файла

rst("Поле1").Value = Range("a" & 1 + i).Value
 
Ответить
СообщениеУ нас есть несколько разных файлов экселя, по содержимому столбцы схожи, но вот расположены они по разному. Возможно ли сделать привязку XML шаблона к названию столбца, чтобы перетащил метки шаблона в нужные места, а не создавал постоянно одинаковую структуру файла

rst("Поле1").Value = Range("a" & 1 + i).Value

Автор - Tarasov_Ivan
Дата добавления - 20.08.2015 в 09:33
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Access » Подправить макрос для импорта (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!