Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Передача данных из Excell в таблицу Access


Автор: Shuriman 7.12.2004, 06:50
мне тут задали задачку. нужно данные из определенных ячеек Excell перенести в определенную таблицу Access средствами VBA. Фактически вопросов несколько:
1. Как считать значения ячеек таблицы excell.
2. Как открыть для записи файл .mdb для передачи данных.
3. Можно ли будет использовать при этом функциб на добавление, которая описана в одном из модулей базы в Access.

Автор: Akina 7.12.2004, 09:11
1) Cells().Value
2) Jet/ADO/DAO
3) Зачем?

Автор: Shuriman 7.12.2004, 09:41
Akina
ну есть функция на добавление.
данные могут добавляться как из аксесса, непосредственно, так и из excell.

а можно поподробнее про первые два пункта?

Автор: HuiopHuiop 12.12.2004, 09:35
меня наоборот проблема есть
есть база данных написанная на access а надо чтобы определённые таблицы
при открытии excel постоянно брались из access
как это сделать программно ?

Автор: FINANSIST 14.5.2008, 11:40
Я при написании моделей в Excel пользовался 2 методами, в зависимости от требований
(1) Многопользовательская выгрузка из  ACCESS в EXCEL без использования технологии D.A.O.                                                                
Требования:                                                    
1) ДАННЫЕ ИЗ БАЗЫ ДОЛЖНЫ ГРУЗИТЬСЯ И ОБНОВЛЯТЬСЯ В НЕОГРАНИЧЕННОЕ КОЛИЧЕСТВО МОДЕЛЕЙ EXCEL                
2) ДАННЫЕ ИЗ БАЗЫ ДОЛЖНЫ ГРУЗИТЬСЯ И ОБНОВЛЯТЬСЯ ОДНОВРЕМЕННО ДЛЯ НЕСКОЛЬКИХ ПОЛЬЗОВАТЕЛЕЙ В РЕЖИМЕ ON-LINE        
3) ДАННЫЕ ИЗ БАЗЫ ДОЛЖНЫ ГРУЗИТЬСЯ И ОБНОВЛЯТЬСЯ  РЕАГИРУЯ НА СОБЫТИЯ В МОДЕЛЯХ EXCEL                    
4) ДАННЫЕ ИЗ БАЗЫ ДОЛЖНЫ ГРУЗИТЬСЯ И ОБНОВЛЯТЬСЯ ВНЕЗАВИСИМОСТИ ОТ ТЕКУЩЕГО МЕСТА СОХРАНЕНИЯ МОДЕЛЕЙ EXCEL (ЛИБО МЕСТА ПЕРЕМЕЩЕНИЯ МОДЕЛЕЙ EXCEL) КАК НА ЖЁСТКИХ ДИСКАХ, ТАК И В ЛОКАЛЬНЫХ СЕТЯХ                        
5) ДАННЫЕ ИЗ БАЗЫ ДОЛЖНЫ ГРУЗИТЬСЯ И ОБНОВЛЯТЬСЯ  ЗА МИНИМАЛЬНОЕ ВРЕМЯ БЕЗ ВИЗУАЛЬНОГО ОТОБРАЖЕНИЯ ПРОЦЕССА ОБНОВЛЕНИЙ И ДИАЛОГОВЫХ ОКОН                                                    
6) ДОЛЖНА СУЩЕСТВОВАТЬ ВОЗМОЖНОСТЬ ПРЕДВАРИТЕЛЬНОЙ ГРУППИРОВКИ,СОРТИРОВКИ ЛИБО ДРУГИХ ДЕЙСТВИЙ С ДАННЫМИ ПЕРЕД ВЫГРУЗКОЙ В МОДЕЛИ                                                        
7) ДАННЫЕ ДОЛЖНЫ ЗАГРУЗИТЬСЯ ОДИН РАЗ И ОСТАВАТЬСЯ В ПАМЯТИ МОДЕЛИ, НЕЗАВИСИМО ОТ ТОГО ВИСИТ ДИАЛОГОВАЯ ФОРМА, ИЛИ ОНА УЖЕ ВЫГРУЖЕНА                                                                
СПРАВКА:                                                        
Файлы запросов представляют собой текстовые файлы, содержащие сведения об источнике данных. Хранящийся набор сведений об «источнике», служащих для подключения к базе данных. Источник данных может содержать сведения об имени и местоположении сервера баз данных, имени драйвера базы данных, а также данные, которые могут потребоваться для подключения к базе, включая имя сервера, на котором хранятся данные, и информацию о подключении, вводимую при создании источника данных. Файлы запросов позволяют осуществлять доступ к запросам совместно с другими пользователями.        
Реализованная технология]
                                                                
