C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: エクセルで系列を指定してグラフを描く


(過去ログ 85 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■50697 / inTopicNo.1)  エクセルで系列を指定してグラフを描く
  
□投稿者/ お助け下さい (1回)-(2010/06/15(Tue) 13:42:06)

分類:[VB6 以前] 

Excell2000(VB6.0)にて、以下のようなマクロを組みたいと思っています。
以下に示す【問題】の解決策をご教示頂きたく、よろしくお願い致します。

【目的】
以下のようなWorksheetにおいて、チェックボックスを用いて、チェックした系列のみをグラフにしたい。

時間	物理量A	物理量B	・・・	物理量BJ
1	10	20	・・・	5
2	11	25	・・・	16
・	YY	YY	・・・	YY	
・	YY	YY	・・・	YY
X	YY	YY	・・・	YY

※Xは記録時間による(一定ではない)。
 YYは任意の数字。
 ・は省略を示す。系列は全部で60個。

【現状】
以下に示すプログラムを組んでいます。
グラフに示したいデータのチェックボックスにチェックした後、コマンドボタンを押すとグラフが作成されるようにしています。

本プログラムにて、チェック数が28個までは意図したとおりにグラフが描けるのですが、29個以上にチェックを入れると
『実行時エラー'1004' Rangeメソッドは失敗しました。'Worksheet'オブジェクト』と出ます。
どうも"Range"の文字数の制限に引っかかっているように思うのですが、解決策が判りません。(そもそも"文字数"が何を示すのか解りません。)

【備考】
恥ずかしながら、当方、プログラム作成は今回が始めてのド素人です。
以下のプログラムもインターネットの実例やQ&Aを調べながら、丸1日かけて何とか書きました。
修正すべき箇所が沢山あるのかも知れませんが、まずは上記問題の解決策をご教示頂きたく、よろしくお願い致します。

【プログラム】
------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
    Dim GraphRange As String
    Dim Chart1 As Chart
    Dim Sheet1 As Worksheet
    Dim lastRow As Long

Set Chart1 = Application.Charts("Graph1")
Set Sheet1 = Worksheets("data")


Chart1.Activate

ChartObjects.Delete
Set Chart1 = Application.Charts("Graph1")

Sheet1.Activate

lastRow = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
GraphRange = "B3:B" & lastRow


If CheckBox1.Value = True Then
Sheet1.Activate
GraphRange = GraphRange & ",C3:C" & lastRow
End If
・
・
・
If CheckBox60.Value = True Then
Sheet1.Activate
GraphRange = GraphRange & ",BJ3:BJ" & lastRow 
End If

Chart1.ChartWizard Source:=Sheet1.Range(GraphRange), Gallery:=xlXYScatter, Format:=6, PlotBy:=xlColumns, CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True, 

CategoryTitle:="時間", ValueTitle:="deg C, lb/min, psig"


End Sub
------------------------------------------------------------

引用返信 編集キー/
■50698 / inTopicNo.2)  Re[1]: エクセルで系列を指定してグラフを描く
□投稿者/ お助け下さい (2回)-(2010/06/15(Tue) 14:00:40)
すいません。"お助け下さい"です。
【現状】が少し変わりました。

記事投稿後に、別データ(行数が5000行とこれまで試していたデータよりも多い)でプログラムを走らせたところ、
チェック数が28以下でも同じエラーが出てしまいました。


引用返信 編集キー/
■50699 / inTopicNo.3)  Re[2]: エクセルで系列を指定してグラフを描く
□投稿者/ ごう (116回)-(2010/06/15(Tue) 14:20:32)
No50698 (お助け下さい さん) に返信
> すいません。"お助け下さい"です。
> 【現状】が少し変わりました。
>
> 記事投稿後に、別データ(行数が5000行とこれまで試していたデータよりも多い)でプログラムを走らせたところ、
> チェック数が28以下でも同じエラーが出てしまいました。
>
>

ざっとみた感じですけど、
「Range」って選択範囲のことじゃないですか。
選択範囲って、左上から右下を選択するんですよ。
例えば、B3:B65536だったら、B列3行目〜65536行目のことを指します。
複数列が存在する場合の範囲の設定の仕方は、
例えば、B3行目からC10行目まで選択したいとしたら、「B3:C10」と書きます。

今のこのプログラムですと、
例えば、CheckBox1にチェックが入っている場合
GraphRangeが"B3:B6,C3:C6"となってしまいます。


VBAのデバッガの使い方を覚えれば、自分で変数に入っている値がおかしいかどうかチェックできます。
以下のページを参考にして、「Chart1.ChartWizard Source:=〜」のくだりにブレークポイントを設定し、
GraphRangeに入っている値を確認しましょう。

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html

以上、がんばってください
引用返信 編集キー/
■50700 / inTopicNo.4)  Re[3]: エクセルで系列を指定してグラフを描く
□投稿者/ ごう (117回)-(2010/06/15(Tue) 14:22:31)
2010/06/15(Tue) 14:23:27 編集(投稿者)

No50699 (ごう さん) に返信

> VBAのデバッガの使い方

ブレークポイントについては、こちらの説明の方が易しいかな。

http://www.vba-world.com/breakpoint.html


Rangeの説明についてはこれも参考に
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_10.html
引用返信 編集キー/
■50702 / inTopicNo.5)  Re[4]: エクセルで系列を指定してグラフを描く
□投稿者/ お助け下さい (3回)-(2010/06/15(Tue) 16:48:55)
No50700 (ごう さん) に返信
"お助け下さい"です。
アドバイス頂き、ありがとうございます。

アドバイス頂いたとおり、デバッガとやらを使用して『GraphRange』に何が入っているかを確認してみました。
中身は、『B3:B1000,C3C1000,・・・AC3,AC1000・・・』と言った感じになっていました。
(B列+チェックボックスでチェックした列が入っている。)

綺麗な形かどうかは兎も角、『チェックした系列をグラフにする』目的のとおりには出来ているようです。
が、自分が調べたところ、Range()の()内の文字数に制限(255文字まで)があるようで、沢山チェックを
して系列を増やすと文字数が増えてしまい、これに引っかかってしまうようです。

データ数が多い場合にチェック数が28個以下でエラーが出たのも、行数が2桁から4桁に増えたために、
文字数が増えて制限にひっかかったためと思われます。

頂いたアドバイスのおかげでエラーの原因は、ほぼ特定出来たと思います。ありがとうございます。
もし、上記のような状態を上手く回避できる対策があれば、ご教示頂きたく、お願い致します。
引用返信 編集キー/
■50703 / inTopicNo.6)  Re[5]: エクセルで系列を指定してグラフを描く
□投稿者/ ごう (118回)-(2010/06/15(Tue) 17:28:36)
2010/06/15(Tue) 17:33:40 編集(投稿者)
2010/06/15(Tue) 17:33:24 編集(投稿者)

No50702 (お助け下さい さん) に返信

> が、自分が調べたところ、Range()の()内の文字数に制限(255文字まで)があるようで、沢山チェックを
> して系列を増やすと文字数が増えてしまい、これに引っかかってしまうようです。

> もし、上記のような状態を上手く回避できる対策があれば、ご教示頂きたく、お願い致します。

よく似た質問があったので。
http://questionbox.jp.msn.com/qa4220825.html

私は使ったことありませんが、これ読んだ感じだとUNIONを使うやり方があるみたいですね。
UNION使っみては?

UNIONの参考に
http://www.geocities.jp/vbaxl/object/003.html

Union(Range("B3:B1000"), Range("C3:C1000"),・・・Range("AC3,AC1000")) って感じかな、たぶん
引用返信 編集キー/
■50716 / inTopicNo.7)  Re[5]: エクセルで系列を指定してグラフを描く
□投稿者/ ごう (119回)-(2010/06/16(Wed) 09:52:10)
No50702 (お助け下さい さん) に返信

