• ベストアンサー

エクセルにおけるY/数値軸の自動に関する挙動

質問番号:6857770(「エクセルでチャートをスクロール」について)によって、株価チャートの横スクロールが出来る様になりましたが、横スクロールをしていると、Y/数値軸の自動調整がうまく働いていない箇所があります。 具体的には、米ドル円にて、ローソク足と移動平均線を表示させているのですが、縦軸のレートが、0~120とかになってしまう。 (「軸の書式設定」-「目盛」-「自動」にはすべてチェックを入れています。) これって、軸の書式設定における「自動」の仕様なのでしょうか? マクロはある程度は使えますが、グラフがらみはさっぱりです。 どなたか、ご指導いただけないでしょうか?

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

失礼。 xxx!QMXとxxx!RMXはそのエラーが出ても良いのでした。 というかエラーが出ます。 その2つはセル範囲を参照しているわけではないからです。 確認するには MsgBox [EUR2JPY!QMX] とするか、 EUR2JPYシートの空いているセルに =QMX と入力すれば答えが出ます。 Sheet1のQ2が 0 となっていても =QMX の答えが 1 であれば良いです。 となると、やはりEUR2JPY!SMA25以下の名前定義がおかしい事になります。 EUR2JPY!日付 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,0,EUR2JPY!QMX,) EUR2JPY!始値 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,1,EUR2JPY!QMX,) EUR2JPY!高値 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,2,EUR2JPY!QMX,) : となっているかどうか、ですね。 [名前の定義]を最初からやり直したほうが良いかもしれません。 ついでに、可変範囲の名前定義に関して、違う考え方での数式も提示しておきます。 データがあるシート名が EUR2JPY スクロールバーを設定したシートが Sheet1 だとします。 RMXを最初に定義します。 EUR2JPY!RMX =MIN(COUNTA($B:$B)+1,Sheet1!$R$2+3) 以下 EUR2JPY!QMX =MIN(COUNTA($B:$B)+1,MAX(3,Sheet1!$Q$2+EUR2JPY!RMX-1)) EUR2JPY!DATA =INDEX($B:$B,EUR2JPY!RMX):INDEX($AK:$AK,EUR2JPY!QMX) EUR2JPY!日付 =INDEX(EUR2JPY!DATA, 0, 1) EUR2JPY!始値 =INDEX(EUR2JPY!DATA, 0, 2) EUR2JPY!高値 =INDEX(EUR2JPY!DATA, 0, 3) EUR2JPY!安値 =INDEX(EUR2JPY!DATA, 0, 4) EUR2JPY!終値 =INDEX(EUR2JPY!DATA, 0, 5) EUR2JPY!SMA5 =INDEX(EUR2JPY!DATA, 0, 34) EUR2JPY!SMA25 =INDEX(EUR2JPY!DATA, 0, 35) EUR2JPY!SMA75 =INDEX(EUR2JPY!DATA, 0, 36) QMX がx範囲数なので、終点のセル位置(行)を示すようにし、 RMX はx移動なので、始点のセル位置(行)を示すようにします。 そして全体範囲を DATA で設定して、DATAの各列をINDEX関数で指定します。 [名前定義]をマクロで設定するなら Sub test2()   With Sheets("EUR2JPY")     .Names.Add "RMX", "=MIN(COUNTA($B:$B)+1,Sheet1!$R$2+3)"     .Names.Add "QMX", "=MIN(COUNTA($B:$B)+1,MAX(3,Sheet1!$Q$2+EUR2JPY!RMX-1))"     .Names.Add "DATA", "=INDEX($B:$B,EUR2JPY!RMX):INDEX($AK:$AK,EUR2JPY!QMX)"     .Names.Add "日付", "=INDEX(EUR2JPY!DATA, 0, 1)"     .Names.Add "始値", "=INDEX(EUR2JPY!DATA, 0, 2)"     .Names.Add "高値", "=INDEX(EUR2JPY!DATA, 0, 3)"     .Names.Add "安値", "=INDEX(EUR2JPY!DATA, 0, 4)"     .Names.Add "終値", "=INDEX(EUR2JPY!DATA, 0, 5)"     .Names.Add "SMA5", "=INDEX(EUR2JPY!DATA, 0, 34)"     .Names.Add "SMA25", "=INDEX(EUR2JPY!DATA, 0, 35)"     .Names.Add "SMA75", "=INDEX(EUR2JPY!DATA, 0, 36)"   End With End Sub こんな感じです。 スクロールバーの設定や Sub 調整 マクロは変更の必要はありません。

