Страницы: 1
RSS
Access - Excell-Access
 
Уважаемые знатоки! Вопрос следующий: Есть база данных  Access.  Необходимо заменить в ней часть данных и добавить еще. В Access для меня -"великого спеца" долго и нужно. Но могу довольно просто это сделать в Excell. А вот как все это вернуть в Access?? Нашел, что это можно сделать через   AccessLinks. Не могу найти эту надстройку. Использую офис 2007. Кто подскажет, где это чудо сыскать? Спасибо
 
В Access меню файл - внешние данные - импорт
Я сам - дурнее всякого примера! ...
 
Пардон, не заметил, что речь о 2007.
Я сам - дурнее всякого примера! ...
 
Оф.сайт - http://office.microsoft.com/ru-ru/access/HA012194191049.aspx <BR>Z.
 
А в аксессе поиск и замена не пробовали?
 
Пытался конечно, но видно ручки шаловливые заточены "для стрельбы из-за угла". Ну а без шуток access рисует, что не удалось выполнить добавление в таблицу данных из-за нарушения уникальности ключа?? Просто не знаю о чем идет речь
 
{quote}{login=csn2004}{date=15.04.2010 10:48}{thema=}{post}Пытался конечно, но видно ручки шаловливые заточены "для стрельбы из-за угла". Ну а без шуток access рисует, что не удалось выполнить добавление в таблицу данных из-за нарушения уникальности ключа?? Просто не знаю о чем идет речь{/post}{/quote}  
 
 
 
наверное у вас вся проблема в том как изменить данные в аксесе  
алгоритм наверное будет такой  
1.сделать подключение к аксес (предлагаю через ODBC )  
2.вывести нужный диапазон БД в екселе обязательно с (ключом поля для того чтобы затем легче найти строку в аксесе при экспорте)  
3. фильтром или макросом отобрать нужные значения (для правки)  
4.собственно сама правка  
5.экспорт в аксес (макрос)  
 
первые четыре пункта без проблем а вот пятый в нете нашел  
 
 
gimmy  
17.04.2007, 12:58  
Стоит задача, при изменении значения в ячейки смотреть есть ли такая запись в базе Access, и если нет, то добавлять, а если есть то обновлять.  
Таблица в Access состоит из двух полей Код и Значение.  
Как передать в запрос на SQL переменные объявленные в эксель.  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
.....  
Dim objName As Name  
Set objName = Target.Name  
NameCell = Trim(objName)  
ValueCell = Target  
...............  
dbData.Execute "INSERT INTO zakaz (kod1C,kol) VALUES (NameCell, ValueCell )"  
 
 
mikle  
17.04.2007, 14:48  
Вот так можно:  
dbData.Execute "INSERT INTO zakaz (kod1C,kol) VALUES ('" & NameCell & "', '" & ValueCell & "')"  
 
Вообще, есть несколько способов организовать передачу данных: ADO, DAO, использование COM-сервера Access, etc. Наиболее подходящий из них, на мой взгляд, ADO. Смотрите встроенную справку VBA на предмет ADODB.Connection, ADODB.Recordset, ADODB.Command  
 
Учтите, что задача кажется плохо поставленной. ИМХО не существует ситуации, в которой бы оправдано было   загружать    
изменения в базу данных после каждого изменения ячейки. Это весьма накладная процедура. Скорее всего, оптимальным будет загрузка изменений, например, при выполнении команды "Сохранить" Excel'я (логично, правда? ;) ) В таком случае можно вообще обойтись почти без программирования, если есть возможность присоединить    
данную    
таблицу    
екселя    
как внешнюю к базе    
аксеса . Или же использовать все-таки ADO.  
 
