簡體   English   中英

VBA-Excel - 圖表創建者

[英]VBA-Excel - Graph creator

我正在嘗試創建一個代碼來生成一些圖表,其中一些數據已經存儲在數組中。

宏的實際最終結果如下圖:

在此處輸入圖像描述

用於它的代碼如下:

            Dim sht As Worksheet
            Set sht = ActiveSheet
            Dim chtObj As ChartObject
            Set chtObj = sht.ChartObjects.Add(100, 10, 500, 300)
            Dim cht As Chart
            Set cht = chtObj.Chart
            
            If IsZeroLengthArray(yData_TSI) = False Then
                Dim ser As Series
                Set ser = cht.SeriesCollection.NewSeries
                ser.Values = yData_TSI
                ser.XValues = xData_TSI
                ser.Name = "TSI Predicant"
                ser.ChartType = xlXYScatterSmooth
            End If
            If IsZeroLengthArray(yData_Pallet) = False Then
                Dim ser2 As Series
                Set ser2 = cht.SeriesCollection.NewSeries
                ser2.Values = yData_Pallet
                ser2.XValues = xData_Pallet
                ser2.Name = "Pallet Decant"
                ser2.ChartType = xlXYScatterSmooth
            End If
            If IsZeroLengthArray(yData_Vendor) = False Then
                Dim ser3 As Series
                Set ser3 = cht.SeriesCollection.NewSeries
                ser3.Values = yData_Vendor
                ser3.XValues = xData_Vendor
                ser3.Name = "Vendor Decant"
                ser3.ChartType = xlXYScatterSmooth
            End If
            If IsZeroLengthArray(yData_Prep) = False Then
                Dim ser4 As Series
                Set ser4 = cht.SeriesCollection.NewSeries
                ser4.Values = yData_Prep
                ser4.XValues = xData_Prep
                ser4.Name = "Each"
                ser4.ChartType = xlXYScatterSmooth
            End If
            If IsZeroLengthArray(yData_Each) = False Then
                Dim ser5 As Series
                Set ser5 = cht.SeriesCollection.NewSeries
                ser5.Values = yData_Each
                ser5.XValues = xData_Each
                ser5.Name = "Prep"
                ser5.ChartType = xlXYScatterSmooth
            End If

我有其他數組 (tData_XXX) 數字,我想將它們作為標簽添加到圖中的項目符號中。 為了清楚起見,對於之前生成的相同圖表,讓我們想象一下,對於“Vendor Decant”數據,tData_Vendor 數組具有數字(34、5、12)。 期望的結果應該是這樣的:

在此處輸入圖像描述

我怎樣才能在代碼上做到這一點?

謝謝!

筆記:

  • 所有數組(yData_XXX、xData_XXX 和 tData_XXX)的大小始終相同

未經測試,但這樣的事情應該可以工作:

Sub CreateChart()
    Dim sht As Worksheet, chtObj As ChartObject, cht As Chart
    
    Set sht = ActiveSheet
    Set chtObj = sht.ChartObjects.Add(100, 10, 500, 300)
    Set cht = chtObj.Chart
    
    AddSeries cht, "TSI Predicant", yData_TSI, xData_TSI, tData_TSI
    AddSeries cht, "Pallet Decant", yData_Pallet, xData_Pallet, tData_Pallet
    AddSeries cht, "Vendor Decant", yData_Vendor, xData_Vendor, tData_Vendor
    AddSeries cht, "Each", yData_Prep, xData_Prep, tData_Prep '???
    AddSeries cht, "Prep", yData_Each, xData_Each, tData_Each '???
    
End Sub

Sub AddSeries(cht As Chart, seriesName As String, xVals, yVals, labelVals)
    Dim i As Long
    If Not IsZeroLengthArray(yVals) Then
        With cht.SeriesCollection.NewSeries
            .ChartType = xlXYScatterSmooth
            .Values = yVals
            .XValues = xVals
            .Name = seriesName
            .ApplyDataLabels
            'loop over series points and apply label from array
            For i = 1 To .Points.Count
                .Points(i).DataLabel.Text = labelVals(i - 1) 'assuming arrays are zero-based
            Next
        End With
    End If
End Sub

請注意,您可以通過將重復的“添加系列”步驟分解為單獨的方法來減少代碼量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM