Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
グラフのX2軸を表示
投稿日時: 23/05/26 15:08:30
投稿者: George

こんにちわ。
 
早速ですが質問させていただきます。
元々は.net環境で実装したいのですが、Excelにもグラフがあると思い試したのですが
うまくいかないため質問させてもらいます。
 
グラフのX軸の2軸目に値を表示したいです。
色々とプロパティを変更してみているのですが表示されません。
 
どのようにしたら良いでしょうか?

回答
投稿日時: 23/05/26 16:13:32
投稿者: sk

引用:
グラフのX軸の2軸目に値を表示したいです。

2 つの数値軸(第 1 縦軸と第 2 縦軸)を持つグラフが選択されている状態で、
[グラフのデザイン]タブ -> [グラフのレイアウト]グループ
-> [グラフ要素を追加] -> [軸] -> [第 2 横軸]をクリックして
第 2 横軸を追加したい(もしくはそれと同じことを VBA のコード
によって実現したい)ということでしょうか。

投稿日時: 23/05/26 16:46:52
投稿者: George

sk さんの引用:
引用:
グラフのX軸の2軸目に値を表示したいです。

2 つの数値軸(第 1 縦軸と第 2 縦軸)を持つグラフが選択されている状態で、
[グラフのデザイン]タブ -> [グラフのレイアウト]グループ
-> [グラフ要素を追加] -> [軸] -> [第 2 横軸]をクリックして
第 2 横軸を追加したい(もしくはそれと同じことを VBA のコード
によって実現したい)ということでしょうか。

第1縦軸、第1横軸がある状態で第2横軸に値を表示したいと思っています。
そこに決まった最小値、最大値、指定した間隔値の軸として表示したいです。
 
これで伝わりますでしょうか?

回答
投稿日時: 23/05/26 17:01:03
投稿者: sk

引用:
第1縦軸、第1横軸がある状態で第2横軸に値を表示したいと思っています。

第 2 横軸(項目軸)やその目盛ラベルを表示するには、
第 2 縦軸(数値軸)グループに属するデータ系列が
1 つ以上なければなりませんが、その設定は
既に出来ているのでしょうか。
 
引用:
そこに決まった最小値、最大値、指定した間隔値の軸として表示したいです。

また、そのグラフの種類は何なのでしょうか(散布図?)。

投稿日時: 23/05/29 08:52:52
投稿者: George

返信が遅くなりました。
 

引用:

引用:
第1縦軸、第1横軸がある状態で第2横軸に値を表示したいと思っています。

第 2 横軸(項目軸)やその目盛ラベルを表示するには、
第 2 縦軸(数値軸)グループに属するデータ系列が
1 つ以上なければなりませんが、その設定は
既に出来ているのでしょうか。

そこは設定していませんでした。
やはりそこを設定しないといけないのですね。
 
引用:

引用:
そこに決まった最小値、最大値、指定した間隔値の軸として表示したいです。

また、そのグラフの種類は何なのでしょうか(散布図?)。

グラフというより時間の目盛りを出したいと思っています。
画像をここに貼れたらイメージをお伝えできると思ったのですが、
このサイトでは画像が貼れないのでサイトのURLを貼っておきます。
http://www.elmos.jp/rai.htm
 
ここの取扱説明書で出てくるビューアツールが実行ファイルのみなので
似たような機能のものをコーディングしているところなのです。

回答
投稿日時: 23/05/29 09:25:29
投稿者: simple

軸だけの別のグラフを作成して、それを上に被せたらどうですか?

投稿日時: 23/05/29 10:09:17
投稿者: George

軸だけの別グラフを重ねるとはどういうことでしょうか?
いずれにしてもX2軸に設定したとしてもY2軸側は不要なので
どのような方法を言われているのか読解力がなくて想像がつきません。

回答
投稿日時: 23/05/29 14:37:38
投稿者: simple

そもそも対象のグラフは散布図を使ったものですか?
明確な返事がなかったのですが。
 
y方向の数値はすべて0にして、マーカーもなしにして、
y軸ラベルも非表示にすればよいと思いました。
私もちょっと試行錯誤したうえで提案したのですが、マクロに仕立てるのも手間かもしれませんね。
尤も、想像もつかないということなら、没にしてください。

投稿日時: 23/05/29 14:52:53
投稿者: George

simple さんの引用:
そもそも対象のグラフは散布図を使ったものですか?
明確な返事がなかったのですが。

対象のグラフは折れ線グラフです。
 
ちなみに今のソースを下に載せておきます。
↓グラフの表示設定部分
With ChartObject.ChartAreas(0)
    '最小値:0、最大値:入力値
    With .AxisX
        .MajorGrid.Enabled = True
        .MajorGrid.LineWidth = 1

        .Minimum = 0
        .Maximum = Convert.ToInt32(strSmplCnt)

        .MinorGrid.Enabled = False
        .MinorGrid.LineWidth = 1
        .MinorGrid.Interval = 1
        .MinorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
    End With

    '最小値:-1、最大値:10
    With .AxisY
        .MajorGrid.Enabled = False
        .MajorGrid.LineWidth = 2
        .MinorGrid.Enabled = True
        .Minimum = -1
        .Maximum = 10
        .Interval = 2
        .LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid

        '補助線を表示
        .MinorGrid.Enabled = False
        .MinorGrid.Interval = 1
        .MinorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
    End With

    '最小値:0、最大値:1
    With .AxisX2
        .MajorGrid.Enabled = True
        .MajorGrid.LineWidth = 1
        .MinorGrid.Enabled = True

        .Minimum = 0
        .Maximum = 1000
        .Interval = 100
        .MinorGrid.Enabled = True
    End With

    With .AxisY2
        .MajorGrid.Enabled = False
        .MajorGrid.LineWidth = 2
        .MinorGrid.Enabled = True
        .Minimum = -1
        .Maximum = 10
        .Interval = 2
        .LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid

        '補助線を表示
        .MinorGrid.Enabled = False     'True に設定しないと表示しない
        .MinorGrid.Interval = 1
        .MinorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
    End With
End With

 
↓データの設定部分
With Form1
    '各グラフに対してデータを設定
    For ChartPointCnt0 As Integer = CH0Value.GetLowerBound(0) To CH0Value.GetUpperBound(0)
.ChartALL.Series(0).Points.AddXY(ChartPointCnt0, CH0Value(ChartPointCnt0))
.ChartCH0.Series(0).Points.AddXY(ChartPointCnt0, CH0Value(ChartPointCnt0))
    Next

    For ChartPointCnt1 As Integer = CH1Value.GetLowerBound(0) To CH1Value.GetUpperBound(0)
.ChartALL.Series(1).Points.AddXY(ChartPointCnt1, CH1Value(ChartPointCnt1))
.ChartCH1.Series(0).Points.AddXY(ChartPointCnt1, CH1Value(ChartPointCnt1))
    Next

    For ChartPointCnt2 As Integer = CH2Value.GetLowerBound(0) To CH2Value.GetUpperBound(0)
.ChartALL.Series(2).Points.AddXY(ChartPointCnt2, CH2Value(ChartPointCnt2))
.ChartCH2.Series(0).Points.AddXY(ChartPointCnt2, CH2Value(ChartPointCnt2))
    Next

    For ChartPointCnt3 As Integer = CH3Value.GetLowerBound(0) To CH3Value.GetUpperBound(0)
.ChartALL.Series(3).Points.AddXY(ChartPointCnt3, CH3Value(ChartPointCnt3))
.ChartCH3.Series(0).Points.AddXY(ChartPointCnt3, CH3Value(ChartPointCnt3))
    Next

    '凡例の色設定(データ設定をするとデザイン時に設定していても元に戻るため)
    .ChartALL.Legends(0).BackColor = Color.Transparent
    .ChartCH0.Legends(0).BackColor = Color.Transparent
    .ChartCH1.Legends(0).BackColor = Color.Transparent
    .ChartCH2.Legends(0).BackColor = Color.Transparent
    .ChartCH3.Legends(0).BackColor = Color.Transparent
End With

回答
投稿日時: 23/05/29 15:11:20
投稿者: sk

引用:
ここの取扱説明書で出てくるビューアツール

そのマニュアルの 14 ページ目の図 4.1 や 16 ページ目の
図 4.2 のようなビジュアルのグラフを作成しようとしているとして、
 
引用:
グラフというより時間の目盛りを出したいと思っています。

既に申し上げた通り、第 2 縦軸が使用されているデータ系列がなければ
第 2 横軸を表示させることは出来ません。
 
そして第 2 縦軸を使用するには、そのグラフにおいてプロットされる
データ系列が 2 つ以上なければなりません。
 
引用:
いずれにしてもX2軸に設定したとしてもY2軸側は不要

第 1 横軸がサンプル番号、第 1 縦軸がアナログ電圧値( V )、
第 2 横軸がサンプリング周期(μsec)を表しているとして、
グラフにプロットするデータとして実際に取得することができるのが
チャネルごとの電圧値しかない(第 2 縦軸/横軸上の座標にプロットすべき
データがそもそも存在しない)状況であるなら、基本的には
「空のデータ系列」を用意し、第 2 縦軸/横軸を使用して
プロットさせ(見かけ上は何も表示されない)、
第 1 横軸で使用される範囲と第 2 横軸で使用される範囲を
別々にするしかないでしょう。
 
引用:
対象のグラフは折れ線グラフです。

