2010-09-28 62 views
1

我正在使用Microsft Office Interop API。我的問題屬於Excel。Excel - 如何忽略等於沒有任何公式的行?

我使用Interop API編寫了一個程序來格式化Excel文檔,然後將它們發送給打印機。但問題是,我們偶爾會跨越文件創建一個跨越65,000多行的列,其中包含的所有文件都是公式。該公式僅爲前100行左右創建輸出,其餘部分顯示爲空白。但是,當發送到打印機時,由於這些公式,它會嘗試打印10,000頁或其他內容。

我第一次尋找方法來告訴Excel無法打印這些範圍。我無法找到任何設置來忽略這些設置。其次,我想到了以編程方式執行此操作的方法,但該邏輯會非常複雜,並且可能會導致不包含此類公式的「常規」文件出現問題。

有誰知道讓Excel忽略這些公式的好方法嗎?

我正在使用Delphi和Office 2007 Interop API。

回答

4

我不知道德爾福,但我用

With ActiveSheet 
    row = .Cells(.Rows.Count, "B").End(xlUp).row 
End With 

然後,用行,你可以嘗試打印您需要的列上創建一個宏來得到最後一個活動列。

ActiveSheet.Range("A1:" & "D" row).Select 
Selection.PrintOut Copies:=1, Collate:=True 

希望有幫助!

+0

我對'with'語法不熟悉,所以對我有點困惑,但我不明白第一個代碼片段是如何獲取最後一個活動列的。它在我看來像是獲得了最後一行的硬編碼列「B」或「D」?這個邏輯是否忽略包含沒有可見結果的公式的單元格? – Ryan 2010-09-29 16:30:55

+0

@Ryan:語法是VB。不,它不會忽略包含沒有可見結果的公式的單元格。宏基本上是在執行End-Down,或者在這種情況下,End-Up「trick」從xlUp方向的最後一行開始找到下一個填充的單元格(在幾個空白的單元格之後)。 – 2010-09-29 16:56:13

+0

@Ryan:第一個片段通過從Excel工作表底部向上計數,返回列「B」中最後一個活動單元格的行號。不幸的是,我不知道德爾福,否則我會舉一個更好的例子。 – 2010-09-29 18:09:50

4

沒有。就Excel而言,如果一個單元格包含公式,則該單元格將被填充,而不管該公式的結果如何。

在單元格中鍵入[end],然後單擊[下],可以將該單元格從當前位置開始到該列中第一個空白單元格之前的最後一個填充單元格。因此,在公式欄中輸入End-Down應該讓您一路走到最後。

您所擁有的選項是在發出打印命令之前告訴Excel究竟要打印的範圍。您可以通過使用與Print |相對應的方法來完成此操作設置範圍菜單選項(對不起,目前沒有可用的com界面)。

要找到要打印的範圍,您需要數據範圍的最右邊一列和最下面一行。假設您的第一行包含列標題,只需遍歷第一行的單元格值並在獲取空白值時停止。

要查找數據範圍的最底部一行,您需要一個沒有公式,但是「正常」值且在數據範圍內的任何行中沒有空白值的列。如果您的數據始終包含這樣的列,您可以遍歷該列以查找最後一個填充行,從而找到打印範圍的底部邊界。

+0

儘管如此,編程方式很難將邏輯安全地應用於「每個」Excel文件。我編寫的程序是爲了在沒有任何用戶定義的打印範圍等情況下自行運行。對每一行進行迭代並檢查列單元格的公式,似乎有點不可靠,然後提出一種算法,允許在其本身和未來細胞之間的某種程度的空白細胞被檢查。這是...只是... argggh。 :( – Ryan 2010-09-29 16:27:14

+1

@Ryan:是的,我知道這種感覺......:}哦,爲了更一般一點,你也可以檢查所有具有「字幕」(第一行中的值)的列,並停在唯一的行填充的單元格是包含公式的單元格...至少公式始終以「=」開頭。 – 2010-09-29 16:47:50

+0

是的,那可能是最好的選擇。遍歷給定「使用範圍」中的每列,並計算僅包含公式的尾行數。如果該計數超過100,則開始從該列中刪除剩餘的行。這只是棘手的,因爲100行的公式並不差,5000行的公式也是如此。但是,如果這些公式都是空白的,那就太糟糕了! – Ryan 2010-09-29 16:54:44