エクセル2003の散布図グラフで複数の系列を表示しています。ところが
データの量(行数)がすぐに変わりますので元データの範囲を可変したいのですが
うまくいきません。
また、グラフ作成後、下記コードにてラベルの一括貼付けをしております。
下記に具体的なデータを記載しますので、どうかお知恵をお貸し下さい。
よろしくお願い致します。

■現在
元データのプロパティ より
Xの値:=Sheet1!$E$3:$E$324
Yの値:=Sheet1!$F$3:$F$324
 ※本当はここで"Sheet1!$E$3:$E$65536"とSheet1!$F$3:$F$65536にすれば
   データは取得できますが、下記マクロを実行すると当然オーバーフローします
   要はここで存在するデータ範囲に都度変わっていくような事ができれば
   それでも解決するかも?

□使用しているマクロ
Sub 全系列の一括ラベル表示()
Dim Counter As Integer, ChartName As String, xVals As String
Application.ScreenUpdating = False
For i = 1 To ActiveChart.SeriesCollection.Count
'Store the formula for the first series in "xVals".
xVals = ActiveChart.SeriesCollection(i).Formula

'''''' 'ここでxvalsにデータ元が入ったままなのでそれを存在するデータ範囲に変わるようにしたいーーーー

xVals = Mid(xVals, InStr(InStr(xVals, ","), xVals, Mid(Left(xVals, InStr(xVals, "!") - 1), 9)))
xVals = Left(xVals, InStr(InStr(xVals, "!"), xVals, ",") - 1)
Do While Left(xVals, 1) = ","
xVals = Mid(xVals, 2)
Loop
For Counter = 1 To Range(xVals).Cells.Count
If Range(xVals).Cells(Counter, 1).Offset(0, -1).Value = "" Then
With ActiveChart.SeriesCollection(i).Points(Counter)
.HasDataLabel = True
.DataLabel.Text = ""
End With
Else
With ActiveChart.SeriesCollection(i).Points(Counter)
.HasDataLabel = True
.DataLabel.Text = Range(xVals).Cells(Counter, 1).Offset(0, -1).Value
End With
End If
Next Counter
Next i
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>Set grng = Range("E3", Cells(Rows.Count, "F").End(xlUp)) '当然Rangeが取得できない?


シート名が省略されていますからActivesheetが操作対象になります。
シート名で修飾しなければなりません。

各SeriesCollectionのFormulaからシート名を抜き取ります。
Xの値の開始セルは$E$3
Yの値の開始セルは$F$3
で共通ということでよかったですか。

Sub test1()
  Dim ws As String
  Dim r As Long
  Dim i As Long
  With ActiveSheet.ChartObjects(1).Chart
    For i = 1 To .SeriesCollection.Count
      With .SeriesCollection(i)
        ws = Split(Split(.Formula, ",")(1), "!")(0)
        r = Worksheets(ws).Cells(Rows.Count, "F").End(xlUp).Row
        .XValues = Worksheets(ws).Range("E3", "E" & r)
        .Values = Worksheets(ws).Range("F3", "F" & r)
      End With
    Next i
  End With
End Sub
    • good
    • 0
この回答へのお礼

解決!!!
上記のマクロを使わせて頂き無事、解決に至りました^^
丁寧な迅速なご対応、感謝します!ありがとうございましたm _ _ m

>Xの値の開始セルは$E$3
>Yの値の開始セルは$F$3
>で共通ということでよかったですか。
はい、その通りでした後手に回った設定、お許し下さい。

後記
なぜかステップではうまくいきますが普通に走らせると、10回に一回ぐらいは最終行取得の所で止まってしまいます。うーーんメモリ?の問題なのかなぁ

お礼日時:2009/05/27 08:34

≪可変データ範囲の件≫


データの最終行を取得すればよいだけではないでしょうか。

Dim grng As Range
Set grng = Range("E3", Cells(Rows.Count, "F").End(xlUp))
ActiveSheet.ChartObjects(1).Chart.SetSourceData Source:=grng

あるいは

Dim r As Long
r = Cells(Rows.Count, "F").End(xlUp).Row
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
  .XValues = Range("E3", "E" & r)
  .Values = Range("F3", "F" & r)
End With

一般機能でも可能です。
Excel で定義名を使用してグラフ範囲を自動的に更新する方法
http://support.microsoft.com/kb/183446/ja

この回答への補足

素早いご対応、ありがとうございました。
非常に有益な情報で、心から感謝しております。
さて、本題ですが、ご回答頂いたマクロを私のマクロに組み込んだのですが、エラーが出てしまいました。
理由ははっきりしており私の前提条件の提示がしっかりとされていなかったからです。本当にもうしわけございません。
下記に再度、詳細な条件を記載させて頂きます。