散布図(直線)にしないと、恐らく望まれているような結果を
得るのは難しいと思います。

回答
投稿日時: 23/05/30 06:39:47
投稿者: simple

既にskさんから適切な回答がありますが、つけたしで。
 
"excel x2軸" でネット検索してみました。
(1)折れ線グラフの例
http://kenkitagawa.cocolog-nifty.com/blog/2013/03/excel-2010x2-42.html
(2)散布図(直線)
https://www.lightstone.co.jp/origin/origin_vs_excel/multi_x.html
これの右側の記事
 
取扱書にあるグラフは、(2)散布図(直線)じゃないかと思います。
あとはマクロ記録などが参考になると思われます。
.netに関する事項なら、それに相応しい質問掲示板がよろしいかと思います。

投稿日時: 23/05/30 14:17:05
投稿者: George

引用:
引用:
いずれにしてもX2軸に設定したとしてもY2軸側は不要

第 1 横軸がサンプル番号、第 1 縦軸がアナログ電圧値( V )、
第 2 横軸がサンプリング周期(μsec)を表しているとして、
グラフにプロットするデータとして実際に取得することができるのが
チャネルごとの電圧値しかない(第 2 縦軸/横軸上の座標にプロットすべき
データがそもそも存在しない)状況であるなら、基本的には
「空のデータ系列」を用意し、第 2 縦軸/横軸を使用して
プロットさせ(見かけ上は何も表示されない)、
第 1 横軸で使用される範囲と第 2 横軸で使用される範囲を
別々にするしかないでしょう。

データ系列を1つ増やして試してみているのですが、うまくいきません。
ここで言う「空のデータ系列」とはどういうことでしょうか?
その「空のデータ系列」で第2横軸が出るイメージが湧きません。
 
引用:
引用:
対象のグラフは折れ線グラフです。

散布図(直線)にしないと、恐らく望まれているような結果を
得るのは難しいと思います。

どうして散布図じゃないとうまくいかないのかを聴ければと思います。

回答
投稿日時: 23/05/31 16:06:38
投稿者: sk

引用:
ここで言う「空のデータ系列」とはどういうことでしょうか?
その「空のデータ系列」で第2横軸が出るイメージが湧きません。

例えば、Excel のマクロでグラフを作成するならば
次のサンプルのようなイメージです。
 
