重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

エクセルで,以下のような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

拙い説明ですが,よろしくお願いします.

A 回答 (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
    • good
    • 0
この回答へのお礼

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

本当にありがとうございます.

お礼日時:2008/10/20 12:46

>データを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

>グラフを細かくする目的は、部分部分で細かいグラフを見て、
>その部分のデータを抽出したかったからです。
直線的なデータを単純に計算しているだけです。
このマクロが上記目的に合致しているかどうか疑問です。
    • good
    • 0

再分化したデータをシートに書き出すようにしてみました。



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
    • good
    • 0

グラフの種類は散布図ですか?


下記ページが役に立つかも知れません。
グラフ範囲を自動的に更新する方法が解説されています。

Excel でのグラフ範囲を自動的に更新するために、定義名を使用する方法
http://support.microsoft.com/default.aspx?scid=k …

Excel で名前付け範囲を使用して動的なグラフを作成する
http://office.microsoft.com/ja-jp/assistance/HA0 …

”グラフを細かくしたい”という目的はなんでしょうか。
試しに項目数を増やすマクロを組んでみました。
値を直接グラフにセット(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
    • good
    • 0
この回答へのお礼

xls88さん、返事が遅くなって申し訳ありません。
わざわざマクロを組んでいただいて本当にありがとうございます。

グラフを細かくする目的は、部分部分で細かいグラフを見て、その部分のデータを抽出したかったからです。

グラフを消してマクロを実行していたため、上手くいかず焦っていました。

現在は、データが2倍に増えていますが、データを10倍にする場合、数値が「2」になっている場所を10に変えれば大丈夫ですよね?

お礼日時:2008/10/14 10:36

#1でマトを射たことをおっしゃっておられる。


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

データーを補完したいという事でしたら


行を1行おきに追加して
 A2 =(A1+A3)/2
等とすれば、中間の値が補完されます

グラフを滑らかにしたいという事なら
グラフ作成時に「散布図」とし
プロットした点の一つを右クリックすると「近似曲線の追加」というのが有ります
それで、「多項式近似」で3次位にするとなめらかな曲線になります
    • good
    • 0

Excelのグラフは「前提となる表」をグラフ化することしか出来ません。


ですので、そういう「補完データを表現すること」は元になる表の方で
行うことが前提になります。

で、問題はその補完方法ですが、直線で補完するのか、対数や高次の
曲線で補完するのかによって値は当然変わってきますよね。まずは
その辺をハッキリさせる必要があります。補完する式が決まればあとは
表にその式を適用すれば、中間の値はいくらでも出てきますし。

まあ、適当に繋いだ程度でいいのなら、単に折れ線グラフにすれば済む
話だと思うんですが・・・そこらへんどうなんですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/10 17:29

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