VSTO:在“批量”中获取Excel单元格属性

时间:2011-12-09 20:47:31

标签: excel vsto

从Excel中的某个范围获取值时,以“批量”(作为2D数组)获取值比循环遍历每个行和列更有效。例如:

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:我一次可以获取多个。但是我还没有把颜色变成好玩的。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

由于Excel存储该信息的方式,我认为您不能将这些属性作为数组获取。 Excel不会单独存储每个单元格的格式,而是存储特定的格式混合以及使用该格式的范围的内部“列表”。

通过创建具有各种格式的小型测试文件并将其保存为XML格式,您可以了解格式化的存储方式(至少在2010年,您需要使用“XML Spreadsheet 2003”)。

article也可能会有所帮助。

答案 1 :(得分: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