[[20190415134459]] 『アプリケーション定義またはオブジェクト定義のエ』(こまったちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『アプリケーション定義またはオブジェクト定義のエラーメッセージが表示されます』(こまったちゃん)

下記のVBAを作動すると、実行時エラーエラー1004「アプリケーション定義またはオブジェクト定義のエラーです」と表示され、Set dataTable = ThisWorkbook.Names("報告書一覧").RefersToRangeが黄色になります。いくら見直してもわかりません。VBA初心者です。ご教授お願い致します。

Sub 新規レコード転記()

    Dim formSheet As Worksheet, dataTable As Range
    Dim newRecordRange As Range, i As Long
    Dim addressList()

    '入力用のシートをセット
    Set formSheet = Sheets("報告書")
    '転記先の「社員テーブル」をセット
    Set dataTable = ThisWorkbook.Names("報告書一覧").RefersToRange

    '転記したいセルの位置を配列に格納
    addressList = Array("M7", "F13", "D13", "G5", "I5", "F7", "D19", "F19", "B5", "D16", "A25")
    '新規レコードの入力位置を取得
    Set newRecordRange = dataTable.Rows(1).Offset(dataTable.Rows.Count)
    '配列に指定した順番でレコードの値を転記
    For i = 0 To UBound(addressList)
        newRecordRange.Cells(1, i + 1).Value = formSheet.Range(addressList(i)).Value
    Next

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 ThisWorkbook.Names("報告書一覧").RefersToRange
 は
 ThisWorkbook.Worksheets("報告書一覧").RefersToRange
 か?
(ねむねむ) 2019/04/15(月) 13:55

Namesで指定していますが、”報告書一覧”という名前の範囲は存在しているのでしょうか?

また、”報告書一覧”が存在している場合、”報告書一覧”は定義された名前ですか?
それともテーブルですか?

どちらかわからない場合は、「名前の管理」画面で、名前の横に表示されるアイコンで確認できます。
参考:定義された名前とテーブルのアイコンの違いは、以下のサイトに画像があります。
https://hamachan4.exblog.jp/17408176/

(う) 2019/04/15(月) 16:01


 すまない。
 NamesをNameと勘違いしていた。
(ねむねむ) 2019/04/15(月) 13:55 は無視してくれ。
(ねむねむ) 2019/04/15(月) 16:14

 報告書一覧という名前はブックに対して作成されているのかシートに対して作成されているのかどちらだろうか?
 もし、シートに対して作成されていて、そのシートが一番左端(Worksheets(1)でない場合)エラーになるようだ。

(ねむねむ) 2019/04/15(月) 16:31


 もし、その場合は名前をブックに対して作成するか
 ThisWorkbook.Names("報告書一覧")
 を
 ThisWorkbook.Names("シート名!報告書一覧")
 としてみてくれ。
(ねむねむ) 2019/04/15(月) 16:32

 おっと、カッコの位置が。
 >そのシートが一番左端(Worksheets(1)でない場合)エラーになるようだ。
 は
 そのシートが一番左端(Worksheets(1))でない場合エラーになるようだ。
 で。

(ねむねむ) 2019/04/15(月) 16:38


ありがとうございます。
テーブルで定義していて、ブックに対して作成しています。
超初心者なので、念のためご指摘いただいたように、
「ThisWorkbook.Names("シート名!報告書一覧")」を入力しました。
コンパイルエラー「構文エラー」と表示されました。
再度ご教授お願い致します。

(こまったちゃん) 2019/04/15(月) 17:25


 >ThisWorkbook.Names("シート名!報告書一覧")
 とするのはシートに対して設定している場合。
 ブックに対してして設定しているのであれば私の指摘は的外れということになる。
(ねむねむ) 2019/04/15(月) 17:27

テーブルの場合、Namesでは指定できないようです。
ListObjectsで指定するようです。

ListObjects について調べてみてはいかがでしょうか。

なお、私はテーブルについて詳しくないので、ListObjectsで調べて分からない場合は、どなたかフォローをお願いします。
試してみたところ Set dataTable = Thisworkbook.worksheets(1).ListObjects("業務報告書").range 取得できましたが、これで正しいのかわかりません。。。。
(ワークシートは適当です。)

中途半端で、すみません。。。
(う) 2019/04/15(月) 17:40


> Set formSheet = Sheets("報告書")

↑は、Thisworkbookとは別のブックのシートですか
つまりThisworkbookがActiveでないとしたら、

これでは、だめですか?

 ThisWorkbook.Activate
 Set DataTable = Range("報告書一覧")

(マナ) 2019/04/15(月) 21:14


数々のアドレスありがとうございます。
Set dataTable = Thisworkbook.worksheets(1).ListObjects("業務報告書").range 形式で入力したところ
実行時エラー9「インデックスが有効範囲にありません」と表示されました。
また、もう一つのアドバイスですが、このプログラムは同一ブック上のものです。しかし、試しにSet dataTable = ThisWorkbook.Names("報告書一覧").RefersToRangeの前に「Thisworkbook.Activate]
を入力しましたが、同様のエラーが表示されました。

(こまったちゃん) 2019/04/16(火) 09:27


先のコメントの最初に書きましたが、テーブルの場合「Names」では取得できないようです。

「ワークシートは適当です」ともコメントしたのですが、テーブル「業務報告書」はworksheets(1)にあるのでしょうか?
worksheets(1)の部分は、テーブル「業務報告書」があるワークシートを指定してください、

また、マナさんのコメントで気づいたのですが、ワークシートを指定して範囲を取得するのであれば、ListObjectsは必要はなく、Rangeで十分だなと。。。。
Set dataTable = Thisworkbook.worksheets(1).Range("業務報告書")
※ワークシート(worksheets(1))は、テーブル「業務報告書」があるワークシートを指定してください。

ワークシート名を指定せずに、名前「業務報告書」のみで指定したいのであれば、マナさんの方法が良いかと思います。
マナさんの記述をよく見てください。
Namesは使用していません。

(う) 2019/04/16(火) 14:16


(う)さん、マナさん、ねむねむさんありがとうございます。
(う)のご指摘通り、マナさんの大事な一文理解できていませんでした。
マナさんのおっしゃる通りでした。思い通り動きました。
理解できず、本当にすいません。
(こまったちゃん) 2019/04/16(火) 14:30

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.