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

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

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

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

Q&A

解決済

3回答

113780閲覧

VBA 実行時エラー ’1004’ アプリケーション定義またはオブジェクト定義のエラーです

1004

総合スコア74

VBA

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

0グッド

1クリップ

投稿2017/02/02 05:27

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
VBAでタスクをガントチャートに表示して管理するアプリを作っています。
「タスク1つにつきエクセル方眼紙3マスを背景赤着色、タスクとタスクの間には1マスを背景青着色」する機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ
「VBA 実行時エラー ’1004’ アプリケーション定義またはオブジェクト定義のエラーです」

###該当のソースコード ```VBA 'タスクを読み込み 'task_name(9) = task1 'task_name(10) = rest1 'task_name(11) =task2 'task_name(12) = rest2 'task_name(13) = task3 'task_name(14) = rest3 'task_name(15) = task4 Sub read_task() Dim task_name(15) Dim task_cnt As Integer Dim rest_cnt As Integer rest_cnt = 1 For task_cnt = 9 To 15 Step 2 task_name(task_cnt) = Cells(task_cnt, 3) MsgBox (task_name(task_cnt)) MsgBox (task_cnt) Next 'タスクの間に10分小休止を入れる For task_cnt = 10 To 15 Step 2 task_name(task_cnt) = "小休止" & rest_cnt rest_cnt = rest_cnt + 1 MsgBox (task_name(task_cnt)) MsgBox (task_cnt) Next End Sub 'ガントチャートで可視化 Sub gantt_chart() Dim project_name Dim gantt_num As Integer gantt_num = 1 project_name = Cells(7, 2) Worksheets("Sheet1").Cells(1, 1).Value = project_name 'セル着色【エラー箇所↓】 **Worksheets("Sheet1").Range(Cells(1, 2), Cells(1, 4)).Interior.Color = RGB(255, 0, 0)** 'セル着色【エラー箇所↑】 Worksheets("Sheet1").Cells(1, 5).Interior.Color = RGB(0, 0, 255) End Sub ###試したこと ①ステップイン実行でエラー箇所を特定し、1004エラーが掃かれる。 ②該当箇所を「sheet2(Sheet1)」に移して単独実行したところ、正常に実行された。 ![イメージ説明](9a573455076d25c091a91853e7908a9f.png) ③「Sheet1(To-Do リスト)」上でエラー箇所を別のサブプロシージャとして実行したところ、同じく1004エラーとなる。 ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報 【開発環境】 OS Windows8.1 Excel2013 VBAバージョン 7.1

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

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

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

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

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

guest

回答3

0

ベストアンサー

問題の箇所ですが「今アクティブになっているシートがどこか」によると思います

Worksheets("Sheet1").Range(Cells(1, 2), Cells(1, 4)).Interior.Color = RGB(255, 0, 0)

Cells(1, 2)はWorksheetの省略された記述ですので
もし"Sheet2"がアクティブだと

Worksheets("Sheet1").Range(Worksheets("Sheet2").Cells(1, 2), Worksheets("Sheet2").Cells(1, 4)).Interior.Color = RGB(255, 0, 0)

というように解釈され、Range指定として成立しません

投稿2017/02/02 05:55

takito

総合スコア3111

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

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

1004

2017/02/02 06:14

ご回答、ありがとうございます。 正解を提示していただき、とても助かりました。 いろいろ試してもバグが解消できない場合は、知識が足りていないということですね。。。 今回は、VBAの基本的な文法の理解不足が原因でした。 教えていただき、本当にありがとうございます。
guest

0

エラー原因

以下のサイトなど参考になると思います。
⇒参考サイト

RangeやCellsを使用する際、Sheet.Rangeのように対象シートを明示していればそのシートを対象に処理しますが、シートを明示しないで利用すると既定のシートを参照することになります。
この既定のシートとは、コードをどこに作成したかにも寄りますが、
①標準モジュールに記述した場合は処理時点でアクティブなシート
②シートモジュールに記載した場合はそのシート
を指すことになります。

このため、この関数を色付けしたいシートのシートモジュールとして作成していれば自動的に目的のシートが参照されますが、そうでない場合は意図せぬシートを参照することになります。

Rangeの方は対象シートを明示している為、Sheet2の範囲指定にSheet1のセルが指定されているような形になり、エラーが発生しているのだと思います。

対応方法

Excelでセル参照を行う場合、常に対象シートを意識するよう心がけましょう。
特に今回のように複数シートにまたがって情報を取得する場合は絶対明示すべきです。

これを踏まえて今回のコードを修正すると以下のようになります。

'ガントチャートで可視化 Sub gantt_chart() Dim shtRead as Worksheet Dim shtWrite as Worksheet Set shtRead = Worksheets("To-Do リスト") Set shtWrite = Worksheets("Sheet1") Dim project_name Dim gantt_num As Integer gantt_num = 1 project_name = shtRead.Cells(7, 2) shtWrite.Cells(1, 1).Value = project_name 'セル着色【エラー箇所↓】 shtWrite.Range(shtWrite.Cells(1, 2), shtWrite.Cells(1, 4)).Interior.Color = RGB(255, 0, 0) 'セル着色【エラー箇所↑】 shtWrite.Cells(1, 5).Interior.Color = RGB(0, 0, 255) End Sub

投稿前に解決済みでしたが、補足情報として参考になれば幸いです。

投稿2017/02/02 07:04

jawa

総合スコア3013

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

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

0

Worksheets("Sheet1")

ではなく、

Worksheets("To-Do リスト")

としてみたら如何でしょうか?

###追記
下記の様に、worksheetsを定義してあげると良いのではないでしょうか。

VBA

1Sub gantt_chart() 2Dim project_name 3Dim gantt_num As Integer 4'ここを追記 5Dim sheet1 As Worksheet 6Set sheet1 = Worksheets("sheet1") 7'ここを追記 8 9gantt_num = 1 10project_name = Cells(7, 2) 11Worksheets("Sheet1").Cells(1, 1).Value = project_name 12 13'セル着色【エラー箇所↓】 14'ここを変更 15sheet1.Range(Cells(1, 2), Cells(1, 4)).Interior.Color = RGB(255, 0, 0) 16'セル着色【エラー箇所↑】 17Worksheets("Sheet1").Cells(1, 5).Interior.Color = RGB(0, 0, 255) 18End Sub

投稿2017/02/02 05:43

編集2017/02/02 06:08
motuo

総合スコア3027

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

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

1004

2017/02/02 05:56

Worksheets("Sheet1")ではなく、Worksheets("To-Do リスト")としたら実行は通りますが、 着色したいシートはシート名:Sheet1 となります。
motuo

2017/02/02 06:08

なるほど。ちょっと勘違いしていました。回答を編集したのですが、そちらではどうでしょうか?
1004

2017/02/02 06:11

ご回答、ありがとうございました。 なんとか、解決することができました。 一口にVBAと言っても、バグ解消には様々な切り口があって面白いですね。
motuo

2017/02/02 06:14

解決してよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問