アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excelのvbaで質問です。

アクティブな散布図に近似線を追加した後に、近似式(データラベルの内容)が読み取れません。
下記プログラムでなにも表示されません。
どこに問題があるのかわかりません。

理由はよくわからないのですが、下記コメント分の場所にDoEventsを追加すると読み取れます。
なぜでしょうか?

よくわからないDoEventsではなく、普通の処理で近似式(データラベルの内容)を正しく読み取るには
どのようなプログラムににしたらよいでしょうか?

Sub sTest()
Dim pCht As Chart
Dim pT As Trendline

If ActiveChart Is Nothing Then Exit Sub
Set pCht = ActiveChart
If pCht.SeriesCollection.Count = 0 Then Exit Sub
Set pT = pCht.FullSeriesCollection(1).Trendlines.Add
pT.DisplayEquation = True
' DoEvents
MsgBox pT.DataLabel.Text
End Sub

A 回答 (2件)

>ですが、プロパティって設定しただけじゃ反映されないって、それはExcel VBAの仕様なんでしょうか? 


>設定したらそれだけで反映されるのが、プロパティっていうものではないのですか?
仕様どす。グラフデータが少しでも変われば近似線も数式も変わりますよね、
期待する動作になる為には計算処理がどこかしら必ず発生するようなプロパティですし。
ユーザレベルで変更もオーバーライドもできなかったと思いますが、プロパティの値を変更したら内部的にはPropertyChangedのイベントが発生します。
VBAはシングルスレッドで動作してますのでsTest()で処理を止めている以上、上記のイベントなど溜まっているキューをどこかのタイミングで消化しないといけません。

>実際にはDoEventsを入れても、オブジェクトに反映されないケースがその後発生しています。
TrendlineのDataLabelが取れるまでDoEventsを繰り返すか、GetInputStateあたりでイベント状況を精査してからDataLabelの値取ればいいんじゃないでしょうか。


>普通にグラフを書く場合はDoEventsは不要です。そういう処理をしなくても、色やデータラベルなどのプロパティは即反映されるのに、
>近似式計算ではDoEventsが必要となる技術的な理由を知りたいのです。
Microsoftのサポートに問い合わせた方が確実です。他のプロパティやメソッドの関係上Addの処理内だかコンストラクタ内で生成済みなだけだと思いますが。
近似線の描画と数式表示の処理だけ分かれてるんじゃないですかね。

>そうしないと、技術的な動作保証の裏付けがないまま、なんとなく動くプログラムをリリースすることになってしまいますので。
書かれてる意味がよく分かりませんが、「なんとなく」で動くプログラムになっているのは設計者の責任であり、設計段階で間違ってるだけではないでしょうか。
動作保証や裏付けについてもリリースする側がテスト等を行って紐づける責務じゃないですか?
    • good
    • 0

pT.DisplayEquation = True



ここでプロパティの設定を変更しているだけで、変更がTrendlineオブジェクトにまだ反映されていないので、そのままじゃ何も出ません。
近似線の計算・表示処理はVBAでは制御しておらず、親のExcelに処理してもらう必要があります。
DoEventsを入れることで一旦溜まっているイベントをExcelやOSが処理する為、DataLabelに値が反映されるんです。

DoEventsが嫌だって言うのなら、
 近似線の追加、表示オプションの設定 と、近似線のラベルの読み取り
これらの処理を二分する必要があるんじゃないかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

説明されている事象自体は当初より想定しております。
だから、DoEventsを追加したのです。

ですが、プロパティって設定しただけじゃ反映されないって、それはExcel VBAの仕様なんでしょうか? 

設定したらそれだけで反映されるのが、プロパティっていうものではないのですか?

近似計算は例外的?にグラフオブジェクト内で処理できず、オブジェクトからExcelへ計算処理を依頼する必要があるということでしょうか?
普通にグラフを書く場合はDoEventsは不要です。そういう処理をしなくても、色やデータラベルなどのプロパティは即反映されるのに、近似式計算ではDoEventsが必要となる技術的な理由を知りたいのです。

そうしないと、技術的な動作保証の裏付けがないまま、なんとなく動くプログラムをリリースすることになってしまいますので。

それに、後出しで申し訳ありませんが、実際にはDoEventsを入れても、オブジェクトに反映されないケースがその後発生しています。

すみませんが、ぜひ、もう一歩深堀りしたアドバイスをいただけたらすごく助かります。

お礼日時:2016/01/01 11:51

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