@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Excelでの棒グラフに関する悩み。

1
投稿者投稿内容
Mahathir
会議室デビュー日: 2003/10/14
投稿数: 4
投稿日時: 2003-10-14 13:27
  現在、Visual Studio C#.NETで外部から入力したデータをEXCELに転送、そのデータを棒グラフで表示するプログラムを製作中ですが、そこいくつトラブルがあって、皆さんの指導お願いしたいです。

 1)現在棒グラフまで描けますが、
    c0.ChartType= Excel.XlChartType.xlColumnClustered;
  そこで棒グラフの(x軸)項目ラベルをあるセル範囲からゲットし、それグラフで表示する方法教えて欲しいです。普段棒グラフの場合x軸項目は「1,2,3」で表示されますが、私の場合たとえば「”A1”、”A5”」の内容に表示できるにようにしたいです。
 2)棒グラフ上にxy軸以外例えばグラフ上x=10、x=50、x=100という(色指定できる)垂直線を書きたい場合どうすれば良いでしょうか。
 私はまだまだ初心者ですどうか指導お願いします。宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-14 15:12
こんにちは。

 エクセルの操作は、とりあえずマクロ記録で操作をマクロ化し、後から『汎用的に』するのが簡単でわかりやすい方法です。

 垂直線というのは、めもり線のことでしょうか。これはXの値によって色を変えることはできませんが、いくつごとに線を描くか、どんな色にするかは指定できます。
Mahathir
会議室デビュー日: 2003/10/14
投稿数: 4
投稿日時: 2003-10-15 08:39
Jittaさんありがとうございました。エクセルの簡単なデータ操作例えば、WorkbookのSheetにデータ転送してそのデータ棒グラフ表示するというところまでわかりましたが、ただですねVisual Studio C#.NETの場合に棒グラフのラベル表示や目盛り線などの指定し方ほとんどヘルプなどにありませんので、かなり困っています。Sheetにあるデータ棒グラフにする方法けっこうインターネットなどありましたけど、グラフ上の垂直線(指定したX座標で垂直方向グラフの上までの線)や棒グラフのx軸ラベル特定項目に指定する方法ほとんどないですね。宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-15 08:50
いや、だから、『エクセル上でマクロ記録しながら操作を行い、できたマクロを汎用的に変更する』んですって。

 A列に、1〜20の数字を入れ、これを棒グラフにします。次に、目盛り線を10個置き、ピンク色にします。この操作をマクロ記録すると、次のようになります。
Charts.Add
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:A21"), PlotBy _
:=xlColumns
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
With ActiveChart.Axes(xlCategory)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
With ActiveChart.Axes(xlValue)
.HasMajorGridlines = True
.HasMinorGridlines = False
End With
ActiveChart.Axes(xlValue).Select
With ActiveChart.Axes(xlValue)
.MinimumScaleIsAuto = True
.MaximumScale = 50
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
.Crosses = xlAutomatic
.ReversePlotOrder = False
.ScaleType = xlLinear
.DisplayUnit = xlNone
End With
ActiveChart.Axes(xlCategory).MajorGridlines.Select
With Selection.Border
.ColorIndex = 38
.Weight = xlHairline
.LineStyle = xlContinuous
End With
With ActiveChart.Axes(xlCategory)
.CrossesAt = 1
.TickLabelSpacing = 10
.TickMarkSpacing = 10
.AxisBetweenCategories = True
.ReversePlotOrder = False
End With

下の方2つのWithブロックが、お望みの操作に関するものと思われます。問題はActiveChartですが、グラフを描くところまでできているのであれば、ActiveChartはとれていますよね?オブジェクトの型をきちんと指定した変数に受けていれば、インテリセンスが使えますから、ほぼこの通りにかけると思います。
#私は今のところVB.NET使いなので、、、
Mahathir
会議室デビュー日: 2003/10/14
投稿数: 4
投稿日時: 2003-10-15 18:28
Jittaさんありがとうございました。エクセル上でマクロ記録しながら操作を行い、できたマクロを汎用的に変更する」についてもうちょっとわかりやすく説明してくださいませんか(まだ初心者です)。ただですねC#の場合は関数書き方や使い方全然違うですよ。例えば、今作っている棒グラフまで出せるプログラムは次のようになる。

Excel._Workbook book;
Excel._Worksheet sheet;
Excel._Chart c0;
Excel.Axis x,y,x1,y1;

