質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3448閲覧

VBAでグラフ作成時、Debug.Printを挿入しないと実行時エラーが発生する

minato_hy

総合スコア68

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/01/04 04:48

編集2018/01/04 11:06

###前提・実現したいこと
vbaでグラフを表示するコードを書いています。
しかし、空のグラフを作成して折れ線グラフを表示したあとに、プロットエリアの内部のサイズを設定しようとすると実行時エラーが発生します。
さらに、内部サイズ設定前に現在の内部サイズをイミディエイトウィンドウに表示するコードを1行挿入すると、実行時エラーは発生しなくなります。
このエラーの発生理由に心当たりのある方はいらっしゃいますでしょうか。

###発生している問題・エラーメッセージ
該当ソースコードの下部、.PlotArea.InsideLeftなどを設定するところで、以下のように実行時エラーが発生します。
しかし、それらを設定する前に、Debug.Print .PlotArea.InsideWidthのように内部サイズをイミディエイトウィンドウに表示させるコードを1行挿入すると、エラーが発生せずにコードを最後まで実行することができます。
また、この実行時エラーは第1軸のみのグラフを作成するときに発生するのですが、第1軸と第2軸も表示したグラフを作成した際には発生していないです。

実行時エラー'-2147467259 (80004005)' 'InsideLeft' メソッドは失敗しました: 'PlotArea'オブジェクト

###該当のソースコード

vba

1 '空のグラフ作成 2 With ActiveSheet.ChartObjects.Add(ActiveCell.Left, ActiveCell.Top, GRAPH_WIDTH, GRAPH_HEIGHT).Chart 3 .ChartType = xlLine '折れ線グラフ 4 'データ系列作成 5 '第1軸 6 With .SeriesCollection.NewSeries 7 .XValues = timeArray 8 .Values = yFirstArray 9 .Name = nameArray(1) 10 End With 11 12 '第2軸 13 With .SeriesCollection.NewSeries 14 .XValues = timeArray 15 .Values = ySecondArray 16 .Name = nameArray(2) 17 .AxisGroup = xlSecondary '第2軸に 18 End With 19 End With 20 21 'プロットエリアの内部サイズ揃える 22 With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart 23 .Legend.Position = xlLegendPositionTop '凡例を上側に 24 'Debug.Print .PlotArea.InsideWidth 25 .PlotArea.InsideLeft = GRAPH_WIDTH * 0.05 '←エラー発生箇所 26 .PlotArea.InsideTop = GRAPH_HEIGHT * 0.1 27 .PlotArea.InsideWidth = GRAPH_WIDTH * 0.85 28 .PlotArea.InsideHeight = GRAPH_HEIGHT * 0.85 29 End With

###試したこと
1.
エラー発生箇所辺りのDebug.Printのところで、代わりに.Activate.Selectを実行すると、実行時エラーは発生せず成功した。

ここのコードをエラー発生箇所辺りで実行して、内部エリアを破線で囲んだ図形を追加。
第1軸のみのグラフでは正しく内部エリアを囲む図形が描画された。
第2軸も存在するグラフでは描画されているはずの破線の図形が見当たらなかった。
実行時エラーは第1軸のみのグラフを作成するときに発生するが、これが関係あるかは不明。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10
Excel 2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

一旦処理を止めるとエラーが発生しないということは、処理が完了しないまま次の処置を行っているのでエラーが発生していると推測します。

自分もオブジェクト(特に図やシェイプ)を扱い時、このようなエラーに見舞われます。
そこで、苦肉の策で良く使用するのが、下のコードです。

ption Explicit #If Win64 Then Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongLong) #Else Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If '約 1秒 = 1000 です。 Private Sub test1() Sleep 256 End Sub

APIのSleep関数を利用します。
パソコンのスペックによって、どうしても動作結果がうまく行かない場合の逃げ策です。
スペックが低いパソコンほど、Sleep関数に渡す引数の数値を大きくします。

本来であれば、作成したオブジェクトが完全に作成されたかのチェックをするコードが欲しい所ですが、面倒なので、いつもこれで逃げています。
今回の場合、エラーが発生する前に、Sleep関数で時間を設けてはどうでしょうか?

投稿2018/02/03 01:07

kai_keitai

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Debug.Printの代わりにDoEventsを使用してみては如何でしょうか。

投稿2018/01/04 05:13

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minato_hy

2018/01/04 06:43

変わらず同じところで実行時エラーが発生します あと、根本的な解決になっていないので……
Zuishin

2018/01/04 07:46

根本的な解決法がわからないから色々試して原因を探る必要があるんじゃないですか? この方法で Print の役目がメッセージ処理かどうかを探っているんだと思いますよ。 結論を急ぎすぎです。
sazi

2018/01/04 07:49

では、Select またはActivateではどうでしょうか。 Debug.Printでオブジェクトにアクセスした場合にはエラーが出ないということのなので、他の命令でオブジェクトに同様にアクセスすればエラー回避されるのではないかという推測です。 因みに、以下は関係ないでしすよね? https://support.microsoft.com/ja-jp/help/983119/-run-time-error--2147467259-80004005-when-you-programmatically-set-a-p
minato_hy

2018/01/04 10:19

Chart変数chtに格納し、Debug.Printの場所にcht.Parent.Selectを追加すると成功します。 また、同じ場所に代わりにSheets("Sheet1").ActivateやActiveSheet.Selectを追加した場合も成功します……。 あとURLを拝見しました、状況が合致しないので関係なさそうです。
sazi

2018/01/04 14:27

VBAでは操作するオブジェクトがActiveで無い状態の場合にプロパティ設定をするとエラーとなるケースが度々みられます。 ただなぜActiveでない状態になることがあるかについての内部詳細は不明です。 基本VBAではイベントドリブンで処理されるので、状況によっては実行順序が変わる挙動となるのではないかと推測しています。 どうみてもバグだろうと思っても、not enoughで対応するMicrosoftだったので、根本的な解決方法が見いだせず、過去の経験では、このようなケースではDoEventsやSelect,SetFocusなどオブジェクトがActiveになるような処理を追記して対応していました。
sazi

2018/01/04 14:32

因みに、Debug.Printの代わりにブレークポイントを設定したデバッグでもエラーにならないのではないでしょうか。
minato_hy

2018/01/05 08:31

なるほど、仕様と考えるしかないのですね……ありがとうございました なお仰る通りデバッグでもエラー発生せず成功しました
guest

0

作成したChartObjectを変数に格納して処理してみては?

Dim Cht As ChartObject
Set Cht = ActiveSheet.ChartObjects.Add(ActiveCell.Left, ActiveCell.Top, GRAPH_WIDTH, GRAPH_HEIGHT).Chart

With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart
⇒ With Cht

投稿2018/01/04 04:57

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minato_hy

2018/01/04 06:43

ChartObjectではなくChartでした 変わらず同じところで実行時エラーが発生します
ExcelVBAer

2018/01/04 07:30

こちらの環境(Win7、Office2010)ではエラーが再現できないので、なんともですねぇ。 Win7 , Win10 、 2010 , 2013と記載されてますが、 ①Win7 x 2010 ②Win10 x 2013 の環境で起こってるということでしょうか?
minato_hy

2018/01/04 07:40

はい、その通りです ただすみません、win7×2010は、同じ実行時エラーが発生していたのがいつの間にかちゃんと実行されるようになっていたというあまり当てにならないものなので、いったん補足情報から削除します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問