(標準モジュール)
----------------------------------------------------------------------
Private Sub Test0001()
 
    Const SamplingCount As Long = 200
    Const SamplingRate As Long = 1
    Const MinimumVoltage As Long = -5
    Const MaximumVoltage As Long = 15
 
    If SamplingCount <= 0 Then
        Exit Sub
    End If
     
    If SamplingRate <= 0 Then
        Exit Sub
    End If
     
    If MaximumVoltage <= 0 Then
        Exit Sub
    End If
     
    If MinimumVoltage > MaximumVoltage Then
        Exit Sub
    End If
         
    Dim xlsWorkbook As Excel.Workbook
    Dim xlsWorksheet As Excel.Worksheet
     
    '新規ブックの作成
    Set xlsWorkbook = Workbooks.Add
    Set xlsWorksheet = xlsWorkbook.Worksheets(1)
         
    'サンプルデータの作成
    With xlsWorksheet
         
        .Range("A1").Value = "番号"
        .Range("A2").Value = 0
        .Range("A2").DataSeries xlColumns, xlDataSeriesLinear, , 1, SamplingCount
         
        .Range("B1").Value = "値"
        With .Range("B2").Resize(SamplingCount + 1, 1)
            .Formula = "=(" & MaximumVoltage & "/2)+(" & MaximumVoltage & "/4*SIN($A2*2/PI()))"
            .Value = .Value
        End With
         
    End With
         
    Dim xlsChartObject As Excel.ChartObject
     
    'グラフオブジェクトの作成
    With xlsWorksheet.Range("D1").Resize(30, 10)
        Set xlsChartObject = xlsWorksheet.ChartObjects.Add(.Left, .Top, .Width, .Height)
    End With
         
    Dim xlsChart As Excel.Chart
     
    Set xlsChart = xlsChartObject.Chart
     
    'グラフの設定
    With xlsChart
        .HasTitle = True
        .ChartTitle.Caption = "グラフ名"
        .HasLegend = True
        .Legend.Position = xlLegendPositionBottom
        With .PlotArea.Format.Line
            .Visible = True
            .DashStyle = msoLineSolid
            .ForeColor.RGB = rgbGray
        End With
    End With
     
    Dim xlsSeries As Excel.Series
     
    '1つめのデータ系列の追加と設定
    Set xlsSeries = xlsChart.SeriesCollection.NewSeries
    With xlsSeries
        .ChartType = xlXYScatterSmoothNoMarkers
        .AxisGroup = xlPrimary
        .Name = xlsWorksheet.Range("B1")
        .XValues = xlsWorksheet.Range("A2").Resize(SamplingCount + 1, 1)
        .Values = xlsWorksheet.Range("B2").Resize(SamplingCount + 1, 1)
        With .Format.Line
            .DashStyle = msoLineSolid
            .ForeColor.RGB = RGB(255, 0, 0)
            .Weight = 0.5
        End With
    End With
    Set xlsSeries = Nothing
     
    '2つめのデータ系列(空の系列)の追加と設定
    Set xlsSeries = xlsChart.SeriesCollection.NewSeries
    With xlsSeries
        .ChartType = xlXYScatterLinesNoMarkers
        .AxisGroup = xlSecondary
        .Name = xlsWorksheet.Range("A1").Text
        .XValues = ""
        .Values = ""
        With .Format.Line
            .Visible = False
        End With
    End With
    Set xlsSeries = Nothing
     
    Dim xlsAxis As Excel.Axis
     
    '第1横軸の設定
    xlsChart.SetElement msoElementPrimaryCategoryAxisShow
    Set xlsAxis = xlsChart.Axes(xlCategory, xlPrimary)
    With xlsAxis
        .CategoryType = xlTimeScale
        .MinimumScale = 0
        .MaximumScale = SamplingCount
        .MajorUnitIsAuto = True
        .MinorUnitIsAuto = True
        .MajorTickMark = xlTickMarkCross
        .MinorTickMark = xlTickMarkCross
        With .MajorGridlines.Format.Line
            .Visible = False
        End With
        .TickLabelPosition = xlTickLabelPositionLow
        .TickLabels.NumberFormat = "0"
    End With
    Set xlsAxis = Nothing
     
    '第1縦軸の設定
    xlsChart.SetElement msoElementPrimaryValueAxisShow
    xlsChart.SetElement msoElementPrimaryValueGridLinesMajor
    Set xlsAxis = xlsChart.Axes(xlValue, xlPrimary)
    With xlsAxis
        .MinimumScale = MinimumVoltage
        .MaximumScale = MaximumVoltage
        .MinorUnit = 1
        .MajorUnit = 5
        .MajorTickMark = xlTickMarkInside
        .MinorTickMark = xlTickMarkInside
        With .MajorGridlines.Format.Line
            .Visible = True
            .DashStyle = msoLineDash
            .ForeColor.RGB = rgbGray
        End With
        .TickLabelPosition = xlTickLabelPositionLow
        .TickLabels.NumberFormat = "0""V"""
    End With
    Set xlsAxis = Nothing
     
    '第2縦軸の設定
    xlsChart.SetElement msoElementSecondaryValueAxisShow
    Set xlsAxis = xlsChart.Axes(xlValue, xlSecondary)
    With xlsAxis
        .MinimumScale = MinimumVoltage
        .MaximumScale = MaximumVoltage
        .MinorUnit = 1
        .MajorUnit = 5
        .MajorTickMark = xlTickMarkInside
        .MinorTickMark = xlTickMarkInside
        With .MajorGridlines.Format.Line
            .Visible = False
        End With
        .TickLabelPosition = xlTickLabelPositionNone
    End With
    Set xlsAxis = Nothing
     
    '第2横軸の設定
    xlsChart.SetElement msoElementSecondaryCategoryAxisShow
    xlsChart.SetElement msoElementSecondaryCategoryGridLinesMajor
    Set xlsAxis = xlsChart.Axes(xlCategory, xlSecondary)
    With xlsAxis
        .CategoryType = xlTimeScale
        .MinimumScale = 0
        .MaximumScale = SamplingRate * 100
        .MajorUnit = 10
        .MinorUnit = 5
        .MajorTickMark = xlTickMarkInside
        .MinorTickMark = xlTickMarkInside
        With .MajorGridlines.Format.Line
            .Visible = True
            .DashStyle = msoLineDash
            .ForeColor.RGB = rgbGray
        End With
        .TickLabelPosition = xlTickLabelPositionHigh
        .TickLabels.NumberFormat = "0""μs"""
    End With
    Set xlsAxis = Nothing
     
    '凡例から最後のデータ系列を削除
    With xlsChart.Legend.LegendEntries
        .Item(.Count).Delete
    End With
     
    Set xlsChart = Nothing
    Set xlsChartObject = Nothing
    Set xlsWorksheet = Nothing
    Set xlsWorkbook = Nothing
 
End Sub
----------------------------------------------------------------------

投稿日時: 23/05/31 16:23:55
投稿者: George

simpleさんの意見を参考にして想定通りの見栄えにできました。
 
散布図ではいけない理由が聴けませんでしたがこれにて終了とさせていただきます。
ありがとうございました。