本人是VB的初学者,想弄个图表于在网上找到了以下代码,感觉很详细,但跟我的需要还有一定的差别,我的程序里用DTPicker输了时间,时间格式为2007-7-21,ACCESS数据中,一天可能有很多数据,也可能边连续好几天没有数据,我想图表统计出一年中12月份中数据。麻烦高手给帮个忙
日期   单位 人员
2003-11-3    T 张儒林
2003-11-3    T 张儒林
2003-8-18    Q 赵吉发
2003-2-18    Q 王树昆
2003-8-18    Q 赵吉发
2003-8-21    Q 孙绪清
2003-8-21    Q 陈宝超
Private Sub btnTuBiao_Click()
' 定义变量
Dim i As Integer
Dim rs As Recordset
Dim ws As Workspace
Dim db As Database
Dim strDBName As String  ' 数据库文件相对路径' 设置数据库文件的相对路径
strDBName = App.Path
If Right$(strDBName, 1) <> "\" Then strDBName = strDBName & "\"
strDBName = strDBName & "db\dbPinDian.mdb"' 打开数据库.
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(strDBName)
''Set db = OpenDatabase(strDBName)
Set rs = db.OpenRecordset("select 日期,单位,人员 from tbl_PinDian order by 日期", dbOpenSnapshot)
''rs.MoveLast
''rs.MoveFirst
If rs.RecordCount = 0 Then
MsgBox "数据库表中没有数据,请在数据库中输入数据!", vbCritical, "提示"
Exit Sub
End IfmscPinDian.Visible = True ' 设置图表不可见With mscPinDian
    .TitleText = "日期单位人员图表" ' 设置图表标题
    .ColumnCount = 2 ' 设置数据网格的列数 为 2 如 单位 和 人员
    .RowCount = rs.RecordCount ' 设置数据网格的行数 既是上面查询所得的记录数
    For i = 1 To rs.RecordCount
        .Row = i
        .RowLabel = rs("日期")
        .Column = 1 ' 设置数据网格的第一个活动列
        .ColumnLabel = "单位" ' 设置该活动列的标签
        .Data = rs("单位") ' .Data = rs.Fields("单位")
        .Column = 2 ' 设置数据网格的第二个活动列
        .ColumnLabel = "人员" '设置该活动列的标签
        .Data = rs("人员")
        rs.MoveNext
    Next i
    
    '// 设置是否自动缩放
    '.Plot.Axis(V单位AxisIdY).ValueScale.Auto = False
    '// 设置最大值
    .Plot.Axis(V单位AxisIdY).ValueScale.Maximum = 50
    '// 设置最小值
    .Plot.Axis(V单位AxisIdY).ValueScale.Minimum = 0
    '// 设置主要间隔
    .Plot.Axis(V单位AxisIdY).ValueScale.MajorDivision = 5
    '// 设置次要间隔
    .Plot.Axis(V单位AxisIdY).ValueScale.MinorDivision = 1
    
    '// 标记每个点的值
    For i = 1 To .Plot.SeriesCollection.Count
    .Plot.SeriesCollection(i).DataPoints(-1).DataPointLabel.LocationType = V单位LabelLocationTypeAbovePoint
    Next
    
End With
rs.CloseEnd Sub麻烦各位高手了,如果你有更好的办法请给出代码和说明本人是初学者谢谢了。