tateyokoking
質問者

お礼

出来ました!! >EUR2JPYシートの空いているセルに =QMX と入力すれば答えが出ます。 >Sheet1のQ2が 0 となっていても =QMX の答えが 1 であれば良いです。 →"1"になります。ここは問題ありませんでした。 >となると、やはりEUR2JPY!SMA25以下の名前定義がおかしい事になります。 >EUR2JPY!日付 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,0,EUR2JPY!QMX,) >EUR2JPY!始値 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,1,EUR2JPY!QMX,) >EUR2JPY!高値 =OFFSET(EUR2JPY!$B$3,EUR2JPY!RMX,2,EUR2JPY!QMX,) →すべての$B$3が$B$2になっていた。 (昨日は気がつかなかったんですが・・。これで納得。) いったんすべて消して再度入力しなおしましたら、EUR2JPYだけでなくすべてのクロス円で問題なくなりました。 >ついでに、可変範囲の名前定義に関して、違う考え方での数式も提示しておきます。 こちらのマクロも確認し、問題ありませんでした。 ただ、x:範囲数=0のときの挙動がグラフの一番左端のローソク足と一日前のローソク足の2つが表示されました。 仕様としては、x:範囲数=1とイコールとしたいので、今までのを使用いたします。 長々とお付き合いくださいましてありがとうございました。 教えていただいたマクロは、これから結構使うであろうテクニック満載でした。 では。

その他の回答 (5)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.5

>..きちんと動作するようになりました。ここに関してはOKです。 取り敢えず良かったです:D >>>「このワークシートの数式に、1つまたは複数の無効な参照が含まれています。・・」 これについては定義した[名前]の数式が原因だと思われます。 x:範囲数を0にして、エラーメッセージを閉じて以下のマクロでチェックしてみてください。 Sub namecheck()   Dim n As Name   On Error GoTo erLine   For Each n In ActiveWorkbook.Names     Debug.Print n.Name, vbTab;     Debug.Print n.RefersToRange.Address   Next   Exit Sub erLine:   Debug.Print err.Description   Resume Next End Sub [イミディエイトウィンドウ]に実行結果が出力されます。 #念のため。[イミディエイトウィンドウ]はVBEditorで[ctrl]+[g]で表示。 正常にセル範囲を参照している[名前]はその参照範囲アドレスが出力されます。 『アプリケーション定義またはオブジェクト定義のエラーです。』 と出力された名前をチェックしてみてください。 >スクロールバーを動かしながらデバッガのステップ実行のしかた.. これはスクロールバーをクリックしてSub 調整 マクロをステップ実行したいという意味ですか? Sub 調整 マクロの >x = Application.CountA(Worksheets("USD2JPY").Columns("B")) - 1 この行にでもカーソルを置いて[F9]キー。 ブレイクポイントが設定されます。(解除はもう一度[F9]キー) 実行時にブレイクしますのでその後ステップ実行してみてください。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html デバッグの基本については知っておいたほうが良いでしょうね。

tateyokoking
質問者

補足

