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);

я попробовал следующее:

  1. добавление Start-Sleep 30 между созданием объекта excel и установкой свойства visible
  2. настройка видна перед DisplayAlerts
  3. желая действительно трудно для него просто работать

какие идеи?

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 отвечает на видимое событие, переключая несколько других вещей (не помню сразу, но что-то в глубине моего мозга говорит, что это так или было раньше).