【问题标题】:Error using ListObject.Add to create a Table Style使用 ListObject.Add 创建表格样式时出错
【发布时间】:2015-09-12 02:30:48
【问题描述】:

我正在尝试使用 CSV 中的 PowerShell 和 Excel ComObject 创建自定义表格(就像单击 excel 栏中的“格式为表格”一样)

这是我的代码...

$Excel = New-Object -ComObject excel.application 
$Excel.visible = $true
$Excel.sheetsInNewWorkbook = $csvFiles.Count
$workbooks = $excel.Workbooks.Add()
$worksheets = $workbooks.worksheets
$CSVFullPath = C:\temp.csv
$worksheet = $worksheets.Item(1)
$worksheet.Name = "Temp"

$TxtConnector = ("TEXT;" + $CSVFullPath)
$CellRef = $worksheet.Range("A1")

$Connector = $worksheet.QueryTables.add($TxtConnector,$CellRef)
$worksheet.QueryTables.item($Connector.name).TextFileCommaDelimiter = $True
$worksheet.QueryTables.item($Connector.name).TextFileParseType  = 1
$worksheet.QueryTables.item($Connector.name).Refresh()
$worksheet.UsedRange.EntireColumn.AutoFit()

## So Far So good - CSV Imported ##
## My Problem Starts here... ##

$listObject = $worksheet.ListObjects.Add([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange, $worksheet.UsedRange, $null),[Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes,$null) 

## Then I Received the following error: ##

Exception calling "Add" with "5" argument(s): "A table cannot overlap a range that contains a PivotTable report, query
results, protected cells or another table."
At line:1 char:41
+ $ListObject = $WorkSheet.ListObjects.Add <<<< ([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange,$R
ange,$null,[Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes,$null)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation    

我已经研究了一段时间,但没有找到解决方案。

【问题讨论】:

  • 你的括号在那一行不平衡。在第一个 $null 之后,您在 Add 调用的中间有一个 )。在 VBA 中测试相同的代码(没有额外的))似乎在一些随机数据上工作得很好。这最终可能取决于您在Worksheet 上拥有的数据。您的实际代码是否有流浪)

标签: excel powershell comobject


【解决方案1】:

根据您的代码,您不能将ListObject 添加到Worksheet,而基础QueryTable 仍然存在。如果您尝试在普通 Excel(非 COM)中执行此操作,您将收到如下错误:

如果您点击Yes 并在宏运行时录制宏,Excel 只会删除QueryTable 并添加ListObject。删除QueryTable 不会影响基础数据。

在 VBA 世界中,您的代码如下所示:

Sub DeleteQueryTableAndAddListObject()

    Dim sht As Worksheet
    Set sht = ActiveSheet

    ''code up here to create a QueryTable

    Dim i As Integer
    For i = sht.QueryTables.Count To 1 Step -1
        sht.QueryTables(i).Delete
    Next i

    sht.ListObjects.Add xlSrcRange, sht.UsedRange, , xlYes

End Sub

试一试 PowerShell(不是我的母语)你应该能够做到:

$worksheet.QueryTables.item($Connector.name).Delete()

或者可能:

$Connector.Delete()

因为$Connector 似乎是对QueryTable 对象的有效引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多