实例需求:表格中的多个图表如下图左侧所示,对于表格进行排序时,希望第一列中的图表跟随相应数据。
方法1:
Sub SortTableWithChart()Dim oSht As Worksheet, RowCnt As Long, ColCnt As LongDim arrData, i As Long, oCht As ChartObjectSet oSht = ActiveSheetWith oShtFor Each oCht In .ChartObjectsoCht.Name = oCht.TopLeftCell.Address(0, 0)NextRowCnt = .Cells(.Rows.Count, 2).End(xlUp).RowColCnt = .Cells(1, .Columns.Count).End(xlToLeft).Column.Cells(1, ColCnt + 1) = "Index"With .Cells(2, ColCnt + 1).Resize(RowCnt - 1).FormulaR1C1 = "=ROW()".Formula = .ValueEnd WithWith .Range("A1", .Cells(RowCnt, ColCnt + 1)).Sort Key1:=.Columns(3), Order1:=xlDescending, Header:=xlYesarrData = .ValueEnd WithFor i = 2 To UBound(arrData)If arrData(i, ColCnt + 1) <> i ThenWith .ChartObjects("A" & arrData(i, ColCnt + 1)).Top = oSht.Cells(i, 1).Top.Left = oSht.Cells(i, 1).LeftEnd WithEnd IfNext.Columns(ColCnt + 1).ClearEnd With
End Sub
【代码解析】
第6~8行代码循环遍历工作表中的ChartObject
对象,将图表名称改为其锚点单元格(图表左上角单元格)的引用地址。
第9行代码获取表格的行数。
第10行代码获取表格的列数。
第11行代码添加辅助列标题。
第13行代码在辅助列设置公式,获取行号。
第14行代码将公式转换为静态值。
第17行代码按照辅助列降序排列。
第18行代码将表格内容(包含辅助列)加载到数组中。
第20~27行代码循环遍历每行数据,调整图表位置。
第21行代码对比辅助列的值和行号,如果相同,则无需调整改行的图表位置。
第22~25行代码将指定的图表调整到对应的行。
第28行代码清除辅助列。
方法2:
无需代码也可以实现相同的效果,选中图表,设置图表【属性】,选中【随单元格改变位置和大小】或【随单元格改变位置,但是不改变大小】。
在Excel界面中,对表格进行排序时,将自动调整位置。