こんばんは。 回答いたします。 >これについては定義した[名前]の数式が原因だと思われます。 >x:範囲数を0にして、エラーメッセージを閉じて以下のマクロでチェックしてみてください。 <USD2JPY> (1)x:範囲数=75のとき USD2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!SMA25 $AJ$3025:$AJ$3099 USD2JPY!SMA5 $AI$3025:$AI$3099 USD2JPY!SMA75 $AK$3025:$AK$3099 USD2JPY!安値 $E$3025:$E$3099 USD2JPY!高値 $D$3025:$D$3099 USD2JPY!始値 $C$3025:$C$3099 USD2JPY!終値 $F$3025:$F$3099 USD2JPY!日付 $B$3025:$B$3099 (2)x:範囲数=1のとき USD2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!SMA25 $AJ$3025 USD2JPY!SMA5 $AI$3025 USD2JPY!SMA75 $AK$3025 USD2JPY!安値 $E$3025 USD2JPY!高値 $D$3025 USD2JPY!始値 $C$3025 USD2JPY!終値 $F$3025 USD2JPY!日付 $B$3025 (3)x:範囲数=0のとき USD2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 USD2JPY!SMA25 $AJ$3025 USD2JPY!SMA5 $AI$3025 USD2JPY!SMA75 $AK$3025 USD2JPY!安値 $E$3025 USD2JPY!高値 $D$3025 USD2JPY!始値 $C$3025 USD2JPY!終値 $F$3025 USD2JPY!日付 $B$3025 →QMXが効いており、(2)と(3)は同じ動作をしている。(OK) QMXとRMXにエラーが何故あるのかさっぱりわかりません。 USD2JPYに関しては、QMXとRMXにエラーはありますが、(3)のときでも(2)とまったく同じ動作をするので、問題ないとおもいますが、USD2JPYのシートを流用した他のクロス円については、すべて(6)の内容によりこけます。 横スクロールや、縦軸のリサイズはまったく問題ないんですが・・ <EUR2JPY> (4)x:範囲数=75のとき EUR2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!SMA25 $AJ$3018:$AJ$3092 EUR2JPY!SMA5 $AI$3018:$AI$3092 EUR2JPY!SMA75 $AK$3018:$AK$3092 EUR2JPY!安値 $E$3018:$E$3092 EUR2JPY!高値 $D$3018:$D$3092 EUR2JPY!始値 $C$3018:$C$3092 EUR2JPY!終値 $F$3018:$F$3092 EUR2JPY!日付 $B$3018:$B$3092 (5)x:範囲数=1のとき EUR2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!SMA25 $AJ$3018 EUR2JPY!SMA5 $AI$3018 EUR2JPY!SMA75 $AK$3018 EUR2JPY!安値 $E$3018 EUR2JPY!高値 $D$3018 EUR2JPY!始値 $C$3018 EUR2JPY!終値 $F$3018 EUR2JPY!日付 $B$3018 (6)x:範囲数=0のとき EUR2JPY!QMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!RMX アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!SMA25 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!SMA5 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!SMA75 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!安値 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!高値 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!始値 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!終値 アプリケーション定義またはオブジェクト定義のエラーです。 EUR2JPY!日付 アプリケーション定義またはオブジェクト定義のエラーです →QMXが効いていない? (6)のとき、sheet1のグラフの日付が"1900/1/1"になっていて、グラフには何も出て こない。 QMX=MIN(COUNTA(EUR2JPY!$B:$B)-1,IF(Sheet1!$Q$2<1,1,Sheet1!$Q$2)) RMX=MIN(COUNTA(EUR2JPY!$B:$B)-1-EUR2JPY!QMX,IF(ISBLANK(Sheet1!$R$2),0,Sheet1!$R$2)) QMX,RMXの定義は問題ない。 (さっぱりです。) >デバッグの基本については知っておいたほうが良いでしょうね。 ありがとうございます。 早速使わせていただきます。 以上、ご指導よろしくお願いいたします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

>しかし、状況は変わりません。 ..orz そうですか。 >また、x範囲数の値を0にすると、 >「このワークシートの数式に、1つまたは複数の無効な参照が含まれています。・・」 >というエラーメッセージが出てしまいます。 この現象についてはどうですか? それと、以下教えてください。 Q1)データは何日~何日までのデータですか? Q2)縦軸目盛最小値が 0 になるのは何日から何日を表示させた時ですか? Q3)縦軸目盛最小値が 0 になるのは主軸ですか、それとも第2軸ですか? ...と、ここまで書いて、実際10年分のデータで検証してみたらこちらでも再現しました。 #なので上記質問のお答えは不要です。 データ内容によるのか?最小値が 0 になる区間がありますね... 考えてみたら、株価チャートに移動平均線を付加してるという事は 移動平均は第2軸を使ってるのですよね。 いずれにしても、主軸と第2軸の最小値と最大値を合わせないといけないですね。 そこで、スクロールバーに登録するマクロを以下に変更します。 Sub 調整()   Dim x As Long   Dim mx As Long   Dim mn As Long   x = Application.CountA(Worksheets("USD2JPY").Columns("B")) - 1   With Sheets("Sheet1")     With .Range("Q2")       If .Value > x Then         .Value = x       End If       x = x - .Value     End With     With .Range("R2")       If .Value > x Then         .Value = x       End If     End With     mn = Application.Min(Range("USD2JPY!安値")) - 1     mx = Application.Max(Range("USD2JPY!高値")) + 1     With .ChartObjects(1).Chart       With .Axes(xlValue, xlPrimary)         .MinimumScale = mn         .MaximumScale = mx       End With       With .Axes(xlValue, xlSecondary)         .MinimumScale = mn         .MaximumScale = mx       End With     End With   End With End Sub スクロールバーによって参照データ範囲を変更する度に 参照データ範囲から最小値最大値を算出してセットします。 #あと、先に提示したグラフ作成Sub test()は系列の名前がずれてました。すみません。 #それに移動平均線のデータによってはエラーが出てグラフが作られません。 #まあ、本筋とは関係ないところなんでSub test()は捨てておいてください。

