• ベストアンサー

VBAGraphで点を描画したい

VBAGraphの機能でサイズを設定できる点を描画する方法 を教えてください。 Set objChart = thisSheet.ChartObjects.Add(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) Set charGraph = objChart.Chart

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

>第2軸クリアしないと、違い座標値で表示する。 わけではありません。 >'第2軸設定後クリア >With charGraph.Axes(xlValue, xlSecondary)    '第2軸の最小値を0.4 >  .MinimumScale = 0.4    '第2軸の最大値を1.6 >  .MaximumScale = 1.6    '以上の第2軸を設定した後にDelete >  .Delete >End With [F8]キーでのステップ実行、または最後の.Deleteをコメントアウトして試すとわかります。 以下、グラフ内にTextBoxを追加するサンプルです。 Sub test3()   Dim L As Single   Dim T As Single   'ActiveSheetの1番目のグラフ   With ActiveSheet.ChartObjects(1).Chart     '最終系列の1番目のPoint     With .SeriesCollection       With .Item(.Count).Points(1)         'DataLabelを表示させてLeft,Topを取得         .HasDataLabel = True         With .DataLabel           L = .Left           T = .Top         End With         'DataLabel非表示         .HasDataLabel = False       End With     End With     'Chart内にTextBoxを追加しLeft,Topの位置セット     With .TextBoxes.Add(0, 0, 10, 10)       .AutoScaleFont = False       .AutoSize = True       .Font.Size = 9       .Border.LineStyle = msoLineSingle       .ShapeRange.Fill.Visible = msoTrue       .Text = "該当データがありません"       .Left = L       .Top = T     End With   End With End Sub

yokoyokodragon
質問者

お礼

ありがとうございました。

その他の回答 (5)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.5

ようやく現象が理解できました。 添付画像のような事ですね。 そういう事であれば、"表示点マーカー"を第2軸に設定してください。 主軸と第2軸のMinとMaxを同じにした後に第2軸をクリアすれば良いです。 : charGraph.SeriesCollection.NewSeries Value = 4 charGraph.SeriesCollection(counter).XValues = Value Value = 0.8 charGraph.SeriesCollection(counter).Values = Value charGraph.SeriesCollection(counter).Name = "表示点マーカー" charGraph.SeriesCollection(counter).AxisGroup = 2 '第2軸に設定 : '第2軸設定後クリア With charGraph.Axes(xlValue, xlSecondary)   .MinimumScale = 0.4   .MaximumScale = 1.6   .Delete End With :

yokoyokodragon
質問者

お礼

素晴らしい。解決できました。ありがとうございます。 第2軸クリアしないと、違い座標値で表示する。それはどうしてでしょうか? もう一つご教授したいことはあります。ある条件でこのグラフの中でテキスト を書きたいです。今、Labelで実現していくと考えています。 テキストのフォントは大きくすると、2行3行表示になってしまい。 解決方法があるでしょうか?また、他にグラフの中でテキストを表示させて方法 があるでしょうか? charGraph.SeriesCollection(counter).ApplyDataLabels Type:=xlDataLabelsShowLabel charGraph.SeriesCollection(counter).Points(1).DataLabel.Text = "該当データがありません" どうぞ、よろしくお願いします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

re:#3のコードは貴方の環境ではそのまま実行できるのですか? 回答側がエラーなく実行するには修正しなければいけません。 あまり手間をかけさせないでほしいです。 試す方はOption Explicitを外して D2:D200にx値データ G2:G200にy値データ : >Set objChart = thisSheet.ChartObjects.Add(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) Set objChart = ActiveSheet.ChartObjects.Add(100, 100, 400, 300) : >charGraph.SeriesCollection(counter).Name = Value 'charGraph.SeriesCollection(counter).Name = Value '取りあえず使わない。 : で、本題ですが、re:#3のコードに限っては "表示点マーカー"の系列のy値は >Value = 4 >charGraph.SeriesCollection(counter).Values = Value 4 です。 その後 y軸の設定で >With charGraph.Axes(xlValue) >  .MinimumScale = 0.4 >  .MaximumScale = 1.6 最大値を 1.6 に設定してるので自分で『目盛ラインの外枠に』はみ出させてるでしょう? "表示点マーカー"の系列のy値を何の基準で設定しているかわかりませんが それに応じてcharGraph.Axes(xlValue)のMaximumScaleを設定しないといけません。 最低でも With charGraph.Axes(xlValue)   .MinimumScale = Application.Min(0.4, Value)   .MaximumScale = Application.Max(1.6, Value) このような設定が必要です。

yokoyokodragon
質問者

お礼

