Страницы: 1
RSS
Внесение изменений в таблицу файла *.mdb из Excel, правка таблицы Access без самого Access
 
Коллеги, день добрый.

Помогите, плз, советом.
Есть программка, созданная, похоже, на MS Access. Нужная мне информация содержится в файле MDB. Но самого Access на компе нет, и в ближайшее время не предвидится.

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

А вот дальше мне нужно засунуть измененную таблицу (достаточно только измененные строки) обратно в MDB, чтобы всё заверте...
Как это сделать за один раз? На крайний случай, как это сделать по Worksheet_Change?

По форуму порылся, нашел только это. Но так как сам в ADO и SQL полный нуб, то поправить под себя макросы не выходит.

БД расположена тут: E:\Product.mdb и запаролена (предположим, пароль Pass1)
Интересующая меня таблица называется _TRANSLATE, имеет поля ID, INDEX , English , Chinese , Russian, и т.д. языки (еще 13 шт.). Скорее всего, ID - ключевое поле.
После импорта табличка становится таблицей Excel с именем "Таблица_Product"

Пытался адаптировать вот такой макрос:

но ругается на немонопольный доступ на команде CN.Open
Что не так, куды рыть?
F1 творит чудеса
 
Цитата
Максим Зеленский написал: куды рыть?
? первое, что подумалось
Код
 PersistSecurity Info = True
не факт - но лучше проверить... если уже на 13-й строке ругается... ?
Цитата
Значением по умолчанию для ключевого слова PersistSecurity Info является false.  Значение true или yes позволяет получить из строки соединения конфиденциальные данные (в том числе идентификатор пользователя и пароль) после открытия соединения.  Если ключевое слово PersistSecurity Info равно false, то ненадежный источник не сможет получить доступ к конфиденциальным данным строки подключения.
Изменено: JeyCi - 29.06.2015 17:06:11
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, спасибо, но не помогло.
Ошибка та же:

Помогло вот так (отсюда):
Код
CN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath & ";Jet OLEDB:Database Password=Pass1"

и тут же другая ошибка:

на строке
Код
RS.Open "SELECT * FROM _TRANSLATION Where ID=" & Cells(Target.Row, 1).Value, CN, adOpenStatic, adLockOptimistic

Похоже, ошибка синтаксиса
F1 творит чудеса
 
Максим Зеленский, Максим, так название таблицы _TRANSLATE или _TRANSLATION?  
Учусь программировать :)
 
Цитата
Smiley написал: _TRANSLATE или _TRANSLATION
да и взять бы его в [ ] ... да и чёрточка смущает... она в SQL вроде означает любой символ. как ? в vba
p.s. пример работы с access
Изменено: JeyCi - 29.06.2015 17:34:18
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, не обязательно. Достаточно просто указать имя таблицы в Access.
Учусь программировать :)
 
Smiley, Спасибо!!!! Вот блин, а я уже на мыло изошел - и в квадратные скобки, и как только не. Замылился глаз.
Все заработало.
Осталось только теперь переделать под единовременную загрузку обратно в базу. Я так понимаю, надо либо циклом (что вроде как бээээ), либо другим способом.
Есть какой-нибудь шустрый способ сразу выгрузить таблицу в mdb?
F1 творит чудеса
 
Максим Зеленский, тут не подскажу, никогда обратным действием не занимался :) Кстати, подключаться можно чуть попроще, мне кажется...
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CN As ADODB.Connection 'ADODB.Connection
Dim RS As ADODB.Recordset 'ADODB.Recordset
Set CN = New ADODB.Connection 'New ADODB.Connection
CN = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=E:\Product.mdb;Uid=Admin;Pwd=""Pass1"";"
CN.Open
Set RS = New ADODB.Recordset 'New ADODB.Recordset
RS.Open "SELECT * FROM _TRANSLATION Where ID=" & Cells(Target.Row, 1).Value, CN, adOpenStatic, adLockOptimistic
'-------
RS.Close
CN.Close
End Sub
Изменено: Smiley - 29.06.2015 17:43:44
Учусь программировать :)
 
Цитата
Smiley написал: Достаточно просто указать имя таблицы в Access.
ну, вобщем, да... :) если оно без пробелов... но первый символ мне всё равно не нравится в названии таблицы... пока Максим не напишет, как правильно и как сработает... упс, уже написал... вот и замечательно
Изменено: JeyCi - 29.06.2015 17:49:25
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Максим Зеленский, может это поможет excel to access
Учусь программировать :)
 
