• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXEL2000のマクロが2010でエラーになる)

EXEL2000のマクロが2010でエラーになる

このQ&Aのポイント
  • EXEL2000で動作していたVBAマクロが2003では動作、2007、2010では「実行時エラー1004、アプリケーション定義またはオブジェクト定義のエラーです」というエラーが発生して動作しません。
  • マクロ自体はワークシートにグラフを書くものです。バージョンアップの仕様変更で記述が変わった可能性があります。
  • 詳細な仕様変更や解決策については、情報が掲載されているサイトやフォーラムを参照することをおすすめします。

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

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

>Dim 宣言をカンマで記述せず、1行ずつにバラさないとだめって事でしょうか? いやそんな事はないです。そこは私の個人的な拘りの部分なんで全く関係ないです。 実際、コードには問題ありませんからシート状態などの環境をチェックしてみてください。 まずは、シートに保護がかかっていないか。 2000の場合でもシート&オブジェクトに保護がかかっていればエラーになります。 保護がかかっていなければ、念のためVBEメニュー[ツール]-[参照設定]で参照不可の項目がないか、 確認してみてください。

tail_of_god
質問者

補足

お忙しいところご回答頂きありがとうございます。 ご指摘のとおり、シートに保護がかかっておりました。 ThisWorkbook に以下のコードがありまして、オープンするたびに シートに保護がかかるようでした。 Private Sub Workbook_Open() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.Protect userinterfaceonly:=True Next End Sub そこで、ワークシート保護を解除すると、マクロでのグラフ描画が可能となりました。 ありがとうございました。 ただ、腑に落ちないのは2000や2003ではシートを保護したままでも 質問文のとおりマクロによるグラフ描画が出来ておりまして、 ↑マクロでファイルオープン時に保護をかけていたとしても Protectメソッドで userinterfaceonly:=True  を指定してあるのであれば画面上からの変更は保護されるでしょうが、 マクロからの変更は保護されず、グラフ描画は可能になるはずでは ないのではないでしょうか? だとしたら、やはり2010の仕様変更によりシートが保護されている状態では マクロからでもグラフの描画を規制していると言うことでしょうか? シートはやはり画面からいじられたくないので保護をかけたいと思います。 マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に 保護を設定する・・・・ とするしかないですかねぇ・・

すると、全ての回答が全文表示されます。

その他の回答 (2)

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

winXPの混在環境でのテストですが Sub try()   '97-2003,2007,2010   On Error GoTo Errlog   With Sheets.Add 1:   .Protect userinterfaceonly:=True 2:   .Cells(1).Value = 1 3:   .Ovals.Add 0, 100, 100, 100           'ok,ok,ok 4:   .Shapes.AddShape msoShapeOval, 0, 200, 100, 100 'ng,ok,ok 5:   .ChartObjects.Add 0, 300, 100, 100        'ok,ng,ng 6:   .Shapes(.Shapes.Count).Delete          'ng,ng,ok 7:   .DrawingObjects(.DrawingObjects.Count).Delete  'ok,ng,ok   End With   Exit Sub Errlog:   With Err     Debug.Print Erl, .Number, .Description     Resume Next   End With End Sub [97-2003] 4 1004 アプリケーション定義またはオブジェクト定義のエラーです。 6 1004 アプリケーション定義またはオブジェクト定義のエラーです。 [2007] 5 1004 アプリケーション定義またはオブジェクト定義のエラーです。 6 -2147024809 指定された値は境界を超えています。 7 1004 Oval クラスの Delete メソッドが失敗しました。 [2010] 5 1004 アプリケーション定義またはオブジェクト定義のエラーです。 こんな結果です。2007と2010でも挙動が違うようですね。 Shape関係の仕様変更に伴ってProtectメソッドでの扱いも変わったのでしょうか。 深く検証したわけではないので詳しくは解らないですけど。 >マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に >保護を設定する・・・・ >とするしかないですかねぇ・・ それが無難なようです。

tail_of_god
質問者

お礼

end-u 様 お忙しいところ、いろいろ検証して頂きありがとうございました。 バージョンに伴いエラーが出たりでなかったり、または エラーの種類が違うようですね。 これはもうMS社お得意の バグ という一言に尽きそうな気がします(笑 マクロソースを各バージョンで問題なく動かすために、結局 新旧バージョンを保存し実行できる環境を備えておくとか 使えるはずの命令が使えないためにソースを書き換えなければ ならないとか、開発側はそういう所に神経使いたくないですよね。 せめて「古いバージョンでは動きません」だとか、この命令は こういう感じでバージョンにより挙動が変わります だとか 一覧表を親切にアナウンスしてくれるとか こだわりを持って販売して欲しいものです。 大変助かりました、また壁にぶち当たったときはよろしくご指導ください。 m(__)m

すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

Dim cho As ChartObject Dim rng As Range Dim ws As Worksheet '※ Set ws = ActiveSheet '※ 'エラー箇所の記述は以下の部分です。 Set cho = ws.ChartObjects.Add( _      ws.Range("B4").Left, _      ws.Range("B4").Top, _      ws.Range("B4:AB4").Width, _      ws.Range("B4:B13").Height) 2010でも問題なく実行できます。 ※箇所は大丈夫ですか? >何がどう変わったのか、解説されてるサイトとか.. VBAのヘルプを見るのが良いでしょう。 Excel 2010 開発者用リファレンス ヘルプ └Excel 2010 開発者用リファレンス  └新機能   └Excel 2010 の開発者向け新機能記事   └新しいオブジェクト、コレクション、および列挙記事   └新しいメンバーと定数記事   └Microsoft Office 2007 以降のオブジェクト モデルの変更記事   └Microsoft Office 2003 以降のオブジェクト モデルの変更記事   └Microsoft Office XP (2000) 以降のオブジェクト モデルの変更記事   └Microsoft Office 2000 以降のオブジェクト モデルの変更

tail_of_god
質問者

補足

早速のご回答ありがとうございました。 記述的には ※記してご指摘された要素も記述してあります。 関係部分の記述的には  |'省略 Dim ws As Worksheet, rngX As Range, rngY As Range Dim cho As ChartObject, rng As Range  |'省略 Set ws = ActiveSheet  |'省略 Set rngX = ws.Range("D33:AA33") Set rngY = ws.Range("D35:AA35")  |'省略 If (Application.WorksheetFunction.Count(rngY) > 0) Then Set cho = ws.ChartObjects.Add( _ ←× ws.Range("B4").Left, _       ←× ws.Range("B4").Top, _        ←× ws.Range("B4:AB4").Width, _    ←× ws.Range("B4:B13").Height)     ←× Set ch = cho.Chart  |'省略 End If ←× の部分でエラーが発生します。 EXEL2000で作成したxlsファイルに記述されたマクロです。 このファイルを2007、2010でマクロを有効にして開き、実行すると 表記部分で'1004'エラーが発生するという感じです。 Dim 宣言をカンマで記述せず、1行ずつにバラさないとだめって事でしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A