解决方案 »

  1.   

    我觉得你首先要需要显示什么数据,是12月份每天每个单位的人员数?一共有多少个单位你应该是2D的柱状图来显示的吧
    1.你查询的时候 select isnull(count(*),0),company,date from tb where date between 30/11/2007 and 31/12/2007 group by date,company order by date  (没准有小错误,你查一下)然后rs取出,然后就开始循环了。我们假定你的单位是两个
    With mscPinDian
        .TitleText = "日期单位人员图表" ' 设置图表标题
        .ColumnCount = 2 ' 设置数据网格的列数 为 2 如 单位 和 人员
        .RowCount = rs.RecordCount ' 设置数据网格的行数 既是上面查询所得的记录数
        For i = 1 To rs.RecordCount
            .Row = i
            .RowLabel = rs("日期")
            .Column = 1 ' 设置数据网格的第一个活动列
            .ColumnLabel = "单位" ' 设置该活动列的标签
            .Data = rs("单位") ' .Data = rs.Fields("单位")
            .Column = 2 ' 设置数据网格的第二个活动列
            .ColumnLabel = "人员" '设置该活动列的标签
            .Data = rs("人员")
            rs.MoveNext
        Next i然后就是showlengent 就好了。你试试看吧
      

  2.   

    有一段时间没用 VB 了,帮 DING
      

  3.   

    问题应该不是很难吧,这样吧我想了个比较笨的办法,
    XY轴数据用现成的(Y轴是我定义的变量)X轴  Y轴折线1(我的数值) Y轴折线2
    1月  100           80
    2月  60           11
    。   。           。
    。   。           。
    。   。
    12月 80            60这样应该很简单了吧?我只是不知道具体怎么设置麻烦高手了。
    顺便我还想问一下饼图怎么设置啊?
      

  4.   

    饼图就是chart type=pie折线图一样的阿,chart type=line
    With c2
        .RowCount = 12
        .ColumnCount = 2
        For i = 1 To 12
            .Row = i
            .Column = 1
            .Data = i
            .Column = 2
            .Data = i * 2
            .RowLabel = i
        Next i
        .ShowLegend = True
    End With
    这个是个小例子,套用到你的程序,首先你找出12个月的值,然后循环赋值就好了
    不难,你琢磨琢磨
      

  5.   

    谢谢了回复的真快啊。
    chart type=pie
    chart type=line这个我还是知道的,
    基本的设置我也会一些,就是不会具体的怎么赋值X轴不是1到12而是1月到12月,Y轴上的值不是循环的而是我从数据库中统计出来的具体值。
    也许你说的已经很明白了,但我是初学者希望你多指教了,最好能加上一些注示。
      

  6.   

    初学者也得自己动脑子不是,你照葫芦画瓢基本的设置我也会一些,就是不会具体的怎么赋值X轴不是1到12而是1月到12月,Y轴上的值不是循环的而是我从数据库中统计出来的具体值。
    也许你说的已经很明白了,但我是初学者希望你多指教了,最好能加上一些注示。
    With c2
    .RowCount = 12
    .ColumnCount = 2
    For i = 1 To 12
    .Row = i
    .Column = 1
    .Data = i
    .Column = 2
    .Data = i * 2
    .RowLabel = i & "月" ‘这样不就是1月-12月了么
    Next i
    .ShowLegend = True
    End With你知道怎么从数据库里面取值吧
    .data=rs.fields(0)不就可以了么
    你不循环,一个一个写也行
      

  7.   

    高手就是高手,我怎么就没有想起来用i & "月"哪,佩服佩服,谢谢了。
    但我还是想一个一个的输入数据,数据我会统计的,我有12个月当然也有12个力气了,你帮我举两三个例子就可以了。谢谢。
    With c2是什么意思啊,谢谢了。
      

  8.   

    我连12个月的都写出来摆在上面了,还怎么举例子啊
    你用recordset取数据么?c2是我做实验时候的控件名称,with你看看msdn就知道了c2.row=1
    c2.column=1
    c2.data= ..
    c2.row=2
    c2.column=1
    c2.data=..这样行么
      

  9.   

    不好意思啊我是初学者吗!我是这么统计的Adodc1.RecordSource = "select count(*) as t1 from 表1 where 型号='鞍钢' "
    Adodc1.Refresh
    n = Adodc1.Recordset!t1我再试试,谢谢高手了。
      

  10.   

    初学者不是不自己不动脑筋的借口饼图的想法是这样的,你每一个单位就是一张饼,每个饼分12份,代表你12个月的数据。
    所以你的rowcount=2, columncount=12
    Dim i As Integer
    With c
        .RowCount = 2
        .ColumnCount = 12
        For i = 1 To 12
            .Row = 1
            .Column = i
            .column=i & "月"
            .Data = i
            .Row = 2
            .Data = i * 2
        Next i
        .row=1
        .rowlabel="department1"
        .row=2
        .rowlabel="department2"
        .ShowLegend = True
    End With这个就是你两个单位的12个月例子了,这样你的图例里面就会显示了
      

  11.   

    方法上面已经重复的说了很清楚了,比例会根据你每个月的数据量自动划分的,至于不一定几个月问题,你将for i=1 to 12 中的12变成一个变量,在循环之前将变量赋值不就可以了?