• ベストアンサー

エクセルでグラフを細かくしたい

エクセルで,以下のような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 拙い説明ですが,よろしくお願いします.

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.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

Aei_aoi
質問者

お礼

ありがとうございます.自分でも細分化数を指定できるようにマクロ改良していたところなので,とてもありがたいです. 本当にありがとうございます.

その他の回答 (6)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

>データを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)
回答No.5

再分化したデータをシートに書き出すようにしてみました。 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)
回答No.4

グラフの種類は散布図ですか? 下記ページが役に立つかも知れません。 グラフ範囲を自動的に更新する方法が解説されています。 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

Aei_aoi
質問者

お礼

xls88さん、返事が遅くなって申し訳ありません。 わざわざマクロを組んでいただいて本当にありがとうございます。 グラフを細かくする目的は、部分部分で細かいグラフを見て、その部分のデータを抽出したかったからです。 グラフを消してマクロを実行していたため、上手くいかず焦っていました。 現在は、データが2倍に増えていますが、データを10倍にする場合、数値が「2」になっている場所を10に変えれば大丈夫ですよね?

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

#1でマトを射たことをおっしゃっておられる。 エクセルはシートに(何の方法でも良い)データを作らないとグラフに反映されません。式のようなことを、別途与えて、受けてくれる機能はありません。データ上に実現しないと。このエクセルでの、基本のことを質問者はまだ気づいてないのでは。まずデータありきです。 わかっておれば、質問の仕方が、御礼の仕方が変わるはずです。 >マクロでどうにかしたほうがいいですかね 上記のことがわかれば、後はマクロでも関数でも、手入力でもかまわない。お好きなようにどうぞ。 ーー >直線の補完で充分なのですが グラフの種類によっては(折れ線グラフ)足して1/2する補間では 余り様子が変わらない。 グラフの種類は何を考えているのですか。それぐらい質問に書クべきです。 補間を別の方法でやるならともかく、こんなの、やっても意味無いのでは。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.2

データーを補完したいという事でしたら 行を1行おきに追加して  A2 =(A1+A3)/2 等とすれば、中間の値が補完されます グラフを滑らかにしたいという事なら グラフ作成時に「散布図」とし プロットした点の一つを右クリックすると「近似曲線の追加」というのが有ります それで、「多項式近似」で3次位にするとなめらかな曲線になります

  • FEX2053
  • ベストアンサー率37% (7991/21371)
回答No.1

Excelのグラフは「前提となる表」をグラフ化することしか出来ません。 ですので、そういう「補完データを表現すること」は元になる表の方で 行うことが前提になります。 で、問題はその補完方法ですが、直線で補完するのか、対数や高次の 曲線で補完するのかによって値は当然変わってきますよね。まずは その辺をハッキリさせる必要があります。補完する式が決まればあとは 表にその式を適用すれば、中間の値はいくらでも出てきますし。 まあ、適当に繋いだ程度でいいのなら、単に折れ線グラフにすれば済む 話だと思うんですが・・・そこらへんどうなんですか?

Aei_aoi
質問者

お礼

直線の補完で充分なのですが、XY座標が300以上のあるグラフなので、マクロでどうにかしたほうがいいですかね?

関連するQ&A