sheet.get_Range("K1","K8").Select();
sheet.Name="sheet1";
book.Charts.Add(Missing.Value,Missing.Value,Missing.Value,Missing.Value);


c0=book.ActiveChart;
c0.ChartType= Excel.XlChartType.xlColumnClustered;
c0.HasTitle=true;
c0.ChartTitle.Text="品番:"+textBox4.Text+" 条件"+textBox5.Text;
x=(Excel.Axis)c0.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary);
x.HasTitle=true;
x.AxisTitle.Text="中心";
x.HasMajorGridlines=true;
x.HasMinorGridlines=false;
x.TickLabelSpacing=1;
x.TickMarkSpacing=1;

y=(Excel.Axis)c0.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary);
y.HasTitle=true;
y.AxisTitle.Text="頻度";
y.HasMajorGridlines=true;
y.HasMinorGridlines=false;

y1=(Excel.Axis)c0.Axes(Excel.XlAxisType.xlValue,Excel.XlAxisGroup.xlPrimary);
y1.Border.ColorIndex=38;
y1.Border.LineStyle=Excel.XlLineStyle.xlDashDot;

x1=(Excel.Axis)c0.Axes(Excel.XlAxisType.xlCategory,Excel.XlAxisGroup.xlPrimary);
x1.CrossesAt=5;
c0.SetSourceData(sheet.get_Range("K1","K8"),Missing.Value);
c0.Location(Excel.XlChartLocation.xlLocationAsObject,sheet.Name);

例えば上のxよyだけ棒グラフ表示できまして、今度新たなx1とy1として定義したら結局別々軸として表示でなく上書きされるんですよ。全部軸を同じ変数でやって同じ結果でした。私C#自体まだ初心者ですが、ヘルプはほとんどがBASICですね。かなり困ってます。ある部分がBASICあまり代わりがないですが。しかし、例えばHasMajorGridlines = Trueとか同じ扱いでできますが、ActiveChart.Axes(xlCategory).MajorGridlines.SelectとかLineStyle = xlContinuous とかはですね違うんですよ。Axes関数自体の使い方違うし、しかもヘルプBasicの場合Axesしかないですよね。色々と未熟ですみませんが、宜しくお願いします。







Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-15 22:55
 困りましたね。私は今のことろVB.NET使いで、それ以前はBorland系C++使いで、そのさらに前はUnix系C使いなのですよ。C#は趣味にかじった程度なんですねぇ。。。

 まず、「エクセルのマクロ記録」ですが、「ツール→マクロ→新しいマクロの記録」メニューで、マクロの記録を開始します。適当に操作を行った後、同じところが「記録終了」に変わっているので、これを選びます。または、記録を開始したときに現れるツールボタンの「■」をクリックします。これで、今行った操作がマクロとして記録されました。
 次にマクロの見方です。「ツール→マクロ→Visual Basic Editor」メニューを選択します。VBエディタが開きます。「プロジェクト」ペインにある、「標準モジュール」ツリーノードを開きます。「Module1」をダブルクリックします。これで、今記録したマクロが表示されます。ただし、Module1がすでにあった場合はModule2など、細かい違いはあります。

 さて、「汎用的にする」ですが、ここに記録されているマクロは「選択していること」を前提としています。「ActiveChart」とかがないのは、それが「現在選択されている(アクティブな)オブジェクト」を指しているためで、「選択」するという操作をしていなければ使えません。{ActiveChartですが、グラフを描くところまでできているのであれば、ActiveChartはとれていますよね?}というのは、book.Charts.Addメソッドの戻り値として、追加したグラフが返ってきていないですか?または、book.Chartsから探せますよね。こうやって取り出したオブジェクト、つまり「すでに取り出しが終わっている」という意味だったのです。「汎用的にする」のはこの部分です。ActiveChartやActiveSheetは、すでに選択しているからとれるもので、選択もマクロ(プログラム)で行うようにする必要があります。選択はSelectメソッドできます。しかし、Active〜は使えないので、変数に参照させて使います。

 Active〜は、これでいいですよね。私は、エクセルマクロ上で一度動作させてから、VB.NETの上に持ってきて手直ししました。エクセルのオブジェクトはエクセルのヘルプで引く方がよいと思ったからです。

 あと、定数などはExcelネームスペースから指定すれば見つかると思います。VS.NET2003をお使いでしたら、勝手に探して候補を出してくれると思うのですが…?
1

スキルアップ/キャリアアップ(JOB@IT)