2015-05-01 2 views
2

У меня возникла проблема, которая возникает случайным образом (запустите ее на моей машине - она ​​работает около 90% времени, пара attemps на машине клиента она не работает 100 % времени) вот код:Импорт данных из Excel для доступа с использованием ms excel vba

sub importdata() 
Dim dbpath As String 
Dim acc As New Access.Application 
'bunch of stuff 
acc.OpenCurrentDatabase dbpath & "\Database.accdb"   
acc.DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\Dashboard 2015.04.17.xlsm", True, "DataForImport!" 
acc.CloseCurrentDatabase 
acc.Quit 
'bunch of more stuff 
end sub 

DataForImport является лист, где хранятся данные. Это в таблице; однако доступ не смог распознать имя таблицы «Продажи» как диапазон для импорта, поэтому я пошел с импортом всего листа.

на машине клиента код выводит сообщение об ошибке в строке transferpreadsheet (пытается открыть еще один экземпляр excel с файлом панели мониторинга и говорит, что файл уже открыт, ошибка три тысячи); однако на моей машине он работает отлично.

Неужели кто-нибудь сталкивался с подобной проблемой? есть ли лучший способ оттолкнуть данные от Excel для доступа? Если нет, передает ли список рассылки закрытым файлам, поэтому мне нужно закрыть файл, в который я импортирую данные из (Dashboard), прежде чем запускать этот фрагмент кода и повторно открыть его после ?

Спасибо!

Ответ:

сохранение временного файла и толкая от него работает хорошо

Workbooks.Add.SaveAs dbpath & "\tempwb.xlsx" 
     Set tempwb = Application.Workbooks("tempwb.xlsx") 
     Application.Workbooks(dashboard).Activate 
     acc.OpenCurrentDatabase dbpath & "\Database.accdb" 
     Application.Workbooks(dashboard).Sheets("DataForImport").Copy Before:=tempwb.Sheets(1) 
     tempwb.Save 
     tempwb.Close 
     acc.DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\tempwb.xlsx", True, "DataForImport!" 
     Kill dbpath & "\tempwb.xlsx" 
     acc.CloseCurrentDatabase 
     acc.Quit 
     Set acc = Nothing 
+0

Вы можете попробовать открыть набор записей dao. выполнить запрос выбора. и нажмите набор результатов в свой диапазон? –

+0

проверить драйверы odbc в инструментах панели управления/администрировании – scraaappy

+0

будут ли драйверы odbc находиться под источниками данных odbc в инструментах администратора? –

ответ

1

В теории, код должен быть в порядке.

В действительности, и поскольку в продуктах Office обычно не нравится то, что вы пытаетесь сделать, я настоятельно рекомендую вам сделать все импорт в Access.

Тогда вам нужна только вам одну строка:

УВЫ
DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\Dashboard 2015.04.17.xlsm", True, "DataForImport!" 

... или эквивалентный не-VBA макросов, которые могут быть построен шаг за шагом.

+0

спасибо. добавлен этот метод в список. + импорт подключений adodb. попробует все три на машине клиента и посмотрит, какой из них лучше всего работает. –

0

Access.application -> вы используете раннее связывание. Есть ли у вашего клиента другая версия Office? Возможно, вы захотите переписать его с помощью позднего связывания (например, dim acc as Object, затем установите Acc = CreateObject («Access.application»)), тогда вы, вероятно, увидите тот же показатель успеха на компьютере клиента, что и ваш.

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

xls.save 'save your current file 
filecopy currentpath, dir(currentPath) & "\zzztmp.xls" 'make a copy in the same folder named zzztmp 
docmd.transfer here with the TEMP file path 
kill dir(currentPath) & "\zzztmp.xls" 'this will delete the temp file and our data is in Access and the user is happy 

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

+0

Клиент находится на той же версии офиса (2013) , это идея временного файла. Я тоже дам это. Спасибо! –

Смежные вопросы