使用 ListObject.Add 创建 Table 样式时出错
Error using ListObject.Add to create a Table Style
我正在尝试使用 PowerShell 和 Excel ComObject 从 CSV
这是我的代码...
$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
我已经研究了一段时间,但没有找到解决方案。
根据您的代码,您不能将 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
对象的有效引用。
我正在尝试使用 PowerShell 和 Excel ComObject 从 CSV
这是我的代码...
$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
我已经研究了一段时间,但没有找到解决方案。
根据您的代码,您不能将 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
对象的有效引用。