■現在
元データのプロパティ より
○シート1(系列1)
Xの値:=Sheet1!$E$3:$E$324
Yの値:=Sheet1!$F$3:$F$324
○シート2(系列2)
Xの値:=Sheet2!$E$3:$E$654
Yの値:=Sheet2!$F$3:$F$654
・・・・
 ※以下このように系列ごとにシートを分けており、合計5シートの元データがあります。
 ※また全ての行の途中に空白はありません。

■マクロ
Sub 全系列のラベル表示() '全系列のラベル表示

Dim Counter As Integer, ChartName As String, xVals As String

Application.ScreenUpdating = False

For i = 1 To ActiveChart.SeriesCollection.Count '系列の数だけループさせる

xVals = ActiveChart.SeriesCollection(i).Formula

' 頂いたコードをそのまま貼り付けてみました。
' Dim grng As Range
' Set grng = Range("E3", Cells(Rows.Count, "F").End(xlUp)) '当然Rangeが取得できない?
' ActiveSheet.ChartObjects(1).Chart.SetSourceData Source:=grng

xVals = Mid(xVals, InStr(InStr(xVals, ","), xVals, Mid(Left(xVals, InStr(xVals, "!") - 1), 9)))
xVals = Left(xVals, InStr(InStr(xVals, "!"), xVals, ",") - 1)
Do While Left(xVals, 1) = ","
xVals = Mid(xVals, 2)
Loop

For Counter = 1 To Range(xVals).Cells.Count
If Range(xVals).Cells(Counter, 1).Offset(0, -1).Value = "" Then
With ActiveChart.SeriesCollection(i).Points(Counter)
.HasDataLabel = True
.DataLabel.Text = ""
End With
Else
With ActiveChart.SeriesCollection(i).Points(Counter)
.HasDataLabel = True
.DataLabel.Text = Range(xVals).Cells(Counter, 1).Offset(0, -4).Value
End With
End If
Next Counter
Next i
MsgBox "完了"
End Sub

■後記
エラーの理由はおそらくRangeのシートを参照できなかっただけだと思うのですが、既に90%は解決しております。今からもう少し私自身も勉強しますが、どうかもう一声頂ければ、幸いです。
あつかましいご依頼、お許し下さい。

補足日時:2009/05/26 09:12
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qデータの追加を反映させた散布図の作り方

WindowsVistaです。
excelで散布図を作成しました。散布図用のデータが毎日1行づつ追加されます。
このとき、前日までのデータによる散布図に、新しいデータを反映した散布図を
表示させる方法を教えてください。
今のところは、前日までの散布図を一度削除して、新しいデータを反映した散布図を
表示させています。

Aベストアンサー

>新しいデータを反映した散布図を表示させる方法を教えてください。
散布図の指定範囲を1行多くし、当日のデータを入力する前に前日行の下へ1行追加します。
追加された行にデータを入力すると直ちに散布図へ反映されます。
散布図の対象範囲は常に1行以上の余裕を持たせる状態にすれば散布図の範囲を修正する必要がなくなります。

Q=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $

いつもお世話になってます。
以下の関数式について、お時間がありましたらどうぞご教示ください。

=IF(ISNA(VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)),"",VLOOKUP($A1,sheet2!$A$1:$B $12,2,FALSE))

「シート2の範囲指定した表にA1セルの値と同じ値の右隣になる値を返せ。ただし該当なき場合は空白とせよ。」

純粋になんでこのような構文になるのかが解りません。

1.ISNAってそもそもなんでしょう?
2.同じ式を繰り返すのはなぜ?
(模範式で、このように同じ式を繰り返す構文があまり無いように思えたのです。)

・参考となる他所のページがあれば教えて下さい。
・素人です。お手柔らかにお願いします。

(エクセル2003)

Aベストアンサー

1.ISNAってそもそもなんでしょう?
ISで始まる情報関数の一つで、#N/A!エラーのみを判定する関数
結果はTRUE(真),FALSE(偽)のいずれかになります。
エラー判定のIS関数には他に
ISERR:#N/A!を除くすべてのエラーを判定する関数
ISERROR:すべてのエラーを判定する関数
があります。

2.同じ式を繰り返すのはなぜ?
ISNAの判定する値がセルでなく数式の結果だからです。
A2=VLOOKUP($A1,sheet2!$A$1:$B$12,2,FALSE)
なら
A3=IF(ISNA(A2),"",A2)
ということになります。A2のように計算の為のセルを省略する為に
=IF(ISNA(数式),"",数式)のように同じ数式を2回繰り返しになってます。

Q散布図と折線の複合グラフが、散布図で折線が隠れてしまいます

