Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1802 / 13645 ツリー ←次へ | 前へ→

【71795】データを追加に伴い、グラフの位置を移動したい ドカ 12/4/9(月) 8:31 質問[未読]
【71796】Re:データを追加に伴い、グラフの位置を移動... kanabun 12/4/9(月) 9:32 発言[未読]
【71797】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/9(月) 10:36 発言[未読]
【71798】Re:データを追加に伴い、グラフの位置を移動... kanabun 12/4/9(月) 11:12 発言[未読]
【71799】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/9(月) 12:32 発言[未読]
【71800】Re:データを追加に伴い、グラフの位置を移動... kanabun 12/4/9(月) 14:35 発言[未読]
【71801】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/9(月) 16:28 発言[未読]
【71803】Re:データを追加に伴い、グラフの位置を移動... kanabun 12/4/9(月) 17:09 発言[未読]
【71804】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/9(月) 21:23 発言[未読]
【71811】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/11(水) 8:04 お礼[未読]
【71812】Re:データを追加に伴い、グラフの位置を移動... kanabun 12/4/11(水) 11:19 発言[未読]
【71830】Re:データを追加に伴い、グラフの位置を移動... ドカ 12/4/13(金) 7:47 お礼[未読]

【71795】データを追加に伴い、グラフの位置を移動し...
質問  ドカ  - 12/4/9(月) 8:31 -

引用なし
パスワード
   E列の下に向かってデータを追加しています。
データが追加される度に、その隣に書いてあるグラフも下に移動するようにしたいです。

グラフの左下をグラフの位置とすると、
E116にデータを入力したら、グラフの位置はF125に移動し、
E117にデータを入力したら、グラフはF126に移動する
といったことがやりたいのです。

お分かりの方よろしくお願いいたします。

【71796】Re:データを追加に伴い、グラフの位置を移...
発言  kanabun  - 12/4/9(月) 9:32 -

引用なし
パスワード
   ▼ドカ さん:
>E列の下に向かってデータを追加しています。
>データが追加される度に、その隣に書いてあるグラフも下に移動するようにしたいです。

面白そうだったので、ぼくもトライしてみました。
1.まず、セルの(E列の)値が変化したときに、何か処理をするには
 シートのChangeイベントを拾って操作します。
2.E列のセルに入力(または値クリア)があったとき、新しいデータ範囲を
 グラフの系列1に書き込むには 系列式の中の値軸部分を変更してやります。
3.グラフの移動は 更新前の元データ範囲の最終セルのTop座標と
 グラフのTopとの差(diff) をおぼえておき、更新後の最終セルから
 更新後のグラフ位置を算出して移動します。

'------------- 以下を対象シートのシートモジュールに書いてください
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column <> 5 Then Exit Sub
  
  Dim r As Range, c As Range
  Dim zz As String, ss As String
  Dim diff As Double
  
  With Me.ChartObjects(1)
    zz = .Chart.SeriesCollection(1).Formula '現在の系列式
    ss = Split(zz, ",")(2)
    Set r = Me.Range(ss)  '現在の元データ範囲
    diff = r(r.Count).Top - .Top
    Set r = Excel.Range(r(1), r(1).End(xlDown)) '更新範囲
    .Chart.SeriesCollection(1).Formula = _
      Replace(zz, ss, r.Address(External:=True)) 'セット
    .Top = r(r.Count).Top - diff '       グラフ移動
  End With

End Sub

【71797】Re:データを追加に伴い、グラフの位置を移...
発言  ドカ  - 12/4/9(月) 10:36 -

引用なし
パスワード
   ▼kanabun さん 回答ありがとうございます。

E列には日々のデータを打ち込んでおり、日々の変化をグラフで確認しています。
データを打ち込むたびに、エクセルの画面は下に移動していきますので、グラフも一緒に移動してくれると、非常に使い勝手がよいので、今回お願いをしました。

提示いただいたコードを試したところ、まずは、期待通りの動きをするようです。
しかしならが、実際のデータには、空欄もあり、空欄があるとグラフは動きませんでした。

さらに、実際はD列にもデータが入っており、D列とE列のデータでひとつのグラフ上に折れ線グラフを2本書いています。
これに対しても、E列にデータを入れたところ、D列のグラフのデータ範囲が空欄のところまでに変更されてしまう問題が発生しました。

さらなる改善が可能であれば、よろしくお願いいたします。

【71798】Re:データを追加に伴い、グラフの位置を移...
発言  kanabun  - 12/4/9(月) 11:12 -