В модели формируется лист "справочник" для выгрузки данных                                
Данные//Импорт внешних данных//Создать запрос                                    
Отключаем мастер отчётов и подключаемся к базе данных                                
Выполняем в Microsoft Query предварительную обработку ( если таковая требуется)                            
Сохраняем запрос и выгружаем данные в справочник                                        
Правый клик на данных//Свойства диапозона данных                                        
 - Обязательна галка на "сохранить определение запроса"                                    
 - Обязательна галка на "фоновое обновление"                                        
 - Желательна галка на "включить имена полей"                                        
 - Выбрать  пункт в блоке "Если количество строк в диапозоне изменится:"                                
Выделяем ячейку с первой записью (на строку ниже заголовка) и присваиваем ей имя (напр. "MacroStart")                    
Всвязи с тем что справочник с таким запросом не может быть защищён ( иначе запрос не обновится),мы его скрываем через VBA, чтобы пользователь не мог его отобразить    (Properties//xlSheetVeryHidden)                                    
Пишем код обновления запроса на события:
Код

List = ActiveSheet.Name
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Sheets("справочник").Visible = True
Sheets("справочник").Activate
ActiveSheet.Range("MacroStart").Select '-например это первый контрагент по списку
Selection.QueryTable.Refresh BackgroundQuery:=False '-обновляемся
Sheets(List).Select
Application.Sheets("справочник").Visible = xlVeryHidden
Application.ScreenUpdating = True
Application.EnableEvents = True



Добавлено через 2 минуты и 15 секунд
Многопользовательская выгрузка из  ACCESS в EXCEL c использованием технологии D.A.O.
(Необходимо подключить библиотеку Microsoft DAO 3.6 Object Library !!!!)
"Пример1: Есть в Экселе на листе элемент управления ComboBox1 
(Список), необходимо внести в него уникальный список контрагентов из БД"
        
Код

Dim dbAccess As Database
        Dim reRecordSet As Recordset
        Dim stSQL As String
    On Error GoTo ErrorsDB
    Set dbAccess = OpenDatabase("\\server\обмен\Финансовый отдел\БазыДанных\ContractorsBase.mdb") 
    stSQL = "SELECT distinct Contractors.ContraName FROM Contractors order by Contractors.ContraName "
    Set reRecordSet = dbAccess.OpenRecordset(stSQL) ' - коннектимся
    If (reRecordSet.RecordCount > 0) Then
       reRecordSet.MoveFirst
       Do While Not reRecordSet.EOF
       Name = reRecordSet!ContraName   ' - обязательно имя используемого поля базы данных "ContraName"
     Sheets(1).ComboBox1.AddItem Name
        reRecordSet.MoveNext
       Loop
    Else
        MsgBox "Not Found"
    End If
     reRecordSet.Close
        dbAccess.Close
        GoTo Ends
ErrorsDB:
    MsgBox "Произошла ошибка"
Ends:
End Sub

Пример2: Необходимо заполнить таблицу
Код

Sub DAO()
Dim dbs As Database
Dim recset As Recordset
Dim rSql As String
Set dbs = OpenDatabase("\\server\обмен\Финансовый отдел\Ананьев Г.А\Базы_Данных_Access\BUDJETS_DATA_1.0.mdb")
rSql = "SELECT OPERLIST.Autor, OPERLIST.DateRecord, OPERLIST.Source, OPERLIST.Sum_Budjet "
rSql = rSql & " FROM OPERLIST WHERE (((OPERLIST.Org_Name) Like '*лимп*'));" ' - перенос строки SQL на новую
Set recset = dbs.OpenRecordset(rSql)
recset.MoveLast '-передвигаемся к последней записи, чтобы показать общее число записей т.к. RecordCount отражает только текущую запись
Debug.Print recset.RecordCount & " - число записей " ' - показываем в Immediate число записей
Debug.Print recset.Fields.Count & " - число столбцов " ' - показываем в Immediate число столбцов
recset.MoveFirst
For Col = 0 To recset.Fields.Count - 1
        ActiveCell.Offset(0, Col).Value = recset.Fields(Col).Name ' - пробиваем в Excel заголовки таблицы
    Next Col
ActiveCell.Offset(1, 0).Select
Do While Not recset.EOF
    For Col = 0 To recset.Fields.Count - 1
        ActiveCell.Offset(0, Col).Value = recset.Fields(Col).Value ' - заполняем таблицу
    Next Col
    recset.MoveNext
    ActiveCell.Offset(1, 0).Activate
Loop
recset.Close
dbs.Close
End Sub

Автор: bopoha 14.5.2008, 12:40
Очень сильно сомневаюсь, что в первом случае DAO не используется. Может в mdb ссылка и не нужна, а вот для доступа со сторны Excel в Access она понадобиться.

Чтобы не приходилось делать recset.MoveLast при открытии набора используется параметр dbOpenSnapshot.

По поводу первого варианта - можно готовый пример?

Автор: FINANSIST 28.5.2008, 16:32
Ага, лови! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)