|
|
|
| Здравствуйте!
Пожалуйста, подскажите, почему следующий код не обновляет сводные таблицы, указанного файла MS Excel:
Private Sub btnExcelRefresh_Click()
Dim xlsReportPath As String, xlsReportFile As String
Dim exclApp As Object, sourceWB As Workbook
Dim result As Variant
xlsReportPath = "x:\Reports\"
xlsReportFile = "test.xlsx"
Set exclApp = CreateObject("Excel.Application")
With exclApp
Set sourceWB = .Workbooks.Open(xlsReportPath & xlsReportFile)
sourceWB.RefreshAll
sourceWB.Close SaveChanges:=True
End With
exclApp.Quit
Set exclApp = Nothing
End Sub
|
| |
|
| |
|
|
|
| Сам ексель пишет так
ActiveWorkbook.RefreshAll
а у вас книга не активная - просто Workbook.RefreshAll | |
|
| |
|
|
|
| А как сделать книгу активной?
И вообще как правильно все это сделать и закрыть.
Спасибо! | |
|
| |
|
|
|
| Что является источником данных сводной таблицы?
При открытии файла на экране запрашивает обновление связей? Может вам нужно при вызове метода Open указывать аргумент UpdateLinks?
Если файл открыт на экране, выполнение в окне отладки ActiveWorkBook.RefreshAll приводит к желаемому результату? | |
|
| |
|
|
|
| Пункт 1. Имеется БД Reports.accdb в Аксес 2007. Ежедневно (раз в день, утром) в эту БД заносятся данные, что-то вручную, что-то программно из файлов Эксел.
Пункт 2. После ввода данных в Reports.accdb открывается файл test.xlsx, нажимается кнопка «Обновить все», затем «Сохранить», затем test.xlsx закрывается. Данные в test.xlsx берутся из Reports.accdb.
Данные в Reports.accdb заносить только один человек, назовем его Администратором БД. Другим этот файл просто недоступен.
Доступ на запись к файлу test.xlsx есть только Администратора БД. У других только на чтение.
В Reports.accdb нужно создать подпрограмму, которая будет выполнять пункт 2.
Как это сделать? | |
|
| |
|
|
|
| Dim xlsReportPath As String
Dim exclApp As Object
xlsReportPath = "C:\Users\Сергей\Desktop\test.xlsx"
Set exclApp = CreateObject("Excel.Application")
exclApp.Workbooks.Open (xlsReportPath)
exclApp.ActiveWorkbook.RefreshAll
exclApp.ActiveWorkbook.Save
exclApp.Quit
Set exclApp = Nothing | |
|
| |
|
|
|
| Появляется окно "Файл 'RESUME.XLW' уже существует в данном месте. Заменить?". Отвечаю Yes. Процедура проходит. Открываю файл Эксел, а там ничего не обновилось.
Set exclApp = CreateObject("Excel.Application")
exclApp.Workbooks.Open xlsFile
MsgBox exclApp.ActiveWorkbook.Name
exclApp.ActiveWorkbook.RefreshAll
exclApp.Save
exclApp.Quit
Set exclApp = Nothing
Тут MsgBox выдает имя моего файла Excel. То есть не работает либо RefrashAll, либо Save | |
|
| |
|
|
|
| я исправил код
попробуйте еще раз
Dim xlsReportPath As String
Dim exclApp As Object
xlsReportPath = "C:\Users\Сергей\Desktop\test.xlsx"
Set exclApp = CreateObject("Excel.Application")
exclApp.Workbooks.Open (xlsReportPath)
exclApp.ActiveWorkbook.RefreshAll
exclApp.ActiveWorkbook.Save
exclApp.Quit
Set exclApp = Nothing | |
|
| |
|
|
|
| Заметил, что иногда сохраняется обновление. Между обновлением и записью добавил задержку в 5 секунд. Вроде теперь записывает.
Вопрос. Как проверить, что обновление закончилось и потом запустить запись, а не как сейчас после задержки?
Нужно как-то перехватить какое-нибудь событие наподобие AfterRefreshAll. Но как это сделать?
Или выключить фоновое обновление что-ли? Как это сделать? | |
|
| |
|
|
|
| Решил для себя проблему тем, что снял галочку "Фоновое обновление" в свойствах подключений.
Спасибо! Вопрос закрыт. | |
|
| |