引用なし
パスワード
   ▼ドカ さん:

>しかしならが、実際のデータには、空欄もあり、空欄があるとグラフは動きませんでした。
この件に関しては、
>   Set r = Excel.Range(r(1), r(1).End(xlDown)) '更新範囲
と、上から .End(xlDown) で最終行を求めているのがまずいと思います。
ここを
   Set r = Excel.Range(r(1), _
          Cells(Me.Rows.Count, r.Column).End(xlUp)) '更新範囲
のように、シート最終行からxlUpで求めるように変えてみてください。

---
以下の件は、上の件が解決してから、残された問題として考え直しましょう
>さらに、実際はD列にもデータが入っており、D列とE列のデータでひとつのグラフ上に折れ線グラフを2本書いています。
>これに対しても、E列にデータを入れたところ、D列のグラフのデータ範囲が空欄のところまでに変更されてしまう問題が発生しました。

【71799】Re:データを追加に伴い、グラフの位置を移...
発言  ドカ  - 12/4/9(月) 12:32 -

引用なし
パスワード
   ▼kanabun さん 回答ありがとうございます。

E列にしかデータが無いときは、期待通りに動きました。

D列にデータがある場合について
(win7 office2003にて)

D列とE列のデータを使って、折れ線グラフを2本書いたときは、グラフは移動しませんでした。
E列のデータでグラフを最初に書いておき、後からD列のデータをドラッグ&ドロップでグラフに追加した場合は、期待通りの動きをしました。

【71800】Re:データを追加に伴い、グラフの位置を移...
発言  kanabun  - 12/4/9(月) 14:35 -

引用なし
パスワード
   ▼ドカ さん:

>D列にデータがある場合について
>(win7 office2003にて)
>
>D列とE列のデータを使って、折れ線グラフを2本書いたときは、グラフは移動しませんでした。

そしたら、
D列か、E列かでセル変更があったら、という条件に変えて、
グラフの系列の数、ループして、変更のあった列がグラフ表示系列になっている
系列だけ更新する----というのはどうでしょ


Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim myCol As Long
  myCol = Target.Column
  Select Case myCol
   Case 4, 5
   Case Else
      Exit Sub
  End Select
  
  Dim r As Range, c As Range
  Dim zz As String, ss As String
  Dim diff As Double
  Dim Ser As Series
  
  With Me.ChartObjects(1)
    For Each Ser In .Chart.SeriesCollection
      zz = Ser.Formula   '現在の系列式
      ss = Split(zz, ",")(2)
      Set r = Me.Range(ss)  '元データ範囲
      If r.Column = myCol Then
        diff = r(r.Count).Top - .Top
        Set r = Excel.Range(r(1), _
          Cells(Me.Rows.Count, r.Column).End(xlUp)) '更新範囲
        Ser.Formula = Replace(zz, ss, r.Address(, , , True)) 'セット
        .Top = r(r.Count).Top - diff 'グラフ移動
        Exit For
      End If
    Next Ser
  End With
End Sub

【71801】Re:データを追加に伴い、グラフの位置を移...
発言  ドカ  - 12/4/9(月) 16:28 -

引用なし
パスワード
   ▼kanabun さん 何度もありがとうございます。

う〜〜ん なぜだか分かりませんが、ぴくりとも動きません。
グラフの書き方も色々変えてみましたが、まったく動きませんでした。

一般的なコードであれば、自分でも色々試して糸口がつかめると思うのですが、図形などの操作は不慣れで、どうして動かないのか分かりませんでした。

【71803】Re:データを追加に伴い、グラフの位置を移...
発言  kanabun  - 12/4/9(月) 17:09 -

引用なし
パスワード
   ▼ドカ さん:
>▼kanabun さん 何度もありがとうございます。
>
>う〜〜ん なぜだか分かりませんが、ぴくりとも動きません。
>グラフの書き方も色々変えてみましたが、まったく動きませんでした。

2点ほど、確認してください
1.修正後のコードは対象(グラフのある)シートのシートモジュールに
  書いていますか?
2.修正後のコードは D,E列のセル変更に反応します。
  対象シート上で DまたはE列変更して、Worksheet_Changeイベント
  が起きてChangeイベントプロシージャが呼び出されているか、
  また、プロシージャ内でどのようにコードが実行されているか?
  以下の方法で調べてください:
