2011-12-09 42 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

相关问题