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

Вход

Регистрация

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

 

= Мир MS Excel/Из Excel в Access - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: _Boroda_, китин  
Из Excel в Access
Serge_007 Дата: Воскресенье, 21.04.2013, 19:13 | Сообщение № 1
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Всем привет

Как макросом сливать инфу из Excel в Access?
Суть: Есть табличка (любая) в Excel, рассчитывается ежемесячно/ежедневно. По окончании расчёта её надо скинуть в Access. И так каждый месяц/день (добавлять ниже)
Я пользую 2010-й офис, но решение нужно универсальное

Спасибо


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеВсем привет

Как макросом сливать инфу из Excel в Access?
Суть: Есть табличка (любая) в Excel, рассчитывается ежемесячно/ежедневно. По окончании расчёта её надо скинуть в Access. И так каждый месяц/день (добавлять ниже)
Я пользую 2010-й офис, но решение нужно универсальное

Спасибо

Автор - Serge_007
Дата добавления - 21.04.2013 в 19:13
anvg Дата: Понедельник, 22.04.2013, 09:49 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Serge_007
А что подразумевается
Цитата
По окончании расчёта её надо скинуть в Access

Только добавление в Access этих данных (они все новые для таблицы в нём)? Или более сложный случай, что-то надо обновить, что-то удалить, что-то добавить?
 
Ответить
СообщениеSerge_007
А что подразумевается
Цитата
По окончании расчёта её надо скинуть в Access

Только добавление в Access этих данных (они все новые для таблицы в нём)? Или более сложный случай, что-то надо обновить, что-то удалить, что-то добавить?

Автор - anvg
Дата добавления - 22.04.2013 в 09:49
Serge_007 Дата: Понедельник, 22.04.2013, 10:15 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Да, надо только добавлять
Например такая таблица в январе:
ДатаНазваниеДанные
01/01/1900Товар112345
01/01/1900Товар254321
03/01/1900Товар1111
Её по окончании месяца надо слить в Access
В феврале табличка с новыми данными:
ДатаНазваниеДанные
01/02/1900Товар145
02/02/1900Товар2123
30/02/1900Товар1999
В Access, по итогам двух месяцев, должна получиться такая таблица:
ДатаНазваниеДанные
01/01/1900Товар112345
01/01/1900Товар254321
03/01/1900Товар1111
01/02/1900Товар145
02/02/1900Товар2123
30/02/1900Товар1999


Из сложностей наверное только проверка на наличие в БД уже введённых данных, что бы нельзя было повторно сгрузить уже имеющуюся в БД инфу, что бы задвоения не было


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеДа, надо только добавлять
Например такая таблица в январе:
ДатаНазваниеДанные
01/01/1900Товар112345
01/01/1900Товар254321
03/01/1900Товар1111
Её по окончании месяца надо слить в Access
В феврале табличка с новыми данными:
ДатаНазваниеДанные
01/02/1900Товар145
02/02/1900Товар2123
30/02/1900Товар1999
В Access, по итогам двух месяцев, должна получиться такая таблица:
ДатаНазваниеДанные
01/01/1900Товар112345
01/01/1900Товар254321
03/01/1900Товар1111
01/02/1900Товар145
02/02/1900Товар2123
30/02/1900Товар1999


Из сложностей наверное только проверка на наличие в БД уже введённых данных, что бы нельзя было повторно сгрузить уже имеющуюся в БД инфу, что бы задвоения не было

Автор - Serge_007
Дата добавления - 22.04.2013 в 10:15
Gustav Дата: Понедельник, 22.04.2013, 10:27 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Можно просто копипастить записи вручную: в Excel выделяются записи, которые необходимо вставить, в Access - последняя (новая) пустая запись. А чтобы не прошли двойники, в таблице Access сделать уникальный ключ (индекс) Дата+Название - при этом повторения по ходу вставки будут автоматически отфутболиваться в специальную таблицу "Ошибки вставки".


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеМожно просто копипастить записи вручную: в Excel выделяются записи, которые необходимо вставить, в Access - последняя (новая) пустая запись. А чтобы не прошли двойники, в таблице Access сделать уникальный ключ (индекс) Дата+Название - при этом повторения по ходу вставки будут автоматически отфутболиваться в специальную таблицу "Ошибки вставки".

