2011-12-09 75 views
7

從Excel中的範圍中獲取值時,以「批量」(作爲二維數組)的值比循環遍歷每行和每列更有效。例如:VSTO:在「批量」中獲取Excel單元格屬性

Dim range = Globals.Table.Range("A1:E5") 
Dim values(,) As Object = range.Value 

擁有25個細胞中,這並沒有太大的差別,但有10,000行20列它當然不會。到現在爲止還挺好。

我的問題是:有沒有人找到一種方法來爲其他屬性做同樣的「批量」獲取?例如,我想查找哪些單元格以某種方式着色。我很想做一些類似「range.Interior.Color」的東西,但是這隻會返回一個的值,而不是數組的值。所以我最終循環,這可能是100甚至1000倍慢。對於大型桌子來說,這真是一個殺手。

PS:它看起來像.Formula的行爲就像.Value:我可以一次獲取多個。但我還沒有哄騙顏色變得好玩。

我感謝您的幫助!

回答

5

我不認爲你可以將這些屬性作爲一個數組,因爲Excel存儲該信息的方式。 Excel不會爲每個單元單獨存儲格式,而是存儲特定的格式混合以及使用該格式的範圍的內部「列表」。

通過創建各種格式的小型測試文件並將其保存爲XML格式(至少在2010年,您需要使用「XML Spreadsheet 2003」),您可以瞭解格式存儲的方式。

This article may also help。

+0

+1好貼雷切爾。 – brettdj

+0

你碰巧知道是否有任何方法可以訪問我可以在VBA/VSTO的XML文件中看到的單元格樣式引用('StyleID')?在這種情況下,可以從Excel中讀取所有樣式數據,然後將每個單元映射到其樣式,每個單元只有一個Interop調用。 –

4

「我想找到哪些細胞着色以特定方式」

在VBA可以運行使用Find方法,通過格式搜索的快速程序。例如,查找與A1中的單元格具有相同單元格字體顏色和內部顏色的所有單元格。我相信你可以使用類似的東西在VSTO

Sub FindFormat() 
    Dim rng1 As Range 
    Dim rng2 As Range 
    Dim strAddress As String 
    With Application.FindFormat 
     .Interior.ColorIndex = [a1].Interior.ColorIndex 
     .Font.Color = [a1].Font.Color 
    End With 
    Set rng1 = Cells.Find("", [a1], xlFormulas, , , , , , True) 
    If Not rng1 Is Nothing Then 
     strAddress = rng1.Address 
     Set rng2 = rng1 
     Do 
      Set rng1 = Cells.Find("", rng1, xlFormulas, , , , , , True) 
      Set rng2 = Union(rng1, rng2) 
     Loop While rng1.Address <> strAddress 
     MsgBox "Range similar format to A1 is " & rng2.Address 
    End If 
End Sub 

enter image description here

+1

回到你身邊,@brettdj。我知道有一種方法可以在VBA中實現。感謝分享代碼。 –

+0

謝謝,@brettdj!雖然Excel的「Find」仍然非常慢(我知道數值,至少,我存儲2D數組,然後自己搜索它)會更好。但是,就搜索顏色而言,如果只有幾個有顏色的單元格,則您提供的代碼很好。然而,如果將有數百個系統陷入困境 - 可能是因爲地址和聯合操作。有可能使它更有效率的方法,但根據雷切爾的迴應,看起來沒有真正有效的方法。不過謝謝! –

+0

@MichaelZlatkovsky查找通常非常快速的值,除非你有一個巨大的數額 - 但同意格式化這可能是一個漫長的結果取決於文件的大小。還有一些其他解決方法可以使用XLM來檢測某些單元格屬性,請參閱http://xcell05.free.fr/morefunc/english/xlm.lire.cellule.htm – brettdj

相關問題