
当方、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)
バージョンアップの仕様変更で記述が変わったと言うことでしょうか?
そうだとしたらあわせて何がどう変わったのか、解説されてるサイトとか
ご存じでしたらお知らせください。
以上よろしくご教授のほどお願いいたします。
No.2ベストアンサー
- 回答日時:
>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の仕様変更によりシートが保護されている状態では
マクロからでもグラフの描画を規制していると言うことでしょうか?
シートはやはり画面からいじられたくないので保護をかけたいと思います。
マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に
保護を設定する・・・・
とするしかないですかねぇ・・
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メソッドでの扱いも変わったのでしょうか。
深く検証したわけではないので詳しくは解らないですけど。
>マクロから描画前にシート保護を解除して、グラフを描画、描き終えたら最後に
>保護を設定する・・・・
>とするしかないですかねぇ・・
それが無難なようです。
end-u 様
お忙しいところ、いろいろ検証して頂きありがとうございました。
バージョンに伴いエラーが出たりでなかったり、または
エラーの種類が違うようですね。
これはもうMS社お得意の バグ という一言に尽きそうな気がします(笑
マクロソースを各バージョンで問題なく動かすために、結局
新旧バージョンを保存し実行できる環境を備えておくとか
使えるはずの命令が使えないためにソースを書き換えなければ
ならないとか、開発側はそういう所に神経使いたくないですよね。
せめて「古いバージョンでは動きません」だとか、この命令は
こういう感じでバージョンにより挙動が変わります だとか
一覧表を親切にアナウンスしてくれるとか
こだわりを持って販売して欲しいものです。
大変助かりました、また壁にぶち当たったときはよろしくご指導ください。
m(__)m
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 以降のオブジェクト モデルの変更
この回答への補足
早速のご回答ありがとうございました。
記述的には ※記してご指摘された要素も記述してあります。
関係部分の記述的には
|'省略
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
テキストボックス中の文字列の...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
エクセルのVBAの標準モジュール...
-
ASP レコードセットしたオブジ...
-
VBAで Set wb = Sheets(1).Cop...
-
VBAで既に開いている別アプリケ...
-
EXCEL VBA オートシェイプナン...
-
エクセルVBAで配列内に空白デー...
-
VBScriptからDLL参照設定したい
-
[VBA]CDOメッセージ送信エラー
-
Excel VBAでWordの複数ファイル...
-
CreateObjectとGetObjectの違い
-
ExcelVBAでのNZ関数について
-
Excel2007 VBA ラジオボタン Ca...
-
VBAについてです。 初心者です...
-
VBで引数にDictionaryオブジェ...
-
VBAからPDFファイルにパスワー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
EXCEL VBA オートシェイプナン...
-
VBAで Set wb = Sheets(1).Cop...
-
ExcelVBAでのNZ関数について
-
[VBA]CDOメッセージ送信エラー
-
VBAからPDFファイルにパスワー...
-
エクセルVBAでcode128のバー...
-
VBScriptからDLL参照設定したい
-
VBAについてです。 初心者です...
-
エクセルマクロエラー「'Cells'...
-
オブジェクトが見つかりません
-
エクセルVBAで配列内に空白デー...
-
Excel VBAでWordの複数ファイル...
-
VBScriptでファイルの日時順(降...
おすすめ情報