2014-07-21 35 views
2

我試圖重置Excel ListObject中的列數。我知道你可以逐個添加和刪除列,但我想避免不必要的循環。我反而決定使用Resize方法調整ListObject的大小。當行計數== 1時,ListObject.Resize()使DataBodyRange爲空

這裏是我使用的代碼(其中OutputCasesTable是的ListObject):

OutputCasesTable.DataBodyRange.Value2 = ""; 
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); 
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray; 

上面的代碼行看起來很好地工作,但是,如果所述的ListObject只包含1行的數據,所述DataBodyRange ListObject在第二行變爲空 - 當我嘗試更改其單元格的值時產生錯誤。 excel中的行仍然存在。

MSDN文檔說明如下: 「標頭必須保留在同一行中,並且結果列表必須與原始列表重疊。列表必須包含標題行和至少一行數據。

現在我明白「一行數據」意味着該行包含值 - 因此這裏的錯誤原因必須是DataBodyRange單元格都不包含任何值(「」)。但是,包含「」的兩個數據行的表仍然沒有包含數據的行,是嗎?

我知道有很多方法可以完成這個任務,但我想明白爲什麼會發生這種情況。

臨時解決方案: 將代碼替換爲只將值設置爲將刪除的列中的空字符串(新列數以上的列)。所有其他列將被取代:

if(OutputCasesTable.ListColumns.Count - CaseCount > 0) 
    OutputCasesTable.DataBodyRange.Offset[ColumnOffset: CaseCount].Resize[ColumnSize: OutputCasesTable.ListColumns.Count - CaseCount].Value2 = ""; 
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); 
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray; 

我個人更喜歡看第一個解決方案!

有什麼我可以做,使它與空字符串工作?或者你有更好的解決方案?

最好的問候,

回答

1

Resize操作是殺死DataBodyRange片,並明確有一些內在邏輯Resize用途,沿着「如果只有一個排線,所有的細胞都爲空,刪除所有的數據行,如果有多行,不要刪除任何「。

我同意這個邏輯有點混亂。如果你的問題是爲什麼微軟以這種方式實現它,我認爲雖然它不一致,但它可能是一種更整潔的方式 - 對於模型來說,你使用的是空表,並且模型無法使用用圖形表示差異(表格不可能只有標題行)。

Resize啓動工作並找到單行空白表時,它無法分辨出是否有零行表或空行的單行表。如果它到達並找到兩個空行,這是明確的(它們必須是有意義的行)。

對於你的問題的解決方法部分,我建議只檢查ListRows.Count屬性,並添加一個如果必要的整數解決方案。請注意,您也可以使用Clear而不是將Value2設置爲空白;對我來說,它更像是不言自明的。

OutputCasesTable.DataBodyRange.Clear(); 
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]); 
if (OutputCasesTable.ListRows.Count == 0) OutputCasesTable.ListRows.Add(); 
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray; 
相關問題