Powershell excel refresh завершается с ошибкой "вызов был отклонен вызываемым", когда.видны=значение$false
У меня была эта проблема в течение длительного времени и просто проигнорировал его из лени, однако теперь мне нужно найти решение. У меня есть скрипт, который автоматизирует обновление большого количества документов Excel. Это работает хорошо и денди, однако, это терпит неудачу, если у меня есть свойство Visible, установленное в false в книгах, которые хранятся в сетевом ресурсе.
чтобы повторить, обновление с visible свойством false отлично работает в локальных файлах, но любая книга, сохраненная в location выдает ошибку "вызов был отклонен". Все обновления работают нормально с свойством visible, установленным в true.
вот мой код :
#Create Excel COM object and set it up for use.
$excel = new-object -comobject Excel.Application;
$excel.DisplayAlerts = $false;
#If this is set to false, saving the file on a network share will fail. Reason : Unknown.
$excel.Visible = $true;
#Open workbook which should be refreshed.
$excelworkbook = $excel.workbooks.Open($workbook);
#Refresh WB
$excelworkbook.RefreshAll();
#Save
$excelworkbook.Save();
#Quit Excel
$excel.Quit();
#Destroy COM object. (VERY IMPORTANT!!!!!)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel);
я попробовал следующее:
- добавление Start-Sleep 30 между созданием объекта excel и установкой свойства visible
- настройка видна перед DisplayAlerts
- желая действительно трудно для него просто работать
какие идеи?
2 ответов
кажется,RefreshAll()
не ждет обновления, чтобы на самом деле преуспеть в фоновом режиме с Visible = $False
set.
ввести искусственную задержку между RefreshAll()
и Save()
, например:
$excelworkbook.RefreshAll();
Start-Sleep -Seconds 30
$excelworkbook.Save();
в качестве альтернативы, вы могли бы заставить RefreshAll()
выполнить синхронно, установив BackgroundQuery = $False
на всех таблицах запросов в вашей книге,как предложено в ответе на этот вопрос на подобный вопрос:
foreach ($Sheet in $excelworkbook.Worksheets) {
foreach ($QTable in $Sheet.QueryTables) {
$QTable.BackgroundQuery = $false
}
}
Я бы добавил DoEvents
блок:
[System.Windows.Forms.Application]::DoEvents()
это позволит очереди циклически выполнять все, что вы сказали Excel, а затем вернуться к выполнению сценария. Другое дело-установить UserControl = false
Так что Excel не просто скрыто, но явно не в состоянии пользователя реагировать на события.
наконец, может быть что-то о настройке Visible
после того, как вы установили другие свойства-это может быть случай, когда Excel отвечает на видимое событие, переключая несколько других вещей (не помню сразу, но что-то в глубине моего мозга говорит, что это так или было раньше).