• ベストアンサー

VBAで散布図(グラフ)の作成

VBAでセルの値を読み込み散布図である折れ線グラフを作成しました。しかし、x軸に指定したい列も折れ線(xlScatterLines)で表示されてしまい思い通りになりません。どのようなキーワードでx軸を指定できるのでしょうか?ちなみに、そのグラフの[元のデータ]を参照するとやはりx軸の項目が空欄になっています。

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

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

私なりにまとめてみました。参考になりますでしょうか。 反例などありましたら、指摘してください。 ここでは項目データが、列ごとに記録されているシートを考えます。 A列に体重、B列に身長、C列に年令などの例です。 (1)エクセルの散布図は2次元の図です。縦横の座標データが必要です。 また3つ以上あっても、2次元散布図では書けません。 シートに沢山(3列以上)の系列がある場合は、3系列以上指定するまたは指定しないと、それぞれが折れ線グラフで線なしの点グラフになってしまいます。 (2)2列の同行データでy軸、x軸で測って、交差する位置に点が描かれます。 (3)文字列の列があっても、2列しか数値データがない場合は、最初に出てくる数値列と次に出てくる数値列の2つが取り上げられます。 指定しないと、上例では体重と身長の散布図となります。 A列に近いほうから、最初にあるデータ列がX軸になり、次にあるデータ列がY軸になります。グラフウイザードの2/4でデータ範囲を、逆転させて 指定しても、逆になりません。列を入れかえるより他ないようです。 しかし隣り合わない、2つの列を指定したい(例えば体重と年令)場合は、体重列と年令列を(CTRLキーを押して)範囲指定して、グラフを描かせれば良い。 (4)そのほかに、Y軸の目盛の範囲を決めたいときは、一旦グラフを作成しY軸をクリックして、右クリックして、「軸の書式設定」を選び、「目盛」タブを選び、Y/数値軸目盛の最小値・最大値を指定します。身長であれば最小140、最大190とか指定します。X軸との交差点も指定します。 (5)あとX軸の目盛の範囲を決めたいときは、一旦グラフを作成しX軸をクリックして、右クリックして、「軸の書式設定」を選び、「目盛」タブを 選び、X/数値軸目盛の最小値・最大値を指定します。体重であれば最小50、最大90とか指定します。 (6)以上で目盛り線、凡例、タイトル、マーカー、データラベルなどを除いた、数値的な仕様が決まります。 -------- さて本題の、VBAでは (A)散布図は Charts.Add ActiveChart.ChartType = xlXYScatter (B)系列はActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D7"), PlotBy:= _ xlColumns この例ではA、C列は文字列の例でした。 列方向にデータ系列を考えるときはPlotBy:=xlColumnsです。 (C)グラフにするデータの列(と範囲)の指定は C,D列に数値データがあるときの例では ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("C1:D7") 離れた範囲の場合は ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("C1:C7,E1:E7"), (D)X軸の最高値と最低値、Y軸の最高値と最低値、交差する点を 定義するのは下記で行う。 ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = 50 .MaximumScale = 100 .CrossesAt = 50 End With ActiveChart.Axes(xlValue).Select With ActiveChart.Axes(xlValue) .MinimumScale = 20 .MaximumScale = 100 .CrossesAt = 20 End With

e-l
質問者

お礼

大変助かりました。有難う御座います。

その他の回答 (3)

  • sanakazu
  • ベストアンサー率18% (43/230)
回答No.3

#1です、度々失礼します。 No.1での回答ではXValuesがX軸、ValuesがY軸を指定します、説明が抜けておりました。

  • sanakazu
  • ベストアンサー率18% (43/230)
回答No.2

#1です。補足です。 xv = "='Sheet1'!R1C1:R10C1" これで"xv"にはシート名「Sheet1」のA1~A10セル範囲を指定したことになります。

  • sanakazu
  • ベストアンサー率18% (43/230)
回答No.1

事前に"xv""yv"には指定した行列の範囲をいれておきます。("i"はグラフ内の変更したい系列番号) ActiveChart.SeriesCollection(i).XValues = xv ActiveChart.SeriesCollection(i).Values = yv これでできました。 Formulaで一括変更も可能ですが、その後系列番号が変わってしまいますので、こちらは割愛します。 漠然としていますか?詳細が必要なら後ほどレスいたしますが・・・?

e-l
質問者

お礼

ありがとうございます。補足含め大変助かります。あとで試させていただきます。

関連するQ&A