Автор - Gustav
Дата добавления - 22.04.2013 в 10:27
Serge_007 Дата: Понедельник, 22.04.2013, 10:34 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Цитата (Gustav)
Можно просто копипастить записи вручную
Это я сейчас и делаю smile
А хочется-то чего-то белого и воздушного, типа кнопки "Копировать без участия человека" biggrin


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Цитата (Gustav)
Можно просто копипастить записи вручную
Это я сейчас и делаю smile
А хочется-то чего-то белого и воздушного, типа кнопки "Копировать без участия человека" biggrin

Автор - Serge_007
Дата добавления - 22.04.2013 в 10:34
Gustav Дата: Понедельник, 22.04.2013, 11:07 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Я бы сделал, например, так - на DAO (исполняется в Excel):
[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:\...\file.accdb")
       Set rst = db.TableDefs("ИмяТаблицы").OpenRecordset
          
       For i = 1 To 10 'цикл по записям Excel
           rst.AddNew
               rst("Поле1").Value = "первое поле из Excel"
               rst("Поле2").Value = "второе поле из Excel"
               rst("Поле3").Value = "третье поле из Excel"
           rst.Update
       Next
          
End Sub
[/vba]
Можно и на более модерновом ADO, но DAO мне исторически ближе. И меньше буковок получается в плане "строки подключения" smile

Для файлов c расширением mdb можно использовать Set dbe = CreateObject("DAO.DBEngine.36"). Это по поводу универсальности.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 22.04.2013, 11:17
 
Ответить
СообщениеЯ бы сделал, например, так - на DAO (исполняется в Excel):
[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:\...\file.accdb")
       Set rst = db.TableDefs("ИмяТаблицы").OpenRecordset
          
       For i = 1 To 10 'цикл по записям Excel
           rst.AddNew
               rst("Поле1").Value = "первое поле из Excel"
               rst("Поле2").Value = "второе поле из Excel"
               rst("Поле3").Value = "третье поле из Excel"
           rst.Update
       Next
          
End Sub
[/vba]
Можно и на более модерновом ADO, но DAO мне исторически ближе. И меньше буковок получается в плане "строки подключения" smile

Для файлов c расширением mdb можно использовать Set dbe = CreateObject("DAO.DBEngine.36"). Это по поводу универсальности.

Автор - Gustav
Дата добавления - 22.04.2013 в 11:07
anvg Дата: Понедельник, 22.04.2013, 11:12 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Не в чистом виде универсально, в силу ограничений провайдеров данных (не может Jet работать с xls? при Access mdb, ACE тут все яднее).
[vba]
Код

Public Sub AddNew()
      'Если хотя бы один из файлов 2007-2010, то
      'Const sConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Mode=Share Deny None;Data Source=c:\sap\db.accdb"
      Const sConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;;Mode=Share Deny None;Data Source=c:\sap\db.mdb"
      Dim AddSQL As String
      Dim pConn As Object, AddRSet As Object, TableRSet As Object
      Set pConn = CreateObject("ADODB.Connection"): pConn.Open sConn
      'Поменять на Excel 12.0 для версий файлов 2007-2010 (путь и имя файла с импортируемыми в Access значениями)
      AddSQL = "Select t1.[Дата],t1.[Название],t1.[Данные] From [Excel 8.0;DATABASE=c:\SAP\book1.xls;HDR=YES].[Sheet1$] As t1"
      'Заменить TableName на название таблицы в Access
      AddSQL = AddSQL & " Left Join TableName As t2 On ((t1.[Дата]=t2.[Дата]) And (t1.[Название]=t2.[Название]) And (t1.[Данные]=t2.[Данные]))"
      AddSQL = AddSQL & " Where t2.[Дата] Is Null"
      Set AddRSet = CreateObject("ADODB.Recordset"): AddRSet.CursorLocation = 3
      AddRSet.Open AddSQL, pConn, 3, 1
      If AddRSet.RecordCount = 0 Then
          MsgBox "Нет новых записей"
      Else
          Set TableRSet = CreateObject("ADODB.Recordset"): TableRSet.CursorLocation = 3
          'Заменить TableName на название таблицы в Access
          TableRSet.Open "Select [Дата],[Название],[Данные] From TableName Where [Дата] Is Null", pConn, 3, 3
          Do Until AddRSet.EOF
              TableRSet.AddNew
              TableRSet("Дата").Value = AddRSet("Дата").Value
              TableRSet("Название").Value = AddRSet("Название").Value
              TableRSet("Данные").Value = AddRSet("Данные").Value
              AddRSet.MoveNext
          Loop
          TableRSet.Update
          TableRSet.Close
      End If
      AddRSet.Close: pConn.Close
End Sub
[/vba]


Сообщение отредактировал anvg - Понедельник, 22.04.2013, 11:15
 
Ответить
СообщениеНе в чистом виде универсально, в силу ограничений провайдеров данных (не может Jet работать с xls? при Access mdb, ACE тут все яднее).
[vba]
Код

Public Sub AddNew()
      'Если хотя бы один из файлов 2007-2010, то
      'Const sConn As String = "Provider=Microsoft.ACE.OLEDB.12.0;Mode=Share Deny None;Data Source=c:\sap\db.accdb"
      Const sConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;;Mode=Share Deny None;Data Source=c:\sap\db.mdb"
      Dim AddSQL As String
      Dim pConn As Object, AddRSet As Object, TableRSet As Object
      Set pConn = CreateObject("ADODB.Connection"): pConn.Open sConn
      'Поменять на Excel 12.0 для версий файлов 2007-2010 (путь и имя файла с импортируемыми в Access значениями)
      AddSQL = "Select t1.[Дата],t1.[Название],t1.[Данные] From [Excel 8.0;DATABASE=c:\SAP\book1.xls;HDR=YES].[Sheet1$] As t1"
      'Заменить TableName на название таблицы в Access
      AddSQL = AddSQL & " Left Join TableName As t2 On ((t1.[Дата]=t2.[Дата]) And (t1.[Название]=t2.[Название]) And (t1.[Данные]=t2.[Данные]))"
      AddSQL = AddSQL & " Where t2.[Дата] Is Null"
      Set AddRSet = CreateObject("ADODB.Recordset"): AddRSet.CursorLocation = 3
      AddRSet.Open AddSQL, pConn, 3, 1
      If AddRSet.RecordCount = 0 Then
          MsgBox "Нет новых записей"
      Else
          Set TableRSet = CreateObject("ADODB.Recordset"): TableRSet.CursorLocation = 3
          'Заменить TableName на название таблицы в Access
          TableRSet.Open "Select [Дата],[Название],[Данные] From TableName Where [Дата] Is Null", pConn, 3, 3
          Do Until AddRSet.EOF
              TableRSet.AddNew
              TableRSet("Дата").Value = AddRSet("Дата").Value
              TableRSet("Название").Value = AddRSet("Название").Value
              TableRSet("Данные").Value = AddRSet("Данные").Value
              AddRSet.MoveNext
          Loop
          TableRSet.Update
          TableRSet.Close
      End If
      AddRSet.Close: pConn.Close
End Sub
[/vba]

Автор - anvg
Дата добавления - 22.04.2013 в 11:12
Serge_007 Дата: Понедельник, 22.04.2013, 12:39 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Gustav, anvg, спасибо, буду пробовать)

Добавлено (22.04.2013, 12:39)
---------------------------------------------
Начал с кода Константина, потому что его код визуально меньше smile

Подправил с учётом расположений файлов, получилось так:
[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]

Код работает правильно, но позволяет заливать одинаковые данные сколько угодно раз. Как этого избежать?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение Gustav, anvg, спасибо, буду пробовать)

