MyTetra Share
Делитесь знаниями!
Функция для импорта таблиц из формы
Время создания: 16.03.2019 23:43
Текстовые метки: access, vba_access, спецификации
Раздел: Разные закладки - VBA - Access - Спецификации
Запись: xintrea/mytetra_db_adgaver_new/master/base/1484023049kctspi33tg/text.html на raw.githubusercontent.com

Есть ли функция на VBA которая позволяла бы импортировать таблицы из excel и .txt?



А где, собсвенно VBA? В Excel или в Access?
В Excel это метод SaveAs, в Access можно тот же метод для объекта, созданного методом GetObject("Путь к XLS), можно DoCmd.TransferText из прилинкованной таблицы Excel, а можно не линкуя таблицу запросом SELECT * INTO ... с соответств. строками подключения к источнику и адресату.



В Аксесс.
Есть как понял функция для импорта из эксель:

автор

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TestTable2", "c:\a.xls", 0


Но она импортирует только первый лист. Как можно указать, конкретный лист для импорта?



пытаюсь импортировать с txt файла, но разделитель у меня в файле это tab. как можно изменить спецификацию, чтобы вместо ; был tab?

автор

DoCmd.TransferText acImportDelim, , "table", "c:\b.txt", False


В инете все пишут про scheme.ini. Поискал на компе, нет такого файла.


Вы не дочитали описание TransferSpreadsheet ровно на 1 параметр. Следующий же из пропущенных это Range, в котором можно описать лист екселя или диапазон

Kuatishe

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TestTable2", "c:\a.xls", 0, "Лист2$"




Добавлю.
Мне кажется более удобным импортировать с помощью запроса.

select * into TestTable2

from [Лист2$] as x IN 'c:\a.xls'[Excel 8.0;HDR=yes;]


Кстати, во From можно задавать произвольный диапазон, например [Лист2$a20:d2000]



В-общем догнал что за файл, создал его, вот его параметры:

автор

[b.txt]
ColNameHeader=False
Format=Delimited( )
MaxScanRows=0
DecimalSymbol=.
CharacterSet=ANSI


разделитель здесь это пробел, но при импорте все равно все данные сохраняются в один столбец таблицы.
хелп! как можно импортировать так, чтобы данные после пробелов сохранялись в отдельный столбец? Варианты кроме смены настроек в реестре.



Для импорта/экспорта/связывания в Access предусмотрены спецификации. При импорте через меню вы попадаете в мастер настройки спецификации, создаете, сохраняете, и в дальнейшем можете использовать ее:
DoCmd.TransferText acImportDelim, "Имя спецификации" , "table", "c:\b.txt", False

Родная для текстового драйвера спецификация, это файл scheme.ini. Его тоже можно использовать.
Подробнее обо всем этом почитайте здесь




Всем спасибо, за помощь.
Напишу-ка я резюме по теме, чтобы кто будет искать, мог получить более-менее исчерпвыающий ответ.
Есть разные варианты импорта txt и xls файлов, один из них использование функций:
1) для txt файлов я использовал DoCmd.TransferText. Вот мой пример:0
DoCmd.TransferText acImportDelim, , "Text", "c:\b.txt"
acImportDelim - это означает что будет производиться импорт.
, , - значит используется параметр по умолчанию(разделитель столбцов)
"text"- имя таблицы куда будет импортирован файл.
"c:\b.txt" - путь и имя txt файла, откуда будет производиться импорт.


2) для xls файлов я использовал DoCmd.TransferSpreadsheet, вот пример использования:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TestTable1", "c:\a.xls", 0, "Sheet$"
acImport - будет произоводиться импорт.
acSpreadsheetTypeExcel9 - некий параметр, незнаю что означает.
"TestTable1" - имя таблицы в Аксесс, куда будет все импортироваться.
"c:\a.xls" - путь и имя файла.
0 - не знаю зачем.
"Sheet$" - имя листа из книги xls, который будет импортирован в таблицу.




А что ж запросом то не попробовали? Гибче чем трансфером. Хотя бы для того, чтобы не плодить таблицы, можно запросом на выборку (вместо Select * Into Таблица оставить только Select *) считать данные в рекордсет и раскидать их рекордсетами также по нужным таблицам.

Посмотрите. Полезно.




спасибо, попробуем.
Вопрос по импорту и экспорту файлов:
Как можно сделать так, чтобы импорт и экспорт файлов производился в ту же директорию где и БД Аксесса, независимо от каталога, в котором находится БД?
ПРобовал с CurDir - не получается.



Текущая папка - currentproject.Path.

А что не получилось? Покажите ваш код



Я делал так:
DoCmd.TransferText acImportDelim, , "Text", CurDir & "\" & "b.txt"



CurDir - возвращает текущий/рабочий каталог в "терминалоги ДОС" - установленный инструкцией ChDir
т.е. это ниразу не каталог БД

хотя - в хелпе сделанно всё что бы так и считали ))


 
MyTetra Share v.0.65
Яндекс индекс цитирования