Цитата
Smiley написал: Dim CN As ADODB.Connection
Тут надо подключать референс, а я в них уже запутался. То ли 6.1, то ли какой-то другой...
F1 творит чудеса
 
Максим Зеленский, у меня 2010, я везде тыкаю 6.0 и все работает :) Только надо не забывать подключать сам провайдер :)
Учусь программировать :)
 
а позднее связывание не проходит?
Код
Dim CN As Object, RS As Object
Set CN = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
Изменено: JeyCi - 29.06.2015 18:03:16
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Максим Зеленский написал: Осталось только теперь переделать под единовременную загрузку обратно в базу. Я так понимаю, надо либо циклом (что вроде как бээээ), либо другим способом.
1) по-хорошему, надо UPDATE делать в самой sql-инструкции (пост TheBest'a) ...
2) по примеру "Экспорт из Excel в SQL Server" - примерно вариант "как бы" длинный - (пост Xapa6apga) - но только вставит, полагаю, без разбора - что дадите ему...
3) по примеру "импорт excel -access. VBA" - вариант INSERT INTO от anvg (Андрей) - тоже вставит в таблицу (уже существующую!)
p.s. за вариантами 2-3 потом (или до того), полагаю, надо будет почистить саму БД.mdb от этих записей, ещё не исправленных... если это быстро для единовременной загрузки...
p.p.s  примеры этих 3х вариантов на выбор, если подойдут   8) - однозначно с ходу не скажу, но, видимо, где-то в этом русле...
Изменено: JeyCi - 29.06.2015 18:56:53
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Спасибо всем, завтра буду добивать. Пока в результате простых вроде бы действий размер БД вырос в 2 раза... :( исправил всего с 20-30 строк.
F1 творит чудеса
 
Так и не опробовал массовую загрузку - удалось добыть комп с Access, надобность отпала.
В любом случае всем спасибо, потащу в копилку.
F1 творит чудеса
 
Цитата
Максим Зеленский написал: Пока в результате простых вроде бы действий размер БД вырос в 2 раза...  
насколько я поняла - такое бывает... потом в Access (2010): Работа с БД --> (Сервис) --> Сжать и восстановить БД... чтобы базу привести в нормальные размеры... но, в принципе, да, из xl править бд - видимо, не очень удобно?
p.s. может быть, только если связать бд в access с xl (как внешним источником)... поправить, что надо... и разорвать эту связь в access... - но для этого тоже нужен access... если таким вариантом работает?
Изменено: JeyCi - 08.07.2015 10:43:10
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Максим Зеленский написал: Пока в результате простых вроде бы действий размер БД вырос в 2 раза...
видимо, для таких случаев встретился Compact Access Database ... смущает провайдер Jet.OLEDB, а не ACE.OLEDB для более старших версий xl... но при случае проверю - отпишусь, а пока просто кодом (вероятным)... раз уж стоял на повестке того дня этот вопрос  8)

Скрытый текст

P.S. если колдовать над кодом и не использовать позднее связывание - то пригодится Tools/Reference -> Microsoft Jet and Replication Objects Library - как здесь
Изменено: JeyCi - 03.08.2015 13:48:18
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
SELECT * | { [ DISTINCT | ALL ] { Поле данных } [,...] } FROM { таблица [ псевдоним ] } [,...] [ WHERE условие ] .....
SELECT возвращает как результат строки данных, которые создаются из данных, содержащихся в указанных исходных таблицах данных.

Для обратной загрузки используется команда:
INSERT INTO таблица [ ( поле [,...] ) ] { VALUES ( Wertliste [,...] ) } -  для добавления новых записей в БД
UPDATE таблица SET { поле=значение } [,...] [ { WHERE условие } ] ; - для замещения текущих записей в БД

UPDATE _TRANSLATE
SET ID =INDEX = 'Ваш INDEX',English = Ваша запись и т.д
WHERE ID = 'ID'
Данные лучше загрузить в массив (Подклюитесь к базе) и циклом записывать таблицу
Изменено: TSN - 04.08.2015 08:25:36
Страницы: 1
Наверх