Добавлено (22.04.2013, 12:39)
---------------------------------------------
Начал с кода Константина, потому что его код визуально меньше smile

Подправил с учётом расположений файлов, получилось так:
[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]

Код работает правильно, но позволяет заливать одинаковые данные сколько угодно раз. Как этого избежать?

Автор - Serge_007
Дата добавления - 22.04.2013 в 12:39
M73568 Дата: Понедельник, 22.04.2013, 13:20 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 197
Репутация: 46 ±
Замечаний: 0% ±

2007-2013
Цитата (Serge_007)
Код работает правильно, но позволяет заливать одинаковые данные сколько угодно раз. Как этого избежать?

Сделать поле1 и поле2 в Access ключевыми

К сообщению приложен файл: 8638240.jpg (55.6 Kb)
 
Ответить
Сообщение
Цитата (Serge_007)
Код работает правильно, но позволяет заливать одинаковые данные сколько угодно раз. Как этого избежать?

Сделать поле1 и поле2 в Access ключевыми


Автор - M73568
Дата добавления - 22.04.2013 в 13:20
Serge_007 Дата: Понедельник, 22.04.2013, 13:42 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Спасибо
Почему-то не даёт определить два ключевых поля...
Но и с одним фигово получилось. Вставляется только первая строка с датой 01/01/1900, а вторая, с аналогичной датой уже даёт ошибку. Какие есть ещё варианты?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеСпасибо
Почему-то не даёт определить два ключевых поля...
Но и с одним фигово получилось. Вставляется только первая строка с датой 01/01/1900, а вторая, с аналогичной датой уже даёт ошибку. Какие есть ещё варианты?