Вот текст достаточно универсальной функции для Access, которая загружает данные из таблицы Excel. Работает довольно медленно в силу поячеечного обращения к экселю.  
'Процедура ЗагрузкаИзExcel  
'Загрузка данных с листа Excel в соответствующую по структуре таблицу с указанием  
'номера первой строки, содержащей данные. Загрузка ведется до конца диапозона  
'параметры:  
'Таблица - имя таблицы в которую будут загружаться данные  
'Файл - полное имя файла (с путем) рабочей книги Excel  
'Лист - имя листа Excel  
'ПервСтрока - номер первой строки, содержащей данные  
Function ЗагрузкаИзExcel(Таблица As String, Файл As String, Лист, ПервСтрока As Long)  
Dim app, wb, rst As New ADODB.Recordset, i As Long, j As Integer  
On Error GoTo ErrorHandler  
Set app = CreateObject("Excel.Application")  
Set wb = app.workbooks.Open(Файл)  
rst.Open Таблица, CurrentProject.Connection, adOpenStatic, adLockOptimistic  
With wb.Worksheets(Лист)  
For i = ПервСтрока To .UsedRange.Rows.Count  
rst.AddNew  
For j = 1 To rst.Fields.Count 'Форматы таблиц должны совпадать!  
rst.Fields(j - 1) = .Cells(i, j)  
Next j  
Next i  
End With  
rst.Update  
rst.Close  
wb.Close  
GoTo Done  
ErrorHandler:  
MsgBox "Ошибка при загрузке. Ряд " & i & " Столбец " & j  
Done:  
Set rst = Nothing  
Set wb = Nothing  
Set app = Nothing  
End Function  
 
 
mastadon  
17.04.2007, 16:05  
можно с помощью функции если определить значения, а потом копировать и вставить (как значения) на старое место  
 
 
AlexeyVik  
18.04.2007, 13:09  
mikle, задача была с точностью наоборот, из Excel'я передать в Access.  
 
Вот основная часть кода "Private Sub Worksheet_Change(ByVal Target As Range)"  
.................  
Dim Baza As Database, rs As Recordset, rs1 As Recordset  
Set Baza = OpenDatabase(ThisWorkbook.Path & "\имя.mdb", False)' можно указать в кавычках полный путь к базе'  
Set rs = Baza.OpenRecordset("Имя_таблицы", dbOpenDynaset)  
Kod=Sheets("имя_листа_книги").Range("ячейка_содержащая _код")  
QryStr = "SELECT * FROM Имя_таблицы WHERE Имя_таблицы.поле =Kod"  
Set QRY1 = Baza.CreateQueryDef("")  
QRY1.Sql = QryStr  
Set rs1 = QRY1.OpenRecordset(dbOpenDynaset)  
 
Здесь добавить обработку ошибки возникающую при отсутствии такого кода.  
Если такой код есть  
rs1.Edit  
rs1.Fields("поле") = Target  
rs1.Update  
Если - нет  
rs.AddNew  
rs.Fields("имя_поля_таблицы") = Sheets("имя_листа_книги").Range("ячейка_содержащая_код")  
rs.Fields("имя_поля_таблицы") = Sheets("имя_листа_книги").Range("ячейка_содержащая_значение")  
rs.Update  
конец если  
Baza.Close  
Set rs = Nothing  
Set rs1 = Nothing  
...................  
 
 
mikle  
18.04.2007, 23:55  
задача была с точностью наоборот, из Excel'я передать в Access.Что от чего наоборот? ^_^  
 
 
makody  
20.04.2007, 15:06  
Делаем в проекте ссылку на MS ADO 2.5. после чего можно использовать следующий код:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
 
Dim CN As ADODB.Connection  
Dim RS As ADODB.Recordset  
Dim sPath As String  
 
sPath = "C:\test.mdb"  
 
Set CN = New ADODB.Connection  
CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath & ";Persist Security Info=False"  
CN.Open  
 
RS = New ADODB.Recordset  
 
RS.Open "SELECT * FROM Table1 Where NameCell=" & Trim(Target.Name), CN, adOpenStatic, adLockOptimistic  
 
If RS.EOF Then  
RS.AddNew  
RS.Fields("NameCell").Value = Trim(Target.Name)  
End If  
RS.Fields("ValueCell").Value = Target.Value  
RS.Update  
 
RS.Close  
CN.Close  
 
End Sub  
 
и еще одна ссылка  
 
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=53209
Спасибо
 
Спасибо откликнувшимся. Научился (стандартными средствами Access) вставлять одну таблицу в другую. Пока неясно как выделить и удалить сразу N строк из базы.
 
На вкладке Конструктор в группе Тип запроса выберите команду Удаление.    
Те записи что выводятся при простом запросе Выбрать. Они удалятся.
 
БОЛЬШУУУУЩЕЕ  СПАСИБО!!!
Страницы: 1
Читают тему
Наверх