批量获取Excel单元格属性

7

在Excel中获取范围内的值时,使用“批量”方式(作为2D数组)获取比循环遍历每行和每列要更有效率。例如:

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

有25个单元格时没有太大的区别,但有10000行20列时肯定会有区别。到目前为止还不错。
我的问题是:如何为其他属性进行“批量”获取?
例如,我想找出哪些单元格以某种方式着色。我很想做一些像“range.Interior.Color”这样的事情,但它只返回一个值,而不是值数组。因此,我最终会循环,这可能会慢100甚至1000倍。对于大型表格,这真的是致命的。
看起来“.Formula”的行为就像“.Value”一样:我可以同时获取多个值。但我还没有让颜色配合得好。
2个回答

5
由于Excel存储信息的方式,我认为您不能将这些属性作为数组获取。Excel不会为每个单元格单独存储格式,而是存储一种特定的格式混合以及使用该格式的范围的内部“列表”。
您可以通过创建一个具有各种格式的小型测试文件并将其保存为XML格式(至少在2010年中需要使用“XML电子表格2003”)来了解格式是如何存储的。
本文也许能帮助您:[链接]

你是否知道是否有办法从VBA/VSTO中访问单元格的样式引用(StyleID),就像在XML文件中看到的那样?在这种情况下,可以从Excel中读取所有样式数据,然后通过每个单元格的一个Interop调用将每个单元格映射到其样式。 - Paul B.

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 中实现这个功能的方法。感谢分享代码。 - Rachel Hettinger
谢谢,@brettdj! 这是一个不错的方法,但Excel的“查找”仍然相当慢(至少我知道对于值而言,我最好还是存储2D数组,然后自己搜索)。至于搜索颜色,你提供的代码非常适用于只有几个有颜色的单元格的情况。但如果有几百个,系统就会变得很慢 - 这可能是由于地址和联合操作引起的。可能有更有效的方法,但是根据Rachel的回答,似乎没有真正有效的方法。但还是要感谢! - Michael Zlatkovsky - Microsoft
@MichaelZlatkovsky,除非您有大量数据,否则查找通常非常快-但同意对于格式化而言,这可能是一个漫长的结果,具体取决于文件的大小。还有一些其他解决方法,您可以使用XLM来检测某些单元格属性,请参见http://xcell05.free.fr/morefunc/english/xlm.lire.cellule.htm。 - brettdj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接