Powershell跨多个工作表在excel工作簿中运行多个vba脚本

时间:2014-02-10 16:28:53

标签: excel excel-vba powershell worksheet vba

您好我需要在同一工作簿中的不同工作表上运行不同的vba脚本。基本上,每个工作表都有自己的vba脚本,该脚本触发ODBC连接,然后从数据库更新工作表。我已经能够在一张纸上运行一个vba脚本并保存为......没问题,但不能再运行一个。这是我使用

的代码
$excel = new-object -comobject excel.application
$excelFiles = Get-ChildItem -Path C:\test\Daily_update.xlsm
$Date = (Get-Date -Format dd-MM-yy)
Foreach($file in $excelFiles)
{
 $workbook = $excel.workbooks.open($file.fullname)
 $worksheet = $workbook.worksheets.item(2)
 $excel.Run("Test_Refresh")

 $workbook.saveAs("C:\test\Daily_update_$Date.xlsm")
 $workbook.close()
}
$excel.quit()

当我尝试添加其他工作表和vba脚本时,它根本不起作用。

1 个答案:

答案 0 :(得分:1)

好好离开问题一会儿,多喝点咖啡,然后应用一些逻辑。我得到了工作的东西。因此,万一你需要一个脚本来完成我所做的事情并在同一个工作簿中的特定工作表上运行一个特定的宏,这就是它。

$excel = new-object -comobject excel.application
$excelFiles = Get-ChildItem -Path C:\Test\Daily_update.xlsm
$Date = (Get-Date -Format dd-MM-yy)

 $workbook = $excel.workbooks.open($excelfiles.fullname)
 $WS2 = $workbook.worksheets.item(2)
 $WS2.Activate()
 $excel.Run("Test_Refresh")

 $WS3 = $workbook.worksheets.item(3)
 $WS3.Activate()
 $excel.Run("test_Refresh_2")

 $WS4 = $workbook.worksheets.item(4)
 $WS4.Activate()
 $excel.Run("test_Refresh_3")

 $workbook.saveas("C:\Test\SQL\Daily_update_$Date.xlsm")
 $workbook.close()

$excel.quit()

只是为此添加一点。经过一些反复试验后,我发现以下代码的运行效率远高于上述代码。另外我注意到,如果只有3个工作表,那就没问题,但是更多的问题开始引发错误,特别是在调用工作表时。但是当工作簿打开并可见时,这个问题就消失了。

#Call the application
$excel = new-object -comobject excel.application
#Now we select the file and path 
$excelFiles = Get-ChildItem -Path "\\Server\Test\Daily_refresh.xlsm"
#The next variable speeds the script up by not calling the comobject as often
$app = $excel.Application
#Get system date and time and format it to comply with the final filename format
$Date = (Get-Date -Format dd-MM-yy)
#And again for the year folder
$Year = (Get-Date -Format yyyy)
#Test if folder exists
$DestYearFolder = "\\Server\Test\Daily_Refresh_Output\Test\$Year"
if (!(Test-Path -path $DestYearFolder)) {New-Item $DestYearFolder -Type Directory}
#Same as above only for the month folder
$Month = (Get-Date -Format MMM)
#Test if folder exists
$DestMonthFolder = "\\Server\Test\Daily_Refresh_Output\Test\$Year\$Month"
if (!(Test-Path -path $DestMonthFolder)) {New-Item $DestMonthFolder -Type Directory}
#Now we open the Excel file and activate the macro enabled content
 $workbook = $app.workbooks.open($excelfiles)
 #The next command makes Excel visible
 $app.Visible = $true
 $workbook.Activate()
 #Now we run all the Macros that need to be run.
 $app.Run("Macro_1")
 $app.Run("Macro_2")
 $app.Run("Macro_3")
 $app.Run("Macro_4")
 $app.Run("Macro_5")
 $app.Run("Macro_6")
 $app.Run("Macro_7")
 $app.Run("Macro_8")
 $app.Run("Macro_9")
 $app.Run("Macro_10")

 #Now we save the workbook in the standard daily format and the close Excel
 $workbook.saveas("\\Server\Test\Daily_Refresh_Output\Test\$Year\$Month\Daily_Refresh_test_$Date.xlsm")
 $workbook.close()

$excel.quit()