エクセルで散布図と折線グラフの複合グラフを作ると、
散布図の線と折線の線が交差する時、散布図の線が上になり折線の線が隠れてしまいます
凡例も折線の系列が上で散布図の系列が下になっていて、系列の順序を入れ替え出来ません
エクセルの中でグラフの優先順位があるのでしょうか?

これを逆の折線の線が散布図の線を隠すように出来ないでしょうか?

Aベストアンサー

散布図と折れ線の場合は散布図が必ず上になるようで、第2軸にしても変わらないようです。
すべての系列を散布図だけで作成するか、または折れ線だけで作成することはできませんか

QSUMPRODUCT($A$1:$A$10,$B$1:$B$10)とSUMPRODUCT($A$1:$A$10*$B$1:$B$10)

エクセルのSUMPRODUCT関数についてお尋ねします。

=SUMPRODUCT($A$1:$A$10,$B$1:$B$10)

=SUMPRODUCT($A$1:$A$10*$B$1:$B$10)
の違いは何でしょうか?
両者とも同じ答えを返しますが、いろいろ試したところ、前者は範囲内に文字列があってもそれを無視して計算し、後者は文字列があればエラーになるようですが、その理解で正しいでしょうか?
正しいとすれば、なぜでしょうか?

Aベストアンサー

こんばんは。

配列計算をしているのは言うまでもありませんが、この、SUMPRODUCT は、必ず、内部のひとまとまりから計算するという性質を持っています。ただ、VBAのように左から時系列かどうかは、言語が違いますから、分かりません。しかし、この引数は、パラメータ配列になっています。そして、その引数それぞれの有効値を調べて、それを演算出来る値かどうか調べます。

文字列を入れてもエラーにならないのは、元々、そこに注釈などを入れるために考えられたものです。値を文字列か数値かを精査して演算するように出来ています。最初、SUM関数に対し、そのように作られました。プログラムとしては、初歩的なものですが、そのアイデアは、今日まで、踏襲しているようです。このオリジナルの仕組みを考えたのは、VisiCalc の開発者、ブルックリン氏です。昔々、本で読んだことがあります。 PRODUCT関数とも共通です。3つの関数は、同じような仕様を持っています。

こちらが、本来の使い方です。

=SUMPRODUCT($A$1:$A$10,$B$1:$B$10)

つまり、
$A$1:$A$10 と $B$1:$B$10 の値を別々に取得しています。

では、
=SUMPRODUCT($A$1:$A$10,$B$1:$B$11)

とすると、なぜ、エラーが出るかというと、$B$11 に対応する数値が、NULL値(有効な値がない)だからです。それは、全体に反映させてしまいます。(理由は分かると思いますが、プログラムが途中で、エラーで止まってしまうからです)

ところが、こちらは、

=SUMPRODUCT($A$1:$A$10*$B$1:$B$10)

$A$1:$A$10*$B$1:$B$10 は、分割出来ません。したがって、この数式の中でのエラーは、そのまま、元の数式に反映されます。

ご自分で、ユーザー定義関数を作ってみれば分かります。VBAでも、同じように作ることが可能です。一度、試してみるとよいです。

こんばんは。

配列計算をしているのは言うまでもありませんが、この、SUMPRODUCT は、必ず、内部のひとまとまりから計算するという性質を持っています。ただ、VBAのように左から時系列かどうかは、言語が違いますから、分かりません。しかし、この引数は、パラメータ配列になっています。そして、その引数それぞれの有効値を調べて、それを演算出来る値かどうか調べます。

文字列を入れてもエラーにならないのは、元々、そこに注釈などを入れるために考えられたものです。値を文字列か数値かを精査して演算...続きを読む

Q散布図に有意差ありを示す情報を入れたいのですが・・

実験開始時のデータと実験終了時のデータを比べるグラフを散布図でつくりました(色々検討した結果、散布図が一番見やすくなりました)。
この散布図の中のプロット点に有意差ありという情報(アスタリスクなど)を入れたいのですが、プロット点が多く、どの点が有意差ありなのかよくわからなくなってしまいます。
何か良い方法はないでしょうか?
そもそも散布図に有意差ありの情報を入れることはあるのでしょうか?

回答よろしくお願いします。

Aベストアンサー

そもそもどんなデータをプロットしているのかわからないが,
そういう時は,ふつうにはマーカの形を変えるか,マーカの色を変えることにするのでしょう。

Qエクセル詳しい方!!お願いします! =IF(会計簿!$C$6=”13-ア”,”会計簿!$A$6”,I

エクセル詳しい方!!お願いします!

=IF(会計簿!$C$6=”13-ア”,”会計簿!$A$6”,IF(会計簿!$C$6=”13-イ”,”会計簿!$A$6”,IF(会計簿!$C$6=”13-ウ”,”会計簿!$A$6”,IF(会計簿!$C$6=”13-エ”,”会計簿!$A$6,””))))
の返しが会計簿!$A$6になるのを会計簿!$A$6に入力されている値にしたい!

Aベストアンサー

あらら・・・、今度は絶対参照にしていませんでした ><
=IF(OR(会計簿!$C$6="13-"&{"ア","イ","ウ","エ"}),会計簿!$A$6,"")

これが正解ですね _ノフ○)))グタリ

Q散布図の削除

表示した散布図を切り取りではなく削除するコードはないのでしょうか。
あればコード例をご教示お願いします。
手動では削除は見つかりません。
但し、条件はコードの最初の処理で行うことで、誰かが
残した散布図を削除することです。

エクセルのブックを開く
シート2に掲載されている散布図を削除する。

簡単なようですが意外とわかりません。お願いします。

Aベストアンサー

下記のようなマクロで、アクティブシート上にある散布図のグラフ名が取得できます。
Msgboxのところを、グラフ削除のコードに変えれば、散布図削除マクロになります。
ただし散布図の種類は、xlXYScatter以外にもあります。
必要なら、それらにも対応するように工夫しなければなりません。

Sub test1()
  Dim myCht As ChartObject

  For Each myCht In ActiveSheet.ChartObjects
    If myCht.Chart.ChartType = xlXYScatter Then
      MsgBox myCht.Name
    End If
  Next
End Sub

Q"$B$32:$H$32,$K$32:$N$32,$P$32:$AH$32" を変数に置き換えたい

こんにちは。よろしくお願いします。いつもgooの皆さんには大変お世話になっています。
エクセルは2013です。どなたか教えてください。

質問内容
Wクリックの範囲指定が現状はこのようになっています
If Not Intersect(Target, Range("$B$32:$H$32,$K$32:$N$32,$P$32:$AH$32")) Is Nothing Then

行を指定する32を
Dim shg as long
shg=32
とした場合、上記の範囲指定を & と変数 shg でつなげていくと、あまりにも長くなってしまいます
もっとスマートな書き方はないでしょうか

Aベストアンサー

If Not Intersect(Target, Rows(shg), Range("$B:$H, $K:$N, $P:$AH")) Is Nothing Then

Q複数系列の散布図の描き方について

アメリカの全州において、年間平均気温と年間平均所得が、飲料水の購入にどう影響を与えるかという課題で、散布図と近似曲線を使って説明しなければならないのですが、複数系列の散布図はそもそも、どのようにして描けばいいのでしょうか?
ちなみに、年間平均所得と飲料水の購入の散布図はできたのですが。
このような課題をすること自体、初めてですので、初心者でもわかりやすくグラフが描けるように、教えていただけませんか?
元となるデータは、
   Income/Capita   Mean Temp. Cans/Capital/Yr
Alabama     11.7    66   200
Arizona     15.3  62 150
Arkansas     9.9 63 237
California     22.5 56 135
Colorado  17.1 52 121
こんな感じで、47州つづきます。
よろしくお願いします。

アメリカの全州において、年間平均気温と年間平均所得が、飲料水の購入にどう影響を与えるかという課題で、散布図と近似曲線を使って説明しなければならないのですが、複数系列の散布図はそもそも、どのようにして描けばいいのでしょうか?
ちなみに、年間平均所得と飲料水の購入の散布図はできたのですが。
このような課題をすること自体、初めてですので、初心者でもわかりやすくグラフが描けるように、教えていただけませんか?
元となるデータは、
   Income/Capita   Mean Temp. Cans/Capital/Yr
...続きを読む

Aベストアンサー

3D散布図 や 3次元散布図 になるのでは?

ここから探して見ましょう。
http://search.vector.co.jp/search?query=%8EU%95z%90%7D

Q=IF(Sheet1!MX9="", "",Sheet1!MX9) で表した結果に条件付き書式を

こんにちは、エクセル2010を使っています。

A1セル
=IF(Sheet1!MX9="", "",Sheet1!MX9) B1セル =IF(Sheet1!MY9="", "",Sheet1!MY9)
と数式が入っていて、結果が 29% 36% などとなって居ます。

このセルに、【30%以上の場合は】と条件を与えても動作するどころか空白まで全てに条件が適用されてしまいます。

これを通常通り条件付き書式を与えるにはどうしたら良いでしょうか。

詳しい方、よろしくお願いいたします。

Aベストアンサー

少し面倒ですが、現状のA1、B1の計算式を変えない方法として
条件付き書式をいじってみては?

A1を選択して 条件付き書式 → 新しいルール → 数式を使用して、書式設定するセルを決定 を選択
下部に表示されたテキストボックスに、
=VALUE(A1)>=0.3 (0.3は30%の意)
と入力、設定したい書式を選択して設定する

あとは、A1のセルをコピー、B1に書式のみ貼り付けでOK


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報