- ベストアンサー
エクセルでグラフを細かくしたい
エクセルで,以下のような10秒おきのグラフのときに,間の値を自動的に読み取って5秒おき,2秒おきのグラフに変換することはできますか? X, Y 0, 0 10,10 20,20 30,30 ↓ X, Y 0, 0 5, 5 10,10 15,15 20,20 25,25 30,30 拙い説明ですが,よろしくお願いします.
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
役に立っているのかどうか分かりませんが 再分化数を指定できるようにしてみました。 変数np値で指定します。 Sub goo散布図細分化5() Dim chtobj As ChartObject Dim csc As Object Dim xval As Variant, yval As Variant Dim nxval As String, nyval As String Dim xrng As Range, yrng As Range Dim nv As Long Dim np As Long Dim i As Long Dim j As Long np = 5 '細分化数を指定する Set chtobj = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count) Set csc = chtobj.Chart.SeriesCollection(1) '//元のデータセル範囲をセット With csc .XValues = Range("A1:A10") .Values = Range("B1:B10") End With xval = csc.XValues yval = csc.Values nv = UBound(xval) For i = 1 To nv For j = 1 To np If i = 1 And j = 1 Then nxval = xval(i) nyval = yval(i) ElseIf i > 1 And j = 1 Then nxval = nxval & "," & xval(i) nyval = nyval & "," & yval(i) ElseIf i = nv And j = 2 Then Exit For Else nxval = nxval & "," & xval(i) + (xval(i + 1) - xval(i)) * (j - 1) / np nyval = nyval & "," & yval(i) + (yval(i + 1) - yval(i)) * (j - 1) / np End If Next j Next i '//グラフにデータを直接書き込む場合 csc.XValues = "{" & nxval & "}" csc.Values = "{" & nyval & "}" '//シートに書き出したデータセル範囲をセットする場合 ' With Range("A1") ' Set xrng = .Offset(, 2).Resize(UBound(Split(nxval, ",")) + 1) ' Set yrng = .Offset(, 3).Resize(UBound(Split(nyval, ",")) + 1) ' End With ' xrng.Value = WorksheetFunction.Transpose(Split(nxval, ",")) ' yrng.Value = WorksheetFunction.Transpose(Split(nyval, ",")) ' With csc ' .XValues = xrng ' .Values = yrng ' End With End Sub
その他の回答 (6)
- xls88
- ベストアンサー率56% (669/1189)
>データを10倍にする場合、数値が「2」になっている場所を10に変えれば大丈夫ですよね? やってみれば結果がすぐでますよ。 答えはNO!です。 前後のデータ値の差分の2分の1を前のデータ値に加算しているだけです。 マクロを5回ループしてやれば10倍ということになると思います。 Sub goo散布図細分化4() Dim chtobj As ChartObject Dim csc As Object Dim xval As Variant Dim yval As Variant Dim nxval As String Dim nyval As String Dim xrng As Range Dim yrng As Range Dim n As Long Dim i As Long Dim j As Long Dim k As Long Set chtobj = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count) Set csc = chtobj.Chart.SeriesCollection(1) '---テストを繰り返すために元のデータ範囲をセットしています。 csc.XValues = Range("A1:A10") 'Xの元データ範囲 csc.Values = Range("B1:B10") 'Yの元データ範囲 '--------ここまで For k = 1 To 5 xval = csc.XValues yval = csc.Values n = UBound(xval) For i = 1 To n * 2 - 1 If i Mod 2 = 1 Then j = j + 1 If i = 1 Then nxval = xval(j) nyval = yval(j) Else nxval = nxval & "," & xval(j) nyval = nyval & "," & yval(j) End If Else nxval = nxval & "," & xval(j) + (xval(j + 1) - xval(j)) / 2 nyval = nyval & "," & yval(j) + (yval(j + 1) - yval(j)) / 2 End If Next i csc.XValues = "{" & nxval & "}" '書き込み csc.Values = "{" & nyval & "}" '書き込み j = 0 Next k End Sub >グラフを細かくする目的は、部分部分で細かいグラフを見て、 >その部分のデータを抽出したかったからです。 直線的なデータを単純に計算しているだけです。 このマクロが上記目的に合致しているかどうか疑問です。
- xls88
- ベストアンサー率56% (669/1189)
再分化したデータをシートに書き出すようにしてみました。 Sub goo散布図細分化2() Dim chtobj As ChartObject Dim csc As Object Dim xval As Variant Dim yval As Variant Dim nxval As Variant Dim nyval As Variant Dim xrng As Range Dim yrng As Range Dim n As Integer Dim i As Long Dim j As Long Set chtobj = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count) Set csc = chtobj.Chart.SeriesCollection(1) '---テストを繰り返すために元のデータ範囲をセットしています。 csc.XValues = Range("A1:A10") 'Xの元データ範囲 csc.Values = Range("B1:B10") 'Yの元データ範囲 '--------ここまで xval = csc.XValues yval = csc.Values n = UBound(xval) ReDim nxval(n * 2 - 1) ReDim nyval(n * 2 - 1) For i = 0 To n * 2 - 2 If i Mod 2 = 0 Then j = j + 1 nxval(i) = xval(j) nyval(i) = yval(j) Else nxval(i) = xval(j) + (xval(j + 1) - xval(j)) / 2 nyval(i) = yval(j) + (yval(j + 1) - yval(j)) / 2 End If Next i With Range("A1") '元データ表の左上角のセル基準 Set xrng = .Offset(, 2).Resize(n * 2 - 1) Set yrng = .Offset(, 3).Resize(n * 2 - 1) End With xrng.Value = WorksheetFunction.Transpose(nxval) yrng.Value = WorksheetFunction.Transpose(nyval) With csc .XValues = xrng .Values = yrng End With End Sub
- xls88
- ベストアンサー率56% (669/1189)
グラフの種類は散布図ですか? 下記ページが役に立つかも知れません。 グラフ範囲を自動的に更新する方法が解説されています。 Excel でのグラフ範囲を自動的に更新するために、定義名を使用する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;183446 Excel で名前付け範囲を使用して動的なグラフを作成する http://office.microsoft.com/ja-jp/assistance/HA011098011041.aspx ”グラフを細かくしたい”という目的はなんでしょうか。 試しに項目数を増やすマクロを組んでみました。 値を直接グラフにセット(SERIES関数に書き込み)します。 元のデータとのリンクは切れます。 10個程度のサンプルデータで確認しています。 数百個のデータに対し問題なく実行できるかどうか分かりません。 Sub test散布図項目細分化() Dim chtobj As ChartObject Dim csc As Object Dim xval As Variant Dim yval As Variant Dim nxval As String Dim nyval As String Dim n As Integer Dim i As Long Dim j As Long Set chtobj = ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count) Set csc = chtobj.Chart.SeriesCollection(1) '---テストを繰り返すために元のデータ範囲をセットしています。 csc.XValues = Range("A1:A10") 'Xの元データ範囲 csc.Values = Range("B1:B10") 'Yの元データ範囲 '--------ここまで xval = csc.XValues yval = csc.Values n = UBound(xval) For i = 1 To n * 2 - 1 If i Mod 2 = 1 Then j = j + 1 If i = 1 Then nxval = xval(j) nyval = yval(j) Else nxval = nxval & "," & xval(j) nyval = nyval & "," & yval(j) End If Else nxval = nxval & "," & xval(j) + (xval(j + 1) - xval(j)) / 2 nyval = nyval & "," & yval(j) + (yval(j + 1) - yval(j)) / 2 End If Next i csc.XValues = "{" & nxval & "}" csc.Values = "{" & nyval & "}" End Sub
お礼
xls88さん、返事が遅くなって申し訳ありません。 わざわざマクロを組んでいただいて本当にありがとうございます。 グラフを細かくする目的は、部分部分で細かいグラフを見て、その部分のデータを抽出したかったからです。 グラフを消してマクロを実行していたため、上手くいかず焦っていました。 現在は、データが2倍に増えていますが、データを10倍にする場合、数値が「2」になっている場所を10に変えれば大丈夫ですよね?
- imogasi
- ベストアンサー率27% (4737/17069)
#1でマトを射たことをおっしゃっておられる。 エクセルはシートに(何の方法でも良い)データを作らないとグラフに反映されません。式のようなことを、別途与えて、受けてくれる機能はありません。データ上に実現しないと。このエクセルでの、基本のことを質問者はまだ気づいてないのでは。まずデータありきです。 わかっておれば、質問の仕方が、御礼の仕方が変わるはずです。 >マクロでどうにかしたほうがいいですかね 上記のことがわかれば、後はマクロでも関数でも、手入力でもかまわない。お好きなようにどうぞ。 ーー >直線の補完で充分なのですが グラフの種類によっては(折れ線グラフ)足して1/2する補間では 余り様子が変わらない。 グラフの種類は何を考えているのですか。それぐらい質問に書クべきです。 補間を別の方法でやるならともかく、こんなの、やっても意味無いのでは。
- ASIMOV
- ベストアンサー率41% (982/2351)
データーを補完したいという事でしたら 行を1行おきに追加して A2 =(A1+A3)/2 等とすれば、中間の値が補完されます グラフを滑らかにしたいという事なら グラフ作成時に「散布図」とし プロットした点の一つを右クリックすると「近似曲線の追加」というのが有ります それで、「多項式近似」で3次位にするとなめらかな曲線になります
- FEX2053
- ベストアンサー率37% (7991/21371)
Excelのグラフは「前提となる表」をグラフ化することしか出来ません。 ですので、そういう「補完データを表現すること」は元になる表の方で 行うことが前提になります。 で、問題はその補完方法ですが、直線で補完するのか、対数や高次の 曲線で補完するのかによって値は当然変わってきますよね。まずは その辺をハッキリさせる必要があります。補完する式が決まればあとは 表にその式を適用すれば、中間の値はいくらでも出てきますし。 まあ、適当に繋いだ程度でいいのなら、単に折れ線グラフにすれば済む 話だと思うんですが・・・そこらへんどうなんですか?
お礼
直線の補完で充分なのですが、XY座標が300以上のあるグラフなので、マクロでどうにかしたほうがいいですかね?
お礼
ありがとうございます.自分でも細分化数を指定できるようにマクロ改良していたところなので,とてもありがたいです. 本当にありがとうございます.