tateyokoking
質問者

補足

お世話になります。 このマクロを少しモディファイ(最大値、最小値判定において、高値、安値以外にSMAも加えた)して、きちんと動作するようになりました。ここに関してはOKです。 >>「このワークシートの数式に、1つまたは複数の無効な参照が含まれています。・・」 >>というエラーメッセージが出てしまいます。 >この現象についてはどうですか? これは、直っていません。 (x:範囲数を0にする事はまずしませんが、マクロの処理的には非常に気になります。スクロールバーを動かしながらデバッガのステップ実行のしかたがわからず頓挫しています。) 大変申し訳ありませんが、よろしくおねがいします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

>データ送ったほうがよろしいでしょうか? ゃ、そこまでしなくても大丈夫かと思いますが.. ちょっとマクロで作成してみますか。 新規Bookにシート"USD2JPY"のデータだけコピーします。 データは当然B2:F2以下とAI2:AK2以下にあるものとします。 1行目には何もデータを入れないでください。 名前を"USD2JPY"に変更してください。 その他、Sheet1 という名前のシートもあるものとします。 以上の準備を整えたら、そのBookをアクティブにして以下のマクロを実行します。 (名前の付け方をちょっと変えてます) Sub test()   Dim r As Range   Dim s As String   With Sheets("USD2JPY")     '[名前定義]を作成     .Names.Add "QMX", "=MIN(COUNTA($B:$B)-1,IF(Sheet1!$Q$2<1,1,Sheet1!$Q$2))"     .Names.Add "RMX", "=MIN(COUNTA($B:$B)-1-USD2JPY!QMX,IF(ISBLANK(Sheet1!$R$2),0,Sheet1!$R$2))"     .Names.Add "日付", "=OFFSET($B$3,RMX,0,QMX,)"     .Names.Add "始値", "=OFFSET($B$3,RMX,1,QMX,)"     .Names.Add "高値", "=OFFSET($B$3,RMX,2,QMX,)"     .Names.Add "安値", "=OFFSET($B$3,RMX,3,QMX,)"     .Names.Add "終値", "=OFFSET($B$3,RMX,4,QMX,)"     .Names.Add "SMA5", "=OFFSET($B$3,RMX,33,QMX,)"     .Names.Add "SMA25", "=OFFSET($B$3,RMX,34,QMX,)"     .Names.Add "SMA75", "=OFFSET($B$3,RMX,35,QMX,)"     s = "'" & .Name & "'!"   End With   With Sheets("Sheet1")     .Range("Q1:R1").Value = [{"x範囲数","x移動"}]     'ScrollBar作成     For Each r In .Range("Q3:R3")       With .ScrollBars.Add(r.Left, r.Top, r.Width, r.Height)         .Value = 1         .Min = 0         .Max = 100         .SmallChange = 1         .LargeChange = 10         .LinkedCell = r.Offset(-1).Address       End With     Next     .Range("Q2").Value = 10     'グラフ作成     With .ChartObjects.Add(.Range("S1").Left, 0, 500, 300).Chart       .SeriesCollection.NewSeries.Formula _         = "=SERIES(" & s & "$B$2," & s & "日付," & s & "始値,1)"       .SeriesCollection.NewSeries.Formula _         = "=SERIES(" & s & "$C$2," & s & "日付," & s & "高値,2)"       .SeriesCollection.NewSeries.Formula _         = "=SERIES(" & s & "$D$2," & s & "日付," & s & "安値,3)"       .SeriesCollection.NewSeries.Formula _         = "=SERIES(" & s & "$E$2," & s & "日付," & s & "終値,4)"       .ChartType = xlStockOHLC       With .SeriesCollection.NewSeries         .Formula = "=SERIES(" & s & "$AI$2," & s & "日付," & s & "SMA5,5)"         .AxisGroup = 2       End With       With .SeriesCollection.NewSeries         .Formula = "=SERIES(" & s & "$AJ$2," & s & "日付," & s & "SMA25,6)"         .AxisGroup = 2       End With       With .SeriesCollection.NewSeries         .Formula = "=SERIES(" & s & "$AK$2," & s & "日付," & s & "SMA75,7)"         .AxisGroup = 2       End With     End With   End With End Sub これでうまくいくようだったら、本番のBookを上書き保存し、 このマクロを走らせればいいです。 #本番のBookで失敗したら保存せずに閉じてください。 後は、先のレスのSub 調整()をスクロールバーに登録してください。