Автор - Serge_007
Дата добавления - 22.04.2013 в 13:42
Pelena Дата: Понедельник, 22.04.2013, 13:53 | Сообщение № 11
Группа: Админы
Ранг: Местный житель
Сообщений: 19409
Репутация: 4558 ±
Замечаний: ±

Excel 365 & Mac Excel
Чтобы задать двойной ключ, надо выделить сразу оба поля и нажать кнопку с ключом. Двойной ключ обеспечит уникальность именно сочетания дата-наименование


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЧтобы задать двойной ключ, надо выделить сразу оба поля и нажать кнопку с ключом. Двойной ключ обеспечит уникальность именно сочетания дата-наименование

Автор - Pelena
Дата добавления - 22.04.2013 в 13:53
M73568 Дата: Понедельник, 22.04.2013, 13:58 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 197
Репутация: 46 ±
Замечаний: 0% ±

2007-2013
Если вдруг не получится две строчки выделить сразу (ну а вдруг ;)) то жмём кнопку "Индекс" и там добавляем второе поле.

К сообщению приложен файл: 6881151.jpg (21.2 Kb)


Сообщение отредактировал M73568 - Понедельник, 22.04.2013, 14:00
 
Ответить
СообщениеЕсли вдруг не получится две строчки выделить сразу (ну а вдруг ;)) то жмём кнопку "Индекс" и там добавляем второе поле.


Автор - M73568
Дата добавления - 22.04.2013 в 13:58
Gustav Дата: Понедельник, 22.04.2013, 14:03 | Сообщение № 13
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Цитата (M73568)
Если вдруг не получится две строчки выделить сразу

... то держим Ctrl и нащёлкиваем по одной smile

ну и в коде надо будет еще Update обернуть обработкой ошибки:

[vba]
Код

      On Error Resume Next
      rst.Update
      On Error GoTo 0
[/vba]

Я так обычно делаю, а кто-то в начале процедуры пишет только первый оператор.

P.S. Хм... у нас со счетчиками сообщений всё нормально? Мне кажется, я начинал день с 526... Или в этом разделе сообщения не учитываются?


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 22.04.2013, 14:06
 
Ответить
Сообщение
Цитата (M73568)
Если вдруг не получится две строчки выделить сразу

... то держим Ctrl и нащёлкиваем по одной smile

ну и в коде надо будет еще Update обернуть обработкой ошибки:

[vba]
Код

      On Error Resume Next
      rst.Update
      On Error GoTo 0
[/vba]

Я так обычно делаю, а кто-то в начале процедуры пишет только первый оператор.

P.S. Хм... у нас со счетчиками сообщений всё нормально? Мне кажется, я начинал день с 526... Или в этом разделе сообщения не учитываются?

Автор - Gustav
Дата добавления - 22.04.2013 в 14:03
Serge_007 Дата: Понедельник, 22.04.2013, 14:22 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Всем спасибо
С ключевыми полями разобрался, ошибки будем выводить пользователю
Вот только даже три ключевых поля не спасут отца русской демократии sad

Теоретически, хотя и маловероятно, в один день могут быть привезены несколько раз одинаковое количество одного и того же товара. Как вариант, думаю можно нумеровать строки в Excel, а ключевым полем сделать аналогичное в Access

Это если не найдётся других вариантов. Я думал что можно как-то сверять данные на листе и данные в БД блоком (например Range("a1:c3")=трём записям в трёх полях) и если строки блока присутствует в БД - выдавать предупреждение


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеВсем спасибо
С ключевыми полями разобрался, ошибки будем выводить пользователю
Вот только даже три ключевых поля не спасут отца русской демократии sad

Теоретически, хотя и маловероятно, в один день могут быть привезены несколько раз одинаковое количество одного и того же товара. Как вариант, думаю можно нумеровать строки в Excel, а ключевым полем сделать аналогичное в Access

Это если не найдётся других вариантов. Я думал что можно как-то сверять данные на листе и данные в БД блоком (например Range("a1:c3")=трём записям в трёх полях) и если строки блока присутствует в БД - выдавать предупреждение

Автор - Serge_007
Дата добавления - 22.04.2013 в 14:22
LightZ Дата: Понедельник, 22.04.2013, 22:20 | Сообщение № 15
Группа: Авторы
Ранг: Форумчанин
Сообщений: 120
Репутация: 48 ±
Замечаний: 0% ±

Цитата (Serge_007)
Я думал что можно как-то сверять данные на листе и данные в БД блоком

Не, так нельзя, только циклом


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296
 
Ответить
Сообщение
Цитата (Serge_007)
Я думал что можно как-то сверять данные на листе и данные в БД блоком

Не, так нельзя, только циклом

Автор - LightZ
Дата добавления - 22.04.2013 в 22:20
Serge_007 Дата: Понедельник, 22.04.2013, 22:48 | Сообщение № 16
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Пусть циклом. Как это сделать в Access?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеПусть циклом. Как это сделать в Access?

Автор - Serge_007
Дата добавления - 22.04.2013 в 22:48
Gustav Дата: Понедельник, 22.04.2013, 23:18 | Сообщение № 17
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Цитата (Serge_007)
Пусть циклом. Как это сделать в Access?

"А пожалуйста!" (с) О чем говорят мужчины
Например, такой перебор записей набора с учетом фильтра (WHERE):
[vba]
Код
Sub traverseRecordset()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\...\file.accdb")
     Set rst = db.OpenRecordset("SELECT * FROM Таблица1 WHERE 1=1")
          
     Do While Not rst.EOF 'цикл по записям
      
         'бла-бла-бла: что-то делаем с очередной записью
         'например, "трогаем" значение первого поля
         Debug.Print rst.Fields(0).Value
          
         rst.MoveNext
     Loop
          
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Цитата (Serge_007)
Пусть циклом. Как это сделать в Access?

"А пожалуйста!" (с) О чем говорят мужчины
Например, такой перебор записей набора с учетом фильтра (WHERE):
[vba]
Код
Sub traverseRecordset()

     Dim dbe As Object 'DAO.DBEngine
     Dim db  As Object 'DAO.Database
     Dim rst As Object 'DAO.Recordset
          
     Set dbe = CreateObject("DAO.DBEngine.120")
     Set db = dbe.OpenDatabase("C:\...\file.accdb")
     Set rst = db.OpenRecordset("SELECT * FROM Таблица1 WHERE 1=1")
          
     Do While Not rst.EOF 'цикл по записям
      
         'бла-бла-бла: что-то делаем с очередной записью
         'например, "трогаем" значение первого поля
         Debug.Print rst.Fields(0).Value
          
         rst.MoveNext
     Loop
          
End Sub
[/vba]

Автор - Gustav
Дата добавления - 22.04.2013 в 23:18
Serge_007 Дата: Понедельник, 22.04.2013, 23:31 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Gustav, спасибо, проверить смогу только завтра

Подскажи, это поможет в случае если
Цитата (Serge_007)
в один день могут быть привезены несколько раз одинаковое количество одного и того же товара


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение Gustav, спасибо, проверить смогу только завтра

Подскажи, это поможет в случае если
Цитата (Serge_007)
в один день могут быть привезены несколько раз одинаковое количество одного и того же товара

Автор - Serge_007
Дата добавления - 22.04.2013 в 23:31
Gustav Дата: Понедельник, 22.04.2013, 23:52 | Сообщение № 19
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1183 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
нуу, даа, наверное... это ведь не более, чем цикл - а цикл он и в Африке цикл smile
как его запряжешь - так и повезет

но тебе надо вводить счетчик строк в этом случае - уникальный id записи
чтобы различать такие абсолютно одинаковые привозы


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщениенуу, даа, наверное... это ведь не более, чем цикл - а цикл он и в Африке цикл smile
как его запряжешь - так и повезет

но тебе надо вводить счетчик строк в этом случае - уникальный id записи
чтобы различать такие абсолютно одинаковые привозы

