|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
原帖由 shlzml 于 2009-6-13 11:00 发表 
瀑布图 做起来也不难
不过多谢楼主分享 顶了
下了楼主的附件,感觉操作起来挺麻烦的,对新手而言更不好理解。索性自己做了一个自定义函数,给大
家分享一下。(不适合每月有赤字的,即每月余额小于0)
Sub Newchart()
If MyChart(, xlColumnStacked, Range("B3:B15"), Range("A3:A15"), , , Range("B1")) Then MsgBox "已完成"
End Sub
Function MyChart(Optional ByVal MyChart_Name As String = "我的图表", Optional ByVal MyChart_Type As XlChartType = xlLineMarkers, _
Optional ByVal MyChart_Source As Range = Nothing, Optional ByVal MyChart_XValues As Range = Nothing, _
Optional ByVal MyChart_Plotby As XlRowCol = xlRows, Optional ByVal MyChart_Title As Boolean = True, _
Optional ByVal MyChart_TitleText As String = "标题", Optional ByVal MyChart_HasLegend As Boolean = False, _
Optional ByVal MyChart_Left As Integer = 420, Optional ByVal MyChart_Top As Integer = 250, _
Optional ByVal MyChart_Width As Integer = 300, Optional ByVal MyChart_Height As Integer = 200) As Boolean
Dim Mych As ChartObject '声明变量为嵌入式图表对象
Dim Myarr1, myarr2 '声明数组
ReDim Myarr1(1 To MyChart_Source.Count) '给数据系列1的数组
ReDim myarr2(1 To MyChart_Source.Count) '给数据系列2的数组
For k = 1 To UBound(Myarr1) '以下为把单元格数据分解为数据系列1/2所用的数据
hz = hz + MyChart_Source.Cells(k, 1)
Select Case k
Case 1
Myarr1(k) = MyChart_Source.Cells(k, 1)
myarr2(k) = 0
Case 2 To UBound(Myarr1) - 1
If MyChart_Source.Cells(k, 1) > 0 Then
Myarr1(k) = hz - MyChart_Source.Cells(k, 1)
Else
Myarr1(k) = hz
End If
myarr2(k) = Abs(MyChart_Source.Cells(k, 1))
Case UBound(Myarr1)
Myarr1(k) = hz
myarr2(k) = 0
End Select
Next
On Error Resume Next '如出错,则从出错行下一行开始执行
Set Mych = ActiveSheet.ChartObjects(MyChart_Name) '设置对象
'MsgBox Err.Number
If Err.Number = -2147024809 Then '设置对象出错,没有对象
Set Mych = ActiveSheet.ChartObjects.Add(MyChart_Left, MyChart_Top, MyChart_Width, MyChart_Height) '添加嵌入图表,设置对象
Mych.Name = MyChart_Name '设置对象名称
End If
Err.Clear '清除Err对象
On Error GoTo Myerr '如出错,则执行Myerr语句
With Mych.Chart
.ChartType = MyChart_Type '图表类型为xlLineMarkers_数据点折线图
.HasTitle = MyChart_Title '图表标题,可见则为 True
If MyChart_Title Then .ChartTitle.Characters.Text = MyChart_TitleText '图表标题文本
'.ChartTitle.Characters.Font.Size = 12 '设置标题的字号
'.SetSourceData Source:=Myarr, PlotBy:=MyChart_Plotby '为指定图表设置源数据区域
.HasLegend = MyChart_HasLegend '为False ,图表没有图例
.SeriesCollection.NewSeries '创建新系列
.SeriesCollection(1).Values = Myarr1 '设置嵌入式图表的系列值1的数据
For k = 1 To .SeriesCollection(1).Points.Count '设置系列1的颜色和数据标签
If k = 1 Or k = .SeriesCollection(1).Points.Count Then
.SeriesCollection(1).Points(k).Interior.ColorIndex = 5 '2白色 5兰色 3红色 xlColorIndexNone无色
.SeriesCollection(1).Points(k).ApplyDataLabels Type:=xlDataLabelsShowValue '显示数据标签
.SeriesCollection(1).DataLabels(k).Font.ColorIndex = 2 '2白色 5兰色 3红色 xlColorIndexNone无色
Else
.SeriesCollection(1).Points(k).Interior.ColorIndex = xlColorIndexNone '2白色 5兰色 3红色 xlColorIndexNone无色
.SeriesCollection(1).Points(k).ApplyDataLabels Type:=xlDataLabelsShowNone '不显示数据标签
End If
Next
.SeriesCollection(1).XValues = MyChart_XValues '设置水平分类轴标签
.SeriesCollection.NewSeries '创建新系列
.SeriesCollection(2).Values = myarr2 '设置嵌入式图表的系列值2的数据
For k = 1 To .SeriesCollection(2).Points.Count '设置系列2的颜色和数据标签
If k = 1 Or k = .SeriesCollection(1).Points.Count Then
.SeriesCollection(2).Points(k).Interior.ColorIndex = xlColorIndexNone '2白色 5兰色 3红色 xlColorIndexNone无色
.SeriesCollection(2).Points(k).ApplyDataLabels Type:=xlDataLabelsShowNone '不显示数据标签
Else
If MyChart_Source.Cells(k, 1) > 0 Then
.SeriesCollection(2).Points(k).Interior.ColorIndex = 5 '2白色 5兰色 3红色 xlColorIndexNone无色
Else
.SeriesCollection(2).Points(k).Interior.ColorIndex = 3 '2白色 5兰色 3红色 xlColorIndexNone无色
End If
.SeriesCollection(2).Points(k).ApplyDataLabels Type:=xlDataLabelsShowValue '显示数据标签
.SeriesCollection(2).DataLabels(k).Font.ColorIndex = 2 '2白色 5兰色 3红色 xlColorIndexNone无色
End If
Next
.ChartGroups(1).GapWidth = 50 '返回或设置图表的系列和系列之间的间距
End With
Mych.Activate '对象激活
MyChart = True '本函数返回True
Exit Function '退出函数
Myerr:
MyChart = False '本函数返回False
End Function
|
|