0

List(Of Decimal)VBを使用してExcelの値からプロットを作成することは可能ですか?データをテーブルに直接ダンプして、そこからグラフを作成することは避けたいと思います。これが私がこれまでに持っているものですが、リストに割り当てようとすると、データ型の不一致が発生.XValues.Valuesます。リストをシリーズに変換するために発生する必要があるある種の変換はありますか?

    Dim Series As Excel.Series
    Dim xVals As New List(Of Decimal)(New Decimal() {1, 3, 4, 5})
    Dim yVals As New List(Of Decimal)(New Decimal() {2, 2, 2, 2})
    xlWorkSheet = CType(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)

    xlWorkSheet.Activate()
    xlWorkSheet.Name = "My Sheet"
    xlCharts = xlWorkSheet.ChartObjects
    xlChartObj = xlCharts.Add(150, 30, 400, 250)
    xlChart = xlChartObj.Chart

    With xlChart
        .ChartType = Excel.XlChartType.xlXYScatterLines
        .HasLegend = True
        .Legend.Position = Excel.XlLegendPosition.xlLegendPositionRight
        .HasTitle = True
        .ChartTitle.Text = "Test Chart"
        For i = 0 To channels.Count - 1
            .SeriesCollection.NewSeries()
            Series = .SeriesCollection(i + 1)
            Series.XValues = xVals
            Series.Values = yvals
        Next
        .Location(Excel.XlChartLocation.xlLocationAsNewSheet)
    End With

アップデート:

次のコードは機能するようですが、あまり理想的ではありません。私が行ったように配列を配列の文字列表現に変換する以外に、これを行うためのより良い方法はありますか?

    Dim Series As Excel.Series
    Dim xVals As New List(Of Decimal)(New Decimal() {1, 3, 4, 5})
    Dim yVals As New List(Of Decimal)(New Decimal() {2, 2, 2, 2})
    Dim xString As String
    Dim yString As String
    xlWorkSheet = CType(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)

    xlWorkSheet.Activate()
    xlWorkSheet.Name = "My Sheet"
    xlCharts = xlWorkSheet.ChartObjects
    xlChartObj = xlCharts.Add(150, 30, 400, 250)
    xlChart = xlChartObj.Chart

    With xlChart
        .ChartType = Excel.XlChartType.xlXYScatterLines
        .HasLegend = True
        .Legend.Position = Excel.XlLegendPosition.xlLegendPositionRight
        .HasTitle = True
        .ChartTitle.Text = "Test Chart"
        For i = 0 To channels.Count - 1
            .SeriesCollection.NewSeries()
            Series = .SeriesCollection(i + 1)

            xString = "={"
            xString += xVals(0).ToString
            For k = 1 To xVals.Count - 1
                xString += ","
                xString += xVals(k).ToString
            Next
            xString = "}"

            yString = "={"
            yString += yVals(0).ToString
            For k = 1 To yVals.Count - 1
                yString += ","
                yString += yVals(k).ToString
            Next
            yString = "}"

            Series.XValues = xString
            Series.Values = yString
        Next
        .Location(Excel.XlChartLocation.xlLocationAsNewSheet)
    End With
4

2 に答える 2

0

FWIW、Excelは、ワークシートからデータをプロットするときに最適です。リスト(または配列)をワークシートにダンプせず、これらの範囲をグラフシリーズのソースデータとして使用しない理由はありますか?

于 2012-05-19T16:12:15.623 に答える
0

オブジェクトとして保存された範囲を使用して、次のコードで必要なものを取得できました。コードの2番目のブロックで言及した文字列メソッドには、8000文字以上の制限がありました(実際の数がわからない、8192?)。

Dim Series As Excel.Series
Dim xVals As New List(Of Decimal)(New Decimal() {1, 3, 4, 5})
Dim yVals As New List(Of Decimal)(New Decimal() {2, 2, 2, 2})
Dim xRange As Object
Dim yRange As Object
Dim tempSheet as Excel.Worksheet

xlWorkSheet = CType(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)
xlWorkSheet.Activate()
xlWorkSheet.Name = "My Sheet"
xlCharts = xlWorkSheet.ChartObjects
xlChartObj = xlCharts.Add(150, 30, 400, 250)
xlChart = xlChartObj.Chart

With xlChart
    .ChartType = Excel.XlChartType.xlXYScatterLines
    .HasLegend = True
    .Legend.Position = Excel.XlLegendPosition.xlLegendPositionRight
    .HasTitle = True
    .ChartTitle.Text = "Test Chart"
    For i = 0 To channels.Count - 1
        tempSheet = CType(Globals.ThisAddIn.Application.Worksheets.Add(), Excel.Worksheet)
        tempSheet.Activate()
        With tempSheet
            .Visible = False
            For k = 0 To xVals.Count - 1
                tempSheet.Cells(k + 1, 1).Value = xVals(k)
                tempSheet.Cells(k + 1, 2).Value = yVals(k) 'Assumes yVals.Count = xVals.Count
            Next
            xRange = tempSheet.Range("A1:A" + xVals.Count.ToString).Value
            yRange = tempSheet.Range("B1:B" + xVals.Count.ToString).Value
            Globals.ThisAddIn.Application.DisplayAlerts = False
            .Delete()
            Globals.ThisAddIn.Application.DisplayAlerts = True
        End With

        Series = .SeriesCollection.NewSeries()
        With Series
            .XValues = xRange
            .Values = yRange
        End With            
    Next
    .Location(Excel.XlChartLocation.xlLocationAsNewSheet)
End With
于 2012-05-23T20:42:53.560 に答える