- ベストアンサー
VBAGraphで点を描画したい
VBAGraphの機能でサイズを設定できる点を描画する方法 を教えてください。 Set objChart = thisSheet.ChartObjects.Add(DRAW_X_MIN, DRAW_Y_MIN, DRAW_X_MAX, DRAW_Y_MAX) Set charGraph = objChart.Chart
- みんなの回答 (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
その他の回答 (5)
- end-u
- ベストアンサー率79% (496/625)
ようやく現象が理解できました。 添付画像のような事ですね。 そういう事であれば、"表示点マーカー"を第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 :
お礼
素晴らしい。解決できました。ありがとうございます。 第2軸クリアしないと、違い座標値で表示する。それはどうしてでしょうか? もう一つご教授したいことはあります。ある条件でこのグラフの中でテキスト を書きたいです。今、Labelで実現していくと考えています。 テキストのフォントは大きくすると、2行3行表示になってしまい。 解決方法があるでしょうか?また、他にグラフの中でテキストを表示させて方法 があるでしょうか? charGraph.SeriesCollection(counter).ApplyDataLabels Type:=xlDataLabelsShowLabel charGraph.SeriesCollection(counter).Points(1).DataLabel.Text = "該当データがありません" どうぞ、よろしくお願いします。
- end-u
- ベストアンサー率79% (496/625)
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) このような設定が必要です。
お礼
回答をありがとうございました。 すみません。いろいろと書きミスがありました。 "表示点マーカー"の系列の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)
部分的にコード提示されても原因は解りません。 その現象を再現する最低限のコードの提示が必要です。 変数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の中身が何か確認してください。 既存系列を変更してませんか?
お礼
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
補足
字数制限があるので、続きです。 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)
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 こういう事でしょうか。
お礼
はい。こういう事で同じ現象を生じます。 下記のように他に書いた折れ線は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)
VBAGraphって何ですか?勝手な用語ではないですか?質問の時ぐらい標準の用語を使うこと。 Googleで照会しても質問者の最近の質問にしか出ないようだが。 エクセルVBAでエクセルのグラフを描かせる場合の、点をマーカーにする、散布図などの点の大きさを左右したいと言うことですか。 1つのマーカー部で右クリック、データ系列の書式設定ー「スタイル」で●を指定ー「サイズ」で数字を指定する、で、マクロの記録を採ればコードがわかるのでは。
お礼
ご回答をありがとうございました。データ系列の書式設定ー「スタイル」で指定しました。 やはり目盛ラインは移動してしまい。描画曲線は目盛ラインの外枠(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 どうぞ、よろしくお願いします
補足
目盛ラインの外枠ではなく、書いた曲線が移動し目盛ラインの外枠にはみ出したようです。、
お礼
ありがとうございました。