> Private Sub Worksheet_Change(ByVal Target As Range)
>  Dim myCol As Long
>  myCol = Target.Column
まず、この 「  myCol = Target.Column 」の行を(マウスで)選択し、
キーボードの[F9]を押してこの行に「ブレークポイント」をセットして
ください。
つぎに、シートに戻り、D,Eいずれかの列にデータを入力してください
入力を画定するために[Enter]を押すと、Changeイベントが発生し、
先ほどのブレークポイントのセットしてある行で、プログラムの
実行が一時中断(Break)します。
そしたら [F8]を押して、プログラムを1行だけ実行してください。
>  myCol = Target.Column
の行が実行されます。myCol のところにマウスをあてがうと myCol変数の
現在の内容が表示されます。myCol はいくつになってますか?
4ですか? 5ですか?
このようにして、[F8]を押して一行づつ実行しながら、
>    For Each Ser In .Chart.SeriesCollection
>      zz = Ser.Formula   '現在の系列式
>      ss = Split(zz, ",")(2)
>      Set r = Me.Range(ss)  '元データ範囲
>      If r.Column = myCol Then
zz がどのような式で、
zzをカンマで区切った3番目の部分が 現在の「y軸元データ範囲」で
その部分(Address)だけ 変数ssに代入して、元の範囲を取得している
ことなど、
順にトレースしていってください。
そうするうちに、あなたの意図しているとおりにプログラムが
動いていてくれない部分がどこか見えてくると思います。
不具合部分が分かったらそれを修正してください。
修正の仕方が分からなければ、不具合部分の報告だけお願いします。
こういう作業をデバッグ作業といいます。

【71804】Re:データを追加に伴い、グラフの位置を移...
発言  ドカ  - 12/4/9(月) 21:23 -

引用なし
パスワード
   ▼kanabun さん ありがとうございます

自宅のPC win7 office2010では、まったく問題なく動いています。
動かなかった方のPCは、また明日の朝に確認して報告させて頂きますね。

【71811】Re:データを追加に伴い、グラフの位置を移...
お礼  ドカ  - 12/4/11(水) 8:04 -

引用なし
パスワード
   ▼kanabun さん 回答ありがとうございます。

win7 office2003でもちゃんと動きました。

しかし、実は、ちゃんと動く時と動かない時があります。
一度、動けば、その後はずっと動くようです。
最初、動かなければ、その後も調子が悪いようです。

原因は不明です。
デバッグのやり方まで教えていただき、ありがとうございます。
再現性が不明なのでデバッグで原因を究明するには至っていません。

また、D列、E列のどちらのデータを変えても動く場合と、D列変更では動かずE列変更では動くといった現象もあります。

現時点では、これ以上のことは分かりませんでした。

しかし、実用性という意味では非常に便利で役立っており、非常に優れものだと満足しております。

【71812】Re:データを追加に伴い、グラフの位置を移...
発言  kanabun  - 12/4/11(水) 11:19 -

引用なし
パスワード
   ▼ドカ さん:
>win7 office2003でもちゃんと動きました。
>
>しかし、実は、ちゃんと動く時と動かない時があります。
>一度、動けば、その後はずっと動くようです。
>最初、動かなければ、その後も調子が悪いようです。
>
>原因は不明です。
>デバッグのやり方まで教えていただき、ありがとうございます。
>再現性が不明なのでデバッグで原因を究明するには至っていません。
>また、D列、E列のどちらのデータを変えても動く場合と、D列変更では動かずE列変更では動くといった現象もあります。
>
>現時点では、これ以上のことは分かりませんでした。

まず
■グラフの元データが入っている範囲(D,E列 )で入力したのに、
 Worksheet_Changeイベントプロシージャへ飛ばない
のか、
◆_Changeイベントプロシージャに飛んでいるのだが
 想定外の処理をする、あるいは、If文にひっかかりプロシージャを
 途中でぬけて(Exit)しまう
のか、
どちらなのかをハッキリさせましょう。

■ならば、どこか他のところに
  Application.EnableEvents = False
としているところはありませんか?

◆ならば、ブレークポイントをセットして[F8]で順に1行づつ処理を
 追っていけば、原因が分かりませんか?

【71830】Re:データを追加に伴い、グラフの位置を移...
お礼  ドカ  - 12/4/13(金) 7:47 -

引用なし
パスワード
   ▼kanabun さん アドバイスありがとうございます。

コードの1行1行が何を意味しているのか分からなかったので、とりあえずネットで調べて理解できました。
さらにデバッグ作業も当然やれるようになりました。
しかしながら、不具合が再現しないため、原因追求は出来ていません。

今にして思えば、私のケアレスミスということになりそうです。
また、再現したときには、確認して報告します。

1802 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free