因此,我开发了一个Powershell脚本来刷新大约40个大型excel文件并保存,并在此脚本中运行excel宏以传递excel(ODBC)连接参数,然后在刷新完成后从excel文件中删除它们。我唯一的问题是(对于这40个文件中的5个文件)启动RefreshAll命令时,Powershell不会等待Excel完成刷新并传递到下一个命令,该命令是使连接无效的宏,这将导致错误宏中的“1004”(文件仍在刷新时无法访问excel连接。)

经过研究,我知道在Powershell v2中有后台作业的概念,但就我而言,这不是一个备用过程,它属于Excel进程,因此我的Powershell不必等待Excel退出要继续执行,相反,我需要Excel保持打开状态才能继续执行Powershell。

我也知道start-sleep命令不是我的最佳选择,因为没有结束刷新的固定时间值,每个文件都有时间,每个月的每个时间都有时间(数据量)每天增加,直到月底结束)。

所以我的问题是:是否可以对Powershell进行测试,如果Excel文件已完成刷新其数据,如果可以,它将继续,否则将等待更多时间?

最佳答案

弹枪的做法:

  • Excel具有Application.Ready属性。应该指出什么时候
    Excel已准备就绪,可以进行自动化通信,但可以使用details areunclear。尝试这样的事情:

    $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
    
  • 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
    }
    
  • ODBCConnection具有Refreshing属性。请尝试以下操作:

    $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
    }
    
  • 也许这5个文件的PivotCache.BackgroundQueryODBCConnection.BackgroundQueryQueryTable.BackgroundQuery属性设置为true?
  • 关于excel - 使PowerShell等待Excel完成刷新数据透视表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28582443/

    10-13 07:47
    查看更多