将颜色值的范围存储为VBA中的数组

我想从Excel中的表中获取颜色值,在重新组织表格时将它们存储为数组,然后将颜色值放回到表格中。 以下代码适用于值和数字格式,但不适用于颜色值。 任何帮助将不胜感激。

Sub Colors() Dim cArray As Variant Set Rng = Range("A1: T300") ReDim cArray(1 To Rng.Rows.Count, 1 To Rng.Columns.Count) For i = 1 To Rng.Rows.Count For j = 1 To Rng.Columns.Count cArray(i, j) = Rng(i, j).ColorValue Next j Next i Call SortTable Rng.ColorValue = cArray End Sub 

我不确定.ColorValue是VBA认可的东西。 相反,使用cArray(i,j) = rng(i,j).Interior.ColorIndex

然后,当你想设置一个单元格的颜色,只要做Cells(1,1).Interior.ColorIndex = [whatever]

这里有一个非常详细的页面讨论ColorIndex和HTML / Hex / RGB等价物/相关的东西。

编辑:我以为你想要的背景颜色。 如果你想要的字体颜色,它只是cArray(i,j) = rng(i,j).Font.Color

这是PasteSpecial最有用的好处之一

它隐藏了跟踪所有格式的复杂性,而且它非常高效:

 Option Explicit Public Function storeColors(ByRef rng As Range) As Worksheet Dim ws As Worksheet Set ws = rng.Parent.Parent.Worksheets.Add ws.Visible = xlSheetHidden rng.Copy ws.Cells(1, 1).PasteSpecial xlPasteFormats Set storeColors = ws End Function Public Sub restoreColors(ByRef rng As Range, ByRef ws As Worksheet) ws.UsedRange.Copy rng.Cells(1, 1).PasteSpecial xlPasteFormats Application.DisplayAlerts = False ws.Delete Application.DisplayAlerts = True End Sub 

例:

 Public Sub testColors() Dim ws As Worksheet Application.ScreenUpdating = False With Sheet1 Set ws = storeColors(.Range("A1: T300")) '<<<<< .Range("A1").Value2 = "New Value" .Cells.Interior.ColorIndex = xlColorIndexNone restoreColors .Range("A1: T300"), ws '>>>>> .Range("A1").Select End With Application.ScreenUpdating = True End Sub 

如@JohnColemanbuild议:如果可用,ListObject的TableStyle属性更简单