Автор - Gustav
Дата добавления - 22.04.2013 в 23:52
anvg Дата: Вторник, 23.04.2013, 06:07 | Сообщение № 20
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Цитата
Я думал что можно как-то сверять данные на листе и данные в БД блоком

В виде SQL запроса можно, как вариант к версии, выбирающий записи в таблице и листе по совпадению трёх полей
[vba]
Код

      ExistsSQL = "Select t1.[Дата],t1.[Название],t1.[Данные] From [Excel 8.0;DATABASE=c:\SAP\book1.xls;HDR=YES].[Sheet1$] As t1"
      ExistsSQL = ExistsSQL & " Inner Join TableName As t2 On ((t1.[Дата]=t2.[Дата]) And (t1.[Название]=t2.[Название]) And (t1.[Данные]=t2.[Данные]))"
      Set ExistsRSet = CreateObject("ADODB.Recordset"): ExistsRSet.CursorLocation = 3
     ExistsRSet.Open ExistsSQL, pConn, 3, 1
      If ExistsRSet.RecordCount > 0 Then
          Set pSheet = ActiveWorkbook.Worksheets
          pSheet.Range("A1:C1").Value = Array("Дата", "Название", "Данные")
          pSheet.Range("A2").CopyFromRecordset ExistsRSet
          MsgBox "Создан лист дубликатов"
      End If
      ExistsRSet.Close
[/vba]
Собственно, почти тоже самое используется в запросе на добавление AddSQL для отбора с листа записей, которые по всем трём полям не совпадают с существующими в таблице.

По поводу первичного ключа. У вас же товар приходит по какой-то накладной или нечто подобное. Её и можно добавить в качестве элемента ключа: дата, название, накладная.
Или вариант: дата, название, время ввода в таблицу.
Или некоторое строковое значение - код ввода, получаемое как запрос к FileSystemObject.GetTempName: дата, название, кодВвода
[vba]
Код

Public Function GetPKey()
      Dim fso As Object, sKey As String
      Set fso = CreateObject("Scripting.FileSystemObject")
      sKey = fso.GetTempName
      GetPKey = Mid$(sKey, 1, Len(sKey) - 4)
End Function
[/vba]


Сообщение отредактировал anvg - Вторник, 23.04.2013, 06:11
 
Ответить
Сообщение
Цитата
Я думал что можно как-то сверять данные на листе и данные в БД блоком

В виде SQL запроса можно, как вариант к версии, выбирающий записи в таблице и листе по совпадению трёх полей
[vba]
Код

      ExistsSQL = "Select t1.[Дата],t1.[Название],t1.[Данные] From [Excel 8.0;DATABASE=c:\SAP\book1.xls;HDR=YES].[Sheet1$] As t1"
      ExistsSQL = ExistsSQL & " Inner Join TableName As t2 On ((t1.[Дата]=t2.[Дата]) And (t1.[Название]=t2.[Название]) And (t1.[Данные]=t2.[Данные]))"
      Set ExistsRSet = CreateObject("ADODB.Recordset"): ExistsRSet.CursorLocation = 3
     ExistsRSet.Open ExistsSQL, pConn, 3, 1
      If ExistsRSet.RecordCount > 0 Then
          Set pSheet = ActiveWorkbook.Worksheets
          pSheet.Range("A1:C1").Value = Array("Дата", "Название", "Данные")
          pSheet.Range("A2").CopyFromRecordset ExistsRSet
          MsgBox "Создан лист дубликатов"
      End If
      ExistsRSet.Close
[/vba]
Собственно, почти тоже самое используется в запросе на добавление AddSQL для отбора с листа записей, которые по всем трём полям не совпадают с существующими в таблице.

По поводу первичного ключа. У вас же товар приходит по какой-то накладной или нечто подобное. Её и можно добавить в качестве элемента ключа: дата, название, накладная.
Или вариант: дата, название, время ввода в таблицу.
Или некоторое строковое значение - код ввода, получаемое как запрос к FileSystemObject.GetTempName: дата, название, кодВвода
[vba]
Код

Public Function GetPKey()
      Dim fso As Object, sKey As String
      Set fso = CreateObject("Scripting.FileSystemObject")
      sKey = fso.GetTempName
      GetPKey = Mid$(sKey, 1, Len(sKey) - 4)
End Function
[/vba]

Автор - anvg
Дата добавления - 23.04.2013 в 06:07
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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