ためしに作ってみた。
Unionの使い方(Unionも最大30個までしか引数を入れられないんだね)について
当方も勉強になりました。

    Dim GraphRange As String
    Dim Chart1 As Chart
    Dim Sheet1 As Worksheet
    Dim lastRow As Long

    Set Chart1 = Application.Charts("Graph1")
    Set Sheet1 = Worksheets("Sheet1")

    Chart1.ChartObjects.Delete
    Sheet1.Activate
    
    lastRow = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
   
    ' 列数+1個分の配列を用意しておく
    Dim Ranges(61) As Range
    ' 有効なCheckBoxの数を数えるカウンター
    Dim iCheckBoxCounter As Integer
    iCheckBoxCounter = 0
    
    Set Ranges(iCheckBoxCounter) = Range("B3:B" & lastRow)
    iCheckBoxCounter = iCheckBoxCounter + 1
    
    If CheckBox1.Value = True Then
        Set Ranges(iCheckBoxCounter) = Range("C3:C" & lastRow)
        iCheckBoxCounter = iCheckBoxCounter + 1
    End If

    If CheckBox2.Value = True Then
        Set Ranges(iCheckBoxCounter) = Range("D3:D" & lastRow)
        iCheckBoxCounter = iCheckBoxCounter + 1
    End If

    If CheckBox3.Value = True Then
        Set Ranges(iCheckBoxCounter) = Range("E3:E" & lastRow)
        iCheckBoxCounter = iCheckBoxCounter + 1
    End If
    
    
    ' Rangeを結合
    Dim AllRange As Range
    Dim i As Integer
        
    ' For分を使って結合させれば短く書ける
    Set AllRange = Ranges(0)
    For i = 1 To iCheckBoxCounter - 1
        Set AllRange = Union(AllRange, Ranges(i))
    Next

    Chart1.ChartWizard Source:=AllRange, Gallery:=xlXYScatter, Format:=6, PlotBy:=xlColumns, CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True, CategoryTitle:="時間", ValueTitle:="deg C, lb/min, psig"
    Chart1.Activate

引用返信 編集キー/
■50717 / inTopicNo.8)  Re[6]: エクセルで系列を指定してグラフを描く
□投稿者/ お助け下さい (4回)-(2010/06/16(Wed) 10:03:07)
No50716 (ごう さん) に返信
ご親切に、プログラム例まで頂きまして、本当にありがとうございます。

当方、本当にド素人なため、プログラムを一回読んでも、直ぐに理解できないと言う悲しい状況なのですが、
頂いたプログラム例とにらめっこしつつ、理解したいと思います。

取り急ぎ、お礼を言いたくてレスさせて頂きました。
引用返信 編集キー/
■50718 / inTopicNo.9)  Re[7]: エクセルで系列を指定してグラフを描く
□投稿者/ ごう (120回)-(2010/06/16(Wed) 10:07:50)
2010/06/16(Wed) 10:10:32 編集(投稿者)

No50717 (お助け下さい さん) に返信

これを機会に、ぜひ、デバッガの使い方に慣れていって下さいね。
プログラムを組むときの強い味方ですよ。

それでは、健闘を祈ります


P.S.
あー 「わからない」部分ってもしかして
配列とかFor文とか使ったからかな。

VBAの本とかWebに大体載ってますよ。
プログラムを組むとき、よく使う基礎の基礎の部分だから、
この際使い方を覚えましょう(^^

引用返信 編集キー/
■50736 / inTopicNo.10)  Re[8]: エクセルで系列を指定してグラフを描く
□投稿者/ お助け下さい (6回)-(2010/06/16(Wed) 17:31:25)
No50718 (ごう さん) に返信
いろいろとご親切にアドバイス頂き、ありがとうございました。
お蔭様で、何とか自分の意図したようなプログラムを組むことが出来ました。

今回は時間に追われていたため、基本を勉強しないままプログラム作成に入ってしまいましたが、
やはり基本は大事だなー。と痛感しました。
今後は無理矢理時間を割いてでも、キッチリ基礎から勉強したいと思います。

本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -