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

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

ただいまの
回答率

91.23%

  • VBA

    1183questions

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

  • Excel

    1016questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 110

minato_hy

score 32

前提・実現したいこと

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

発生している問題・エラーメッセージ

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

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

該当のソースコード

    '空のグラフ作成
    With ActiveSheet.ChartObjects.Add(ActiveCell.Left, ActiveCell.Top, GRAPH_WIDTH, GRAPH_HEIGHT).Chart
        .ChartType = xlLine '折れ線グラフ
        'データ系列作成
        '第1軸
        With .SeriesCollection.NewSeries
            .XValues = timeArray
            .Values = yFirstArray
            .Name = nameArray(1)
        End With

        '第2軸
        With .SeriesCollection.NewSeries
            .XValues = timeArray
            .Values = ySecondArray
            .Name = nameArray(2)
            .AxisGroup = xlSecondary '第2軸に
        End With
    End With

    'プロットエリアの内部サイズ揃える
    With ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Chart
        .Legend.Position = xlLegendPositionTop '凡例を上側に
        'Debug.Print .PlotArea.InsideWidth
        .PlotArea.InsideLeft = GRAPH_WIDTH * 0.05           '←エラー発生箇所
        .PlotArea.InsideTop = GRAPH_HEIGHT * 0.1
        .PlotArea.InsideWidth = GRAPH_WIDTH * 0.85
        .PlotArea.InsideHeight = GRAPH_HEIGHT * 0.85
    End With

試したこと

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

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

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

Windows10
Excel 2013

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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 15:43

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

    キャンセル

  • 2018/01/04 16:30

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

    キャンセル

  • 2018/01/04 16:40

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

    キャンセル

  • 2018/01/04 16:54

    根本原因とは違いますが、
    2013から ActiveSheet の挙動が少し変わったみたいなので、
    多用を避けたほうが無用なバグに悩まされる確率が低くなるかと。。。
    https://support.microsoft.com/ja-jp/help/2928902

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/04 15:43

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

    キャンセル

  • 2018/01/04 16:46

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

    キャンセル

  • 2018/01/04 16:49

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

    キャンセル

  • 2018/01/04 19:19

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

    キャンセル

  • 2018/01/04 23:27

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

    キャンセル

  • 2018/01/04 23:32

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

    キャンセル

  • 2018/01/05 17:31

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

    キャンセル

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

ただいまの回答率

91.23%

関連した質問

同じタグがついた質問を見る

  • VBA

    1183questions

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

  • Excel

    1016questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。