回答をありがとうございました。 すみません。いろいろと書きミスがありました。 "表示点マーカー"の系列のy値は<1.6。 テストのため、真ん中ぐらいy=0.8で設定します。 y軸の表示範囲は0.4~1.6と設定しないとできませんが。 下記添付ソースで先に書いた折れ線がy値データ(G2:G200にy値データ) が1.6にオーバした値があります。描画点(表示点マーカー)を つけしないとそれらの折れ線が1.6にオーナした部分を表示しなく、きれいに 外枠(0.4~1.6)の中の部分しか表示しません。 描画点(表示点マーカー)をつけると、描画点(表示点マーカー)と 関係ないこれらの折れ線が外枠(1.6以上)にはみ出し(少しだけですが、)ます。 注目点を明記したいだけなのに、きれい表示できるものはできなくなり、 困っています。 D2:D200にx値データ G2:G200にy値データ charGraph.SeriesCollection.NewSeries value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(xcol) & ":R" & maxRow & "C" & CStr(xcol) charGraph.SeriesCollection(counter).XValues = value value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(ycol) & ":R" & maxRow & "C" & CStr(ycol) charGraph.SeriesCollection(counter).Values = value value = "='" & thisSheet.Name & "'!R" & minRow - 3 & "C" & CStr(xcol) charGraph.SeriesCollection(counter).Name = value deltaCnt = deltaCnt + 1 'カウンター counter = counter + 1

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

部分的にコード提示されても原因は解りません。 その現象を再現する最低限のコードの提示が必要です。 変数counterが何者か、どこでセットして何の数値がはいっているかも提示されてません。 例えば Sub test0()   Dim s As String   With Sheets.Add     s = "'" & .Name & "'!"     With .Range("A1:B20")       .Formula = Array("=row()", "=rand()*2")       .Value = .Value     End With     With .ChartObjects.Add(100, 100, 400, 300).Chart       .ChartType = xlXYScatterLinesNoMarkers       With .SeriesCollection.NewSeries         .XValues = "=" & s & "R1C1:R20C1"         .Values = "=" & s & "R1C2:R20C2"       End With       'X軸の設定       With .Axes(xlCategory)         .MaximumScale = 18         .MinimumScale = 0         .MajorUnit = 1         .HasMajorGridlines = True         .TickLabels.Font.Size = 10.25         .TickLabels.NumberFormatLocal = "0_ "         With .MajorGridlines.Border           .ColorIndex = 57           .Weight = xlHairline           .LineStyle = xlDot         End With       End With       'Y軸の設定       With .Axes(xlValue)         .MinimumScale = 0.4         .MaximumScale = 1.6         .MajorUnit = 0.1         .HasMajorGridlines = True         .TickLabels.Font.Size = 10.25         .TickLabels.NumberFormatLocal = "0.0"         With .MajorGridlines.Border           .ColorIndex = 57           .Weight = xlHairline           .LineStyle = xlDot         End With       End With     End With   End With End Sub このコードで作成されたシートグラフで #2のSub testを実行しても再現しないでしょう? >charGraph.SeriesCollection.NewSeries これで系列を追加してるわけですから系列数が1つ増えています。 >charGraph.SeriesCollection(counter).XValues = value この時のcounterの中身が何か確認してください。 既存系列を変更してませんか?

yokoyokodragon
質問者

お礼

counterは書いた折れ線のカウンタです。 Set objChart = thisSheet.ChartObjects.Add(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) Set charGraph = objChart.Chart charGraph.ChartType = xlXYScatterLinesNoMarkers charGraph.HasLegend = True Dim minRow As Long Dim maxRow As Long Dim counter As Long Dim deltaCnt As Long Dim xcol As Long Dim ycol As Long minRow = 2 maxRow = 200 counter = counter + 1 deltaCnt = 1 Do xcol = 2 + deltaCnt * 2 ycol = 5 + deltaCnt * 2 If IsEmpty(thisSheet.Cells(minRow, xcol).value) Then Exit Do End If charGraph.SeriesCollection.NewSeries value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(xcol) & ":R" & maxRow & "C" & CStr(xcol) charGraph.SeriesCollection(counter).XValues = value value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(ycol) & ":R" & maxRow & "C" & CStr(ycol) charGraph.SeriesCollection(counter).Values = value value = "='" & thisSheet.Name & "'!R" & minRow - 3 & "C" & CStr(xcol) charGraph.SeriesCollection(counter).Name = value deltaCnt = deltaCnt + 1 'カウンター counter = counter + 1 Loop charGraph.SeriesCollection.NewSeries value = 4 charGraph.SeriesCollection(counter).XValues = value value = 4 charGraph.SeriesCollection(counter).Values = value charGraph.SeriesCollection(counter).Name = "表示点マーカー" With charGraph.SeriesCollection(counter) .Border.ColorIndex = 3 .Border.Weight = xlThick .Border.lineStyle = xlDot .MarkerBackgroundColorIndex = 3 .MarkerForegroundColorIndex = 3 .MarkerStyle = xlCircle .MarkerSize = 6 End With

yokoyokodragon
質問者

補足

字数制限があるので、続きです。 charGraph.PlotArea.Interior.ColorIndex = xlNone With charGraph.Axes(xlCategory) .MaximumScale = 18 .MinimumScale = 0 .MajorUnit = 1 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone .HasMajorGridlines = True .HasMinorGridlines = False .TickLabels.Font.Size = 10.25 .TickLabels.NumberFormatLocal = "0_ " With .MajorGridlines.Border .ColorIndex = 57 .Weight = xlHairline .LineStyle = xlDot End With End With With charGraph.Axes(xlValue) .MinimumScale = 0.4 .MaximumScale = 1.6 .MajorUnit = 0.1 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone .HasMajorGridlines = True .HasMinorGridlines = False .TickLabels.Font.Size = 10.25 .TickLabels.NumberFormatLocal = "0.0" With .MajorGridlines.Border .ColorIndex = 57 .Weight = xlHairline .LineStyle = xlDot End With End With With charGraph.Legend .AutoScaleFont = False .Font.Size = 6.25 End With Application.ScreenUpdating = True よろしくお願いします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

http://okwave.jp/qa/q6443729.html http://okwave.jp/qa/q6444005.html 同じテーマだとすると締め切らずに質問を乱立するのは良くないです。 Sub test()   'ActiveSheetの1番目のグラフに1要素だけの散布図系列を追加   With ActiveSheet.ChartObjects(1).Chart.SeriesCollection.NewSeries     .XValues = 5 'X     .Values = 1 'Y     .ChartType = xlXYScatter     .MarkerBackgroundColorIndex = 3     .MarkerForegroundColorIndex = 3     .MarkerStyle = xlCircle     .MarkerSize = 6   End With End Sub こういう事でしょうか。

yokoyokodragon
質問者

お礼

はい。こういう事で同じ現象を生じます。 下記のように他に書いた折れ線はDRAW_Y_MAXをオーバした部分があります。 マーカつけないときれいに外枠(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) 中に収めますが、 一要素(点)だけでマーカを追加すると書いた曲線が移動(オーバ部分を少しだけ表示かも)し目盛ラインの外枠にはみ出します。 Set objChart = thisSheet.ChartObjects.Add(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) charGraph.SeriesCollection.NewSeries value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(xcol) & ":R" & maxRow & "C" & CStr(xcol) charGraph.SeriesCollection(counter).XValues = value value = "='" & thisSheet.Name & "'!R" & minRow & "C" & CStr(ycol) & ":R" & maxRow & "C" & CStr(ycol) charGraph.SeriesCollection(counter).Values = value

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

VBAGraphって何ですか?勝手な用語ではないですか?質問の時ぐらい標準の用語を使うこと。 Googleで照会しても質問者の最近の質問にしか出ないようだが。 エクセルVBAでエクセルのグラフを描かせる場合の、点をマーカーにする、散布図などの点の大きさを左右したいと言うことですか。 1つのマーカー部で右クリック、データ系列の書式設定ー「スタイル」で●を指定ー「サイズ」で数字を指定する、で、マクロの記録を採ればコードがわかるのでは。

yokoyokodragon
質問者

お礼

ご回答をありがとうございました。データ系列の書式設定ー「スタイル」で指定しました。 やはり目盛ラインは移動してしまい。描画曲線は目盛ラインの外枠(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX)にはみ出します。 昨日の質問に書いていないソースです。やはりマーカつけると描画曲線は目盛ラインの外枠 にはみ出します。設定の問題化もし With charGraph.SeriesCollection(counter) .Border.ColorIndex = 3 .Border.Weight = xlThick .Border.lineStyle = xlDot .MarkerBackgroundColorIndex = 3 .MarkerForegroundColorIndex = 3 .MarkerStyle = xlCircle .MarkerSize = 6 End With 設定でなにか設定できるかと思いますが、やるほう方法を見つからないです。 With .MajorGridlines.Border .ColorIndex = 57 .Weight = xlHairline .LineStyle = xlDot End With 'X軸の設定 With charGraph.Axes(xlCategory) .MaximumScale = 18 .MinimumScale = 0 .MajorUnit = 1 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone .HasMajorGridlines = True .HasMinorGridlines = False .TickLabels.Font.Size = 10.25 .TickLabels.NumberFormatLocal = "0_ " With .MajorGridlines.Border .ColorIndex = 57 .Weight = xlHairline .LineStyle = xlDot End With End With 'Y軸の設定 With charGraph.Axes(xlValue) .MinimumScale = 0.4 .MaximumScale = 1.6 .MajorUnit = 0.1 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone .HasMajorGridlines = True .HasMinorGridlines = False .TickLabels.Font.Size = 10.25 .TickLabels.NumberFormatLocal = "0.0" With .MajorGridlines.Border .ColorIndex = 57 .Weight = xlHairline .LineStyle = xlDot End With End With '凡例の設定 With charGraph.Legend .AutoScaleFont = False .Font.Size = 10.25 End With どうぞ、よろしくお願いします

yokoyokodragon
質問者

補足

目盛ラインの外枠ではなく、書いた曲線が移動し目盛ラインの外枠にはみ出したようです。、

関連するQ&A