tateyokoking
質問者

補足

早速の回答ありがとうございます。 しかし、状況は変わりません。 頂いたマクロにて、ステップ実行しながら動作の理解に勤めていましたので回答が遅くなりました。(とても勉強になりましたが。) たびたびすみませんが、ご指導よろしくお願いします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

ANo.1の補足通りに設定されているなら間違いありません。 シート"USD2JPY"をアクティブにしてどこか空いているセルを選択し、 [挿入]-[名前]-[貼り付け]-[リスト貼り付け]をやってみてください。 [名前定義]の一覧が貼り付けされます。 _25SMA =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,34,USD2JPY!QMX,) _5SMA =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,33,USD2JPY!QMX,) _75SMA =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,35,USD2JPY!QMX,) QMX =MIN(COUNTA(USD2JPY!$B:$B)-1,IF(Sheet1!$Q$2<1,1,Sheet1!$Q$2)) RMX =MIN(COUNTA(USD2JPY!$B:$B)-1-USD2JPY!QMX,IF(ISBLANK(Sheet1!$R$2),0,Sheet1!$R$2)) 安値 =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,3,USD2JPY!QMX,) 高値 =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,2,USD2JPY!QMX,) 始値 =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,1,USD2JPY!QMX,) 終値 =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,4,USD2JPY!QMX,) 日付 =OFFSET(USD2JPY!$B$3,USD2JPY!RMX,0,USD2JPY!QMX,) これと全く同じかどうかチェックしてください。 $Q$2、$R$2 などは$がついた絶対座標になってないといけないです。 あとは名前の前に USD2JPY! を付けてシート名を指定したかどうかもチェックしてみてください。

tateyokoking
質問者

補足

こんばんは。 早速のご回答ありがとうございました。 >これと全く同じかどうかチェックしてください。 >$Q$2、$R$2 などは$がついた絶対座標になってないといけないです。 >あとは名前の前に USD2JPY! を付けてシート名を指定したかどうかもチェックしてみてください。 アドバイスどおりまったく同じです。 どうしましょう? データ送ったほうがよろしいでしょうか? 何度もすみませんが、よろしくお願いいたします。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

http://okwave.jp/qa/q6857770.html 横スクロール範囲に制限を設けているわけではないので、 チャートの参照範囲に、データ範囲外、つまり値 0 の範囲を含んでしまいます。 これを回避するには[名前定義]を工夫して拡張範囲、移動範囲を制限します。 「名前」Sheet1!FMX  「参照範囲」=MIN(COUNTA(Sheet1!$A:$A)-1,IF(Sheet1!$F$2<1,1,Sheet1!$F$2)) 「名前」Sheet1!GMX  「参照範囲」=MIN(COUNTA(Sheet1!$A:$A)-1-Sheet1!FMX,IF(ISBLANK(Sheet1!$G$2),0,Sheet1!$G$2)) 「名前」Sheet1!日付 「参照範囲」=OFFSET($A$2,GMX,0,FMX,) 「名前」Sheet1!始値 「参照範囲」=OFFSET($A$2,GMX,1,FMX,) 「名前」Sheet1!高値 「参照範囲」=OFFSET($A$2,GMX,2,FMX,) 「名前」Sheet1!安値 「参照範囲」=OFFSET($A$2,GMX,3,FMX,) 「名前」Sheet1!終値 「参照範囲」=OFFSET($A$2,GMX,4,FMX,) 以上、名前FMXとGMXを追加します。 それに対応して、日付~終値を変更します。 FMXはF2セルの最大値としてデータ範囲の行数をMAXとします。 GMXはG2セルの最大値としてFMXと連動して移動できるMAXを設定します。 ついでにOFFSETの起点をA1からA2に変更しておきます。 また、起点をA1からA2に変更したので x移動範囲用のスクロールバーを右クリック[コントロールの書式設定]-[コントロール]タブで 「最小値」を0に変更します。 上記は[名前定義]によって制限を設けただけですので、スクロールバーによる F2:G2の変化は制限されていません。 F2:G2の値が変わってもグラフがスクロールしない範囲の値が発生します。 これも対応したいなら Sub 調整()   Dim x As Long   x = Application.CountA(Columns("A")) - 1   With Range("F2")     If .Value > x Then       .Value = x     End If   End With   With Range("G2")     If .Value > x - Range("F2").Value Then       .Value = x - Range("F2").Value     End If   End With End Sub このマクロを標準モジュールに置いて、 2つのスクロールバーに[マクロの登録]をすれば良いです。

tateyokoking
質問者

補足

お世話になっております。 早速試してみましたが、うまく言っておりません。 自分で作成したチャート分析シートに記述しておりますので以下の仕様にて 頂いたコメントを以下のように読み替えております。 また、x範囲数の値を0にすると、 「このワークシートの数式に、1つまたは複数の無効な参照が含まれています。・・」 というエラーメッセージが出てしまいます。 これは、「名前」USD2JPY!QMXのところで、処理が出来ていると思っているのですが私の解釈が間違えているのでしょうか? 大変申し訳ありませんが、ご指導よろしくお願いします。 チャートの仕様 ・ワークシート"USD2JPY" 日付:(B2)/データはB3~ 始値:(C2)/データはC3~ 高値:(D2):/データはD3~ 安値:(E2):/データはE3~ 終値:(F2):/データはF3~ _5SMA:(AI2):/データはAI3~ _25SMA:(AJ2):/データはAJ3~ _75SMA:(AK2):/データはAK3~ (SMA=単純移動平均線) ・ワークシート"Sheet1" グラフそのもの x範囲数:(Q1)/データはQ2 x移動:(R1)/データはR2 ------------------------------------------------------------------------------- 横スクロール範囲に制限を設けているわけではないので、 チャートの参照範囲に、データ範囲外、つまり値 0 の範囲を含んでしまいます。 これを回避するには[名前定義]を工夫して拡張範囲、移動範囲を制限します。 「名前」USD2JPY!QMX  「参照範囲」=MIN(COUNTA(USD2JPY!$B:$B)-1,IF(Sheet1!$Q$2<1,1,Sheet1!$Q$2)) 「名前」USD2JPY!RMX  「参照範囲」=MIN(COUNTA(USD2JPY!$B:$B)-1-USD2JPY!QMX,IF(ISBLANK(Sheet1!$R$2),0,Sheet1!$R$2)) 「名前」USD2JPY!日付 「参照範囲」=OFFSET($B$3,RMX,0,QMX,) 「名前」USD2JPY!始値 「参照範囲」=OFFSET($B$3,RMX,1,QMX,) 「名前」USD2JPY!高値 「参照範囲」=OFFSET($B$3,RMX,2,QMX,) 「名前」USD2JPY!安値 「参照範囲」=OFFSET($B$3,RMX,3,QMX,) 「名前」USD2JPY!終値 「参照範囲」=OFFSET($B$3,RMX,4,QMX,) 「名前」USD2JPY!_5SMA 「参照範囲」=OFFSET($B$3,RMX,33,QMX,) 「名前」USD2JPY!_25SMA 「参照範囲」=OFFSET($B$3,RMX,34,QMX,) 「名前」USD2JPY!_75SMA 「参照範囲」=OFFSET($B$3,RMX,35,QMX,) 以上、名前QMXとRMXを追加します。 それに対応して、日付~終値を変更します。 QMXはQ2セルの最大値としてデータ範囲の行数をMAXとします。 RMXはR2セルの最大値としてQMXと連動して移動できるMAXを設定します。 ついでにOFFSETの起点をB2からB3に変更しておきます。 また、起点をB2からB3に変更したので x移動範囲用のスクロールバーを右クリック[コントロールの書式設定]-[コントロール]タブで 「最小値」を0に変更します。 上記は[名前定義]によって制限を設けただけですので、スクロールバーによる F2:G2の変化は制限されていません。 F2:G2の値が変わってもグラフがスクロールしない範囲の値が発生します。 これも対応したいなら Sub 調整()   Dim x As Long   x = Application.CountA(Worksheets("USD2JPY").Columns("B")) - 1   With Range("Sheet1!Q2")     If .Value > x Then       .Value = x     End If   End With   With Range("Sheet1!R2")     If .Value > x - Range("Sheet1!Q2").Value Then       .Value = x - Range("Sheet1!Q2").Value     End If   End With End Sub このマクロを標準モジュールに置いて、 2つのスクロールバーに[マクロの登録]をすれば良いです。 ------------------------------------------------------------------------------- 以上

関連するQ&A

専門家に質問してみよう