VBA代码自动生成excel中的图表

时间:2015-11-16 14:50:05

标签: vba excel-vba plot charts excel

我正在尝试在excel中编写一个vba代码来生成许多数据组的自动绘图。

我尝试过以下脚本,但是我面临着通过列迭代(图表/图表的x轴,y-ayis)的难度。

第一段代码是从这里的另一个标签复制而来的,应该给出列号和名称之间的关系(即列号33 = AG)。

我的问题是:

  1. 最好选择区域并应用宏或为确切的感兴趣字段编写宏
  2. 有谁知道如何遍历列/组?
  3. 我的数据集示例(此处仅显示3组;第一列是y轴,第一行是图例的标题,接下来的13列是x轴):

        dw=0,01 dw=0,1  dw=1    dw=2    dw=3    dw=4    dw=5    dw=6    dw=8    dw=10   dw=20   dw=30   dw=40
    0,0 0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000
    0,1 0,4011  0,4057  0,4465  0,4827  0,5119  0,5359  0,5561  0,5732  0,6006  0,6215  0,6786  0,7027  0,7146
    0,2 0,5523  0,5553  0,5810  0,6029  0,6199  0,6332  0,6438  0,6522  0,6643  0,6720  0,6796  0,6682  0,6519
    0,3 0,6290  0,6286  0,6245  0,6195  0,6143  0,6089  0,6035  0,5980  0,5870  0,5762  0,5256  0,4818  0,4440
    0,4 0,6726  0,6689  0,6351  0,6038  0,5774  0,5546  0,5347  0,5169  0,4862  0,4605  0,3705  0,3114  0,2672
    0,5 0,6843  0,6778  0,6199  0,5677  0,5248  0,4887  0,4578  0,4310  0,3866  0,3511  0,2403  0,1787  0,1375
    0,6 0,6656  0,6574  0,5840  0,5185  0,4653  0,4211  0,3839  0,3520  0,3002  0,2599  0,1432  0,0862  0,0520
    0,7 0,6135  0,6045  0,5256  0,4556  0,3991  0,3526  0,3137  0,2806  0,2276  0,1871  0,0757  0,0267  0,0014
    0,8 0,5220  0,5137  0,4400  0,3750  0,3227  0,2798  0,2441  0,2139  0,1660  0,1297  0,0333  0,0060  0,0252
    0,9 0,3632  0,3571  0,3033  0,2559  0,2178  0,1867  0,1609  0,1391  0,1046  0,0787  0,0113  0,0145  0,0266
    1,0 0,2435  0,2393  0,2026  0,1703  0,1443  0,1232  0,1056  0,0908  0,0674  0,0499  0,0046  0,0121  0,0198
    
        dw=0,01 dw=0,1  dw=1    dw=2    dw=3    dw=4    dw=5    dw=6    dw=8    dw=10   dw=20   dw=30   dw=40
    0,0 0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000
    0,1 0,3015  0,3059  0,3454  0,3820  0,4126  0,4386  0,4610  0,4804  0,5124  0,5378  0,6116  0,6464  0,6656
    0,2 0,4161  0,4195  0,4497  0,4771  0,4994  0,5178  0,5331  0,5460  0,5661  0,5808  0,6118  0,6140  0,6066
    0,3 0,4742  0,4751  0,4831  0,4896  0,4940  0,4969  0,4986  0,4995  0,4990  0,4967  0,4720  0,4417  0,4122
    0,4 0,5074  0,5058  0,4911  0,4765  0,4635  0,4516  0,4406  0,4304  0,4120  0,3956  0,3314  0,2842  0,2469
    0,5 0,5165  0,5128  0,4792  0,4475  0,4204  0,3969  0,3761  0,3577  0,3262  0,3001  0,2134  0,1616  0,1256
    0,6 0,5026  0,4975  0,4513  0,4083  0,3721  0,3412  0,3144  0,2910  0,2520  0,2207  0,1254  0,0761  0,0457
    0,7 0,4634  0,4577  0,4061  0,3585  0,3188  0,2851  0,2562  0,2312  0,1900  0,1577  0,0645  0,0214  0,0034
    0,8 0,3945  0,3890  0,3400  0,2949  0,2574  0,2258  0,1989  0,1757  0,1378  0,1084  0,0267  0,0084  0,0260
    0,9 0,2746  0,2705  0,2344  0,2012  0,1737  0,1506  0,1309  0,1140  0,0866  0,0654  0,0077  0,0154  0,0266
    1,0 0,1841  0,1814  0,1566  0,1339  0,1151  0,0993  0,0859  0,0744  0,0557  0,0413  0,0025  0,0125  0,0197
    
        dw=0,01 dw=0,1  dw=1    dw=2    dw=3    dw=4    dw=5    dw=6    dw=8    dw=10   dw=20   dw=30   dw=40
    0,0 0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000  0,0000
    0,1 0,0851  0,0873  0,1081  0,1293  0,1487  0,1665  0,1830  0,1983  0,2257  0,2497  0,3356  0,3891  0,4260
    0,2 0,1198  0,1218  0,1414  0,1611  0,1789  0,1950  0,2098  0,2232  0,2468  0,2669  0,3325  0,3664  0,3849
    0,3 0,1375  0,1388  0,1511  0,1633  0,1742  0,1838  0,1924  0,2000  0,2129  0,2233  0,2512  0,2584  0,2566
    0,4 0,1480  0,1485  0,1529  0,1571  0,1606  0,1635  0,1659  0,1678  0,1706  0,1723  0,1701  0,1600  0,1475
    0,5 0,1514  0,1512  0,1486  0,1458  0,1430  0,1403  0,1376  0,1350  0,1298  0,1248  0,1023  0,0834  0,0675
    0,6 0,1480  0,1472  0,1396  0,1317  0,1245  0,1178  0,1116  0,1058  0,0954  0,0862  0,0523  0,0303  0,0148
    0,7 0,1370  0,1359  0,1254  0,1148  0,1052  0,0964  0,0883  0,0809  0,0679  0,0567  0,0186  0,0037  0,0169
    0,8 0,1171  0,1159  0,1050  0,0940  0,0841  0,0751  0,0669  0,0595  0,0464  0,0353  0,0011  0,0195  0,0302
    0,9 0,0817  0,0809  0,0724  0,0640  0,0564  0,0496  0,0434  0,0377  0,0279  0,0196  0,0064  0,0196  0,0268
    1,0 0,0550  0,0543  0,0485  0,0426  0,0374  0,0326  0,0283  0,0244  0,0176  0,0119  0,0056  0,0145  0,0192
    

    以下是现在的代码:

    Sub Makro3()
    '
    ' Makro3 Makro
    'The next lines give the column number to iterate for:
        Dim i&, k&, j&
        Dim d As Integer
        Dim m As Integer
        Dim name As String
        d = colNum
        name = ""
        Do While (d > 0)
            m = (d - 1) Mod 26
            name = Chr(65 + m) + name
            d = Int((d - m) / 26)
        Loop
        GetColumnName = name
    ' The next lines should give the chart commants:
    For i = 1 To 20
        ActiveSheet.Shapes.AddChart.Select
        ActiveChart.ChartType = xlXYScatterSmoothNoMarkers
        ActiveSheet.Shapes("Diagramm ""i"").IncrementLeft 445.9090551181
        'here the next chart should be designed below the prior chart
        ActiveSheet.Shapes("Diagramm ""i"").IncrementTop i * 10  
        ActiveChart.ApplyLayout (1)
        ' iterate through the columns for each group of series
        For k = 1 To 13
        ActiveChart.SeriesCollection.NewSeries
        ' the name of the column i.e. AH69
        ActiveChart.SeriesCollection(k).Name = "=linear!$AH$68"
        ' the x-axis changes with increasing column number
        ActiveChart.SeriesCollection(k).XValues = "=linear!$AH$69:$AH$79"
        ' the y-axis changes with increasing group set
        ActiveChart.SeriesCollection(k).Values = "=linear!$AG$69:$AG$79"
        Next k
        ' script lines to define the format of the chart, axes, etc...
        With
        ......
        End With
        ActiveChart.Axes(xlCategory).AxisTitle.Select
    Next i
    End Sub
    

    使用这个脚本我期待3个图表,每个图表有13条曲线。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我认为这可能比你的方式简单得多。根据您提供的示例数据,查看下面的代码。

我做了以下假设:

  1. 数据从单元格A1开始
  2. 工作表名称为" Sheet1"
  3. 数据集与提供的完全一致(每组之间有一个行间距
  4. 根据这些假设,您可以根据具体需要更改所有计数和工作表/范围参考。

    Sub MakeCharts()
    
    Dim ws As Worksheet
    Set ws = Sheets("Sheet1")
    
    Dim x As Integer
    
    For x = 1 To 38 Step 13
    
        ws.Shapes.AddChart.Select
    
        With ActiveChart
    
            .ChartType = xlXYScatterSmoothNoMarkers
    
            Dim k As Integer
    
            For k = 1 To 13
    
                .SeriesCollection.NewSeries
                .SeriesCollection(k).Name = ws.Cells(x, k + 1)
                .SeriesCollection(k).XValues = ws.Range(ws.Cells(x + 1, k + 1), ws.Cells(x + 11, k + 1))
                .SeriesCollection(k).Values = ws.Range(ws.Cells(x + 1, 1), ws.Cells(x + 11, 1))
    
            Next
    
            .ApplyLayout (1)
    
            Dim sName As String
            sName = Replace(.Name, ws.Name & " ", "")
    
        End With
    
        With ActiveSheet.Shapes(sName)
            .IncrementLeft 445.9090551181
            .IncrementTop x * 10
        End With
    
    Next
    
    End Sub