dポイントプレゼントキャンペーン実施中!

当方、VBA初心者です、よろしくお願いいたします。

EXEL2000で動作していたVBAマクロが2003では動作、2007、2010では
以下のエラーが発生して動作しません。
「実行時エラー1004、アプリケーション定義またはオブジェクト定義のエラーです」

マクロ自体はワークシートにグラフを書くものです。
Dim cho As ChartObject, rng As Range

エラー箇所の記述は以下の部分です。

Set cho = ws.ChartObjects.Add( _
ws.Range("B4").Left, _
ws.Range("B4").Top, _
ws.Range("B4:AB4").Width, _
ws.Range("B4:B13").Height)

バージョンアップの仕様変更で記述が変わったと言うことでしょうか?

そうだとしたらあわせて何がどう変わったのか、解説されてるサイトとか
ご存じでしたらお知らせください。

以上よろしくご教授のほどお願いいたします。

A 回答 (3件)

>Dim 宣言をカンマで記述せず、1行ずつにバラさないとだめって事でしょうか?


いやそんな事はないです。そこは私の個人的な拘りの部分なんで全く関係ないです。
実際、コードには問題ありませんからシート状態などの環境をチェックしてみてください。
まずは、シートに保護がかかっていないか。
2000の場合でもシート&オブジェクトに保護がかかっていればエラーになります。

保護がかかっていなければ、念のためVBEメニュー[ツール]-[参照設定]で参照不可の項目がないか、
確認してみてください。

この回答への補足

お忙しいところご回答頂きありがとうございます。

ご指摘のとおり、シートに保護がかかっておりました。

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の仕様変更によりシートが保護されている状態では
マクロからでもグラフの描画を規制していると言うことでしょうか?


シートはやはり画面からいじられたくないので保護をかけたいと思います。
マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に
保護を設定する・・・・

とするしかないですかねぇ・・

補足日時:2011/08/10 22:46
    • good
    • 0

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メソッドでの扱いも変わったのでしょうか。
深く検証したわけではないので詳しくは解らないですけど。

>マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に
>保護を設定する・・・・
>とするしかないですかねぇ・・
それが無難なようです。
    • good
    • 0
この回答へのお礼

end-u 様

お忙しいところ、いろいろ検証して頂きありがとうございました。

バージョンに伴いエラーが出たりでなかったり、または
エラーの種類が違うようですね。
これはもうMS社お得意の バグ という一言に尽きそうな気がします(笑

マクロソースを各バージョンで問題なく動かすために、結局
新旧バージョンを保存し実行できる環境を備えておくとか
使えるはずの命令が使えないためにソースを書き換えなければ
ならないとか、開発側はそういう所に神経使いたくないですよね。

せめて「古いバージョンでは動きません」だとか、この命令は
こういう感じでバージョンにより挙動が変わります だとか
一覧表を親切にアナウンスしてくれるとか
こだわりを持って販売して欲しいものです。

大変助かりました、また壁にぶち当たったときはよろしくご指導ください。
m(__)m

お礼日時:2011/08/12 13:54

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 以降のオブジェクト モデルの変更

この回答への補足

早速のご回答ありがとうございました。

記述的には ※記してご指摘された要素も記述してあります。

関係部分の記述的には

 |'省略
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行ずつにバラさないとだめって事でしょうか?

補足日時:2011/08/10 13:50
    • good
    • 0

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