Excel (VBA) |
![]() ![]() |
(Windows 10 Pro : Microsoft 365)
グラフのX2軸を表示
投稿日時: 23/05/26 15:08:30
投稿者: George
|
---|---|
こんにちわ。
|
![]() |
投稿日時: 23/05/26 16:13:32
投稿者: sk
|
---|---|
引用: 2 つの数値軸(第 1 縦軸と第 2 縦軸)を持つグラフが選択されている状態で、 [グラフのデザイン]タブ -> [グラフのレイアウト]グループ -> [グラフ要素を追加] -> [軸] -> [第 2 横軸]をクリックして 第 2 横軸を追加したい(もしくはそれと同じことを VBA のコード によって実現したい)ということでしょうか。 |
![]() |
投稿日時: 23/05/26 16:46:52
投稿者: George
|
---|---|
sk さんの引用:引用: 第1縦軸、第1横軸がある状態で第2横軸に値を表示したいと思っています。 そこに決まった最小値、最大値、指定した間隔値の軸として表示したいです。 これで伝わりますでしょうか? |
![]() |
投稿日時: 23/05/26 17:01:03
投稿者: sk
|
---|---|
引用: 第 2 横軸(項目軸)やその目盛ラベルを表示するには、 第 2 縦軸(数値軸)グループに属するデータ系列が 1 つ以上なければなりませんが、その設定は 既に出来ているのでしょうか。 引用: また、そのグラフの種類は何なのでしょうか(散布図?)。 |
![]() |
投稿日時: 23/05/29 08:52:52
投稿者: George
|
---|---|
返信が遅くなりました。
引用: そこは設定していませんでした。 やはりそこを設定しないといけないのですね。 引用: グラフというより時間の目盛りを出したいと思っています。 画像をここに貼れたらイメージをお伝えできると思ったのですが、 このサイトでは画像が貼れないのでサイトのURLを貼っておきます。 http://www.elmos.jp/rai.htm ここの取扱説明書で出てくるビューアツールが実行ファイルのみなので 似たような機能のものをコーディングしているところなのです。 |
![]() |
投稿日時: 23/05/29 09:25:29
投稿者: simple
|
---|---|
軸だけの別のグラフを作成して、それを上に被せたらどうですか?
|
![]() |
投稿日時: 23/05/29 10:09:17
投稿者: George
|
---|---|
軸だけの別グラフを重ねるとはどういうことでしょうか?
|
![]() |
投稿日時: 23/05/29 14:37:38
投稿者: simple
|
---|---|
そもそも対象のグラフは散布図を使ったものですか?
|
![]() |
投稿日時: 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 つ以上なければなりません。 引用: 第 1 横軸がサンプル番号、第 1 縦軸がアナログ電圧値( V )、 第 2 横軸がサンプリング周期(μsec)を表しているとして、 グラフにプロットするデータとして実際に取得することができるのが チャネルごとの電圧値しかない(第 2 縦軸/横軸上の座標にプロットすべき データがそもそも存在しない)状況であるなら、基本的には 「空のデータ系列」を用意し、第 2 縦軸/横軸を使用して プロットさせ(見かけ上は何も表示されない)、 第 1 横軸で使用される範囲と第 2 横軸で使用される範囲を 別々にするしかないでしょう。 引用: 散布図(直線)にしないと、恐らく望まれているような結果を 得るのは難しいと思います。 |
![]() |
投稿日時: 23/05/30 06:39:47
投稿者: simple
|
---|---|
既にskさんから適切な回答がありますが、つけたしで。
|
![]() |
投稿日時: 23/05/30 14:17:05
投稿者: George
|
---|---|
引用:引用: データ系列を1つ増やして試してみているのですが、うまくいきません。 ここで言う「空のデータ系列」とはどういうことでしょうか? その「空のデータ系列」で第2横軸が出るイメージが湧きません。 引用:引用: どうして散布図じゃないとうまくいかないのかを聴ければと思います。 |
![]() |
投稿日時: 23/05/31 16:06:38
投稿者: sk
|
---|---|
引用: 例えば、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さんの意見を参考にして想定通りの見栄えにできました。
|