2015-02-18 5 views
2

Итак, я разработал сценарий powershell, чтобы обновить около 40 больших файлов excel и сохранить их, и в этом скрипте я запускаю макрос excel для передачи параметров соединения excel (ODBC), а затем удалите их из файла excel после обновления. Моя единственная проблема в том, что (для 5 файлов из этих 40 файлов), когда запускается команда RefreshAll, powershell не ждет, пока Excel закончит обновление, и перейдет к следующей команде, которая является макросом, который делает недействительным соединение, что вызывает ошибку «1004» в макросе (невозможно получить доступ к соединению excel, пока файл все еще обновляется.)Make PowerShell Подождите, пока Excel закончит обновлять сводную таблицу

После некоторых исследований я знаю, что в powershell v2 существует концепция фоновых заданий, но в моем случае это не в стороне процесс, он принадлежит к процессу Excel, поэтому моя сила не должна ждать выхода Excel, чтобы продолжить выполнение, напротив, мне нужно, чтобы excel оставался открытым, чтобы продолжить выполнение powershell.

Я также знаю, что команда start-sleep не подходит для моей ситуации, так как не существует фиксированного значения времени для завершения обновления, каждый файл имеет свое время, а также каждый период месяца имеет свое время (объем данных увеличивается каждый день до конца месяца)

Итак, мой вопрос: возможно ли выполнить проверку PowerShell, если файл Excel сделал обновление своих данных, если да, то он продолжается, а еще он ждет еще больше?

Любая помощь будет оценена и заблаговременно. PS: Извините мой первый класс английского языка :).

ответ

2

Shotgun подход:

  1. Excel имеет Application.Ready свойство. Он должен указать, когда Excel готов к автоматизации связи, но details are unclear. Попробуйте что-то вроде этого:

    $Excel = New-Object -ComObject Excel.Application 
    
    # Do your stuff here 
    
    # Wait for Excel to became ready 
    while (!$Excel.Ready) 
    { 
        Start-Sleep -Seconds 1 
    } 
    
    # Do other stuff 
    
  2. QueryTable имеет Refreshing свойство. Попробуйте это:

    $Excel = New-Object -ComObject Excel.Application 
    $Workbook = $Excel.Workbooks.Open('C:\Path\To\Workbook\Data.xlsx') 
    
    # Are any of the QueryTables refreshing? 
    # Don't have Excel right now, so expression below might need some tweaking 
    While (($Workbook.Sheets | ForEach-Object {$_.QueryTables | ForEach-Object {if($_.QueryTable.Refreshing){$true}}})) 
    { 
        Start-Sleep -Seconds 1 
    } 
    
  3. OdbcConnection имеет Refreshing property.Try это:

    $Excel = New-Object -ComObject Excel.Application 
    $Workbook = $Excel.Workbooks.Open('C:\Path\To\Workbook\Data.xlsx') 
    
    # Is ODBCConnection refreshing? 
    # Don't have Excel right now, so expression below might need some tweaking 
    While ($Workbook.ODBCConnection.Refreshing) 
    { 
        Start-Sleep -Seconds 1 
    } 
    
  4. Может эти 5 файлов PivotCache.BackgroundQuery, ODBCConnection.BackgroundQuery или QueryTable.BackgroundQuery свойство установлено значение верно?

+0

Благодарим вас за ответ. Ну, я попробовал ваше решение, но у меня все еще есть ошибка vba 1004. –

+0

Хорошо, я обновил свой ответ, пожалуйста, посмотрите, поможет ли что-нибудь. – beatcracker

+0

Большое спасибо за ваше решение. Я буду тестировать ODBCConnection.Ready, но я думаю, что это имеет какое-то отношение к этому сообщению http://stackoverflow.com/questions/181585/rpc-e-servercall-retrylater-during-powershell-automation, поскольку, когда я снимаю часть макроса, появляется ошибка, описанная в сообщении. –

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