从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:我一次可以获取多个。但是我还没有把颜色变成好玩的。
感谢您的帮助!
答案 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