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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>ですが、プロパティって設定しただけじゃ反映されないって、それはExcel VBAの仕様なんでしょうか?
>設定したらそれだけで反映されるのが、プロパティっていうものではないのですか?
仕様どす。グラフデータが少しでも変われば近似線も数式も変わりますよね、
期待する動作になる為には計算処理がどこかしら必ず発生するようなプロパティですし。
ユーザレベルで変更もオーバーライドもできなかったと思いますが、プロパティの値を変更したら内部的にはPropertyChangedのイベントが発生します。
VBAはシングルスレッドで動作してますのでsTest()で処理を止めている以上、上記のイベントなど溜まっているキューをどこかのタイミングで消化しないといけません。
>実際にはDoEventsを入れても、オブジェクトに反映されないケースがその後発生しています。
TrendlineのDataLabelが取れるまでDoEventsを繰り返すか、GetInputStateあたりでイベント状況を精査してからDataLabelの値取ればいいんじゃないでしょうか。
>普通にグラフを書く場合はDoEventsは不要です。そういう処理をしなくても、色やデータラベルなどのプロパティは即反映されるのに、
>近似式計算ではDoEventsが必要となる技術的な理由を知りたいのです。
Microsoftのサポートに問い合わせた方が確実です。他のプロパティやメソッドの関係上Addの処理内だかコンストラクタ内で生成済みなだけだと思いますが。
近似線の描画と数式表示の処理だけ分かれてるんじゃないですかね。
>そうしないと、技術的な動作保証の裏付けがないまま、なんとなく動くプログラムをリリースすることになってしまいますので。
書かれてる意味がよく分かりませんが、「なんとなく」で動くプログラムになっているのは設計者の責任であり、設計段階で間違ってるだけではないでしょうか。
動作保証や裏付けについてもリリースする側がテスト等を行って紐づける責務じゃないですか?
No.1
- 回答日時:
pT.DisplayEquation = True
ここでプロパティの設定を変更しているだけで、変更がTrendlineオブジェクトにまだ反映されていないので、そのままじゃ何も出ません。
近似線の計算・表示処理はVBAでは制御しておらず、親のExcelに処理してもらう必要があります。
DoEventsを入れることで一旦溜まっているイベントをExcelやOSが処理する為、DataLabelに値が反映されるんです。
DoEventsが嫌だって言うのなら、
近似線の追加、表示オプションの設定 と、近似線のラベルの読み取り
これらの処理を二分する必要があるんじゃないかと。
回答ありがとうございます。
説明されている事象自体は当初より想定しております。
だから、DoEventsを追加したのです。
ですが、プロパティって設定しただけじゃ反映されないって、それはExcel VBAの仕様なんでしょうか?
設定したらそれだけで反映されるのが、プロパティっていうものではないのですか?
近似計算は例外的?にグラフオブジェクト内で処理できず、オブジェクトからExcelへ計算処理を依頼する必要があるということでしょうか?
普通にグラフを書く場合はDoEventsは不要です。そういう処理をしなくても、色やデータラベルなどのプロパティは即反映されるのに、近似式計算ではDoEventsが必要となる技術的な理由を知りたいのです。
そうしないと、技術的な動作保証の裏付けがないまま、なんとなく動くプログラムをリリースすることになってしまいますので。
それに、後出しで申し訳ありませんが、実際にはDoEventsを入れても、オブジェクトに反映されないケースがその後発生しています。
すみませんが、ぜひ、もう一歩深堀りしたアドバイスをいただけたらすごく助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
VBS でプログラムを先頭から再試行
-
実行時のCPU使用率を増やしたい
-
VB 電卓 メモリー機能
-
ノットイコールを教えて下さい
-
小数点を含む数値かどうか判断...
-
c言語。 組み合わせ最適化問題...
-
DLLで初回呼び出しと最後の...
-
numpyスライス機能を使った数値...
-
テキストファイルの空行をスキ...
-
Excel(VBA)でSetTimer関数を使...
-
C言語 時刻差分の算出方法
-
ExcelのVBAで再帰処理を使って...
-
ナップザック問題?をエクセル...
-
EXCELが高速に動く、PCを教えて...
-
VBでの簡易電卓の作成(減算方...
-
Excel VBA での処理時間計測結...
-
C言語:関数を使うメリットとデ...
-
キャッシュNFPについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
小数点を含む数値かどうか判断...
-
win10で、正確な待ち時間の作り方
-
Excel(VBA)でSetTimer関数を使...
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
テキストファイルの空行をスキ...
-
ノットイコールを教えて下さい
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム上のCPU稼働率低減に...
-
逆ポーランド記法における単項...
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
C言語:関数を使うメリットとデ...
-
Excel VBA データ削除の高速化
おすすめ情報