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

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

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

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

Q&A

解決済

1回答

1613閲覧

アプリケーション定義またはオブジェクト定義のエラーについて

doggyman10

総合スコア5

VBA

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

0グッド

0クリップ

投稿2021/06/09 08:18

現在も勉強の身で参考書やネット上の情報を参考にしながら
VBAを触れており、現在作成を試している最中で躓いた部分があるため、
僭越ながら有識者の知識をお借りしたく存じます。

現在作成しようとしていることは以下の通りです。
1.メインシート(sheets1)から条件別に対象者をサブシート(sheets2)へ抽出
2.サブシートにある追加ボタンをクリックし、列(項目固定)の追加
※inputbox で7月まで追加したい場合、7と入力すると7月分まで追加
※本来であれば6月まで既に追加されている場合は7月分のみ追加するようにするのが理想
3.一致するNameがあれば、Sheets1からSheet2へ項目別に転記
※3行目の日付がシート1にあるSTART(日付)より前・ END(日付)より後なら"-"表記

また私の知識的にまだ未熟な部分があるため、
上記の流れを1.2.3と分けて作成し、後から組み合わせる形で進めております。

▼今回の問題点:
流れ作業3の部分でマクロ実行時に
『アプリケーション定義またはオブジェクト定義のエラーです。』
とエラーが表示される

▼デバッグとなる箇所(黄色塗りつぶし)
.Sheets(2).Cells(j, k).Value = .Sheets(1).Cells(i, rownum).Value

rownum(一致する項目の列番号を取得)
この変数が原因に結び付けているのではないかと自分なりに試してみたものの進展がないため
作成する上での別のやり方やアドバイスがありましたら
ご教示頂けますと幸いです
sheets1
sheets2

VBA

1Sub 条件転記() 2 3 4 5Dim i As Long 6Dim j As Long 7Dim k As Long 8 9With ThisWorkbook 10 11For i = 4 To .Sheets(1).Cells(Rows.Count, "A").End(xlUp).Row 12For j = 5 To .Sheets(2).Cells(Rows.Count, "A").End(xlUp).Row 13For k = 5 To .Sheets(2).Cells(3, Columns.Count).End(xlToLeft).Column 14 15 16'対象日付比較 17'----------------------------------- 18'3 行目の日付がシート1にあるSTART(日付)より前OR END(日付)より後なら"-"表記 19'----------------------------------- 20 21'検索する項目の設定 22Dim word As String 23word = .Sheets(2).Cells(4, k) 24 25'一致した項目の列番号を取得 26Dim rownum As String 27rownum = .Sheets(1).Range("3:3").Find(What:=word).Column 28 29If .Sheets(1).Cells(i, "B").Value = .Sheets(2).Cells(j, "B").Value Then 30 .Sheets(2).Cells(j, k).Value = .Sheets(1).Cells(i, rownum).Value 31End If 32Next k 33Next j 34Next i 35 36End With 37 38End Sub

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

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

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

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

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

y_waiwai

2021/06/09 08:37

エラーが出たなら、エラーメッセージを提示しましょう
doggyman10

2021/06/09 08:41

書き込みありがとうございます。 エラーメッセージの記載に関して本文中にも記載してありますが、 分かりづらく申し訳ございません。 念のため、以下にて記載させていただきます。 エラー内容: 『アプリケーション定義またはオブジェクト定義のエラーです。』 ▼デバッグとなる箇所(黄色塗りつぶし) .Sheets(2).Cells(j, k).Value = .Sheets(1).Cells(i, rownum).Value
jinoji

2021/06/09 09:47

列番号用の変数なら名前はrownum ではなく columnnum とかがいいと思います。 FindがNotFoundというケースは考えなくてもいいですか?
doggyman10

2021/06/10 01:52 編集

jinojiさん ご指摘ありがとうございます! 確かに仰るように変数の宣言部分で誤解しそうな部分あったため、 修正させていただきました。 またNotFoundのケースについてですが、 当初はまず通常の処理が作動することを確認してから導入しようと考えておりました。 今回は列番号用(findの部分)を対象にNotfoundのケースを取り入れてみたのですが "オブジェクトが必要です"と表示されます。 恐らく列番号の宣言型が一致しないため(Long型)と思われるのですが、 この場合一旦別にObject型の変数を宣言しなければならないでしょうか? 9:09追記 一旦列番号の宣言(Long)とは別に一致する項目の検索(range)の宣言を追加し、 NotfoundのケースはRange、foundのケースはLongに分けて検討いたしました。 10:49追記 本件無事解決いたしました。
guest

回答1

0

ベストアンサー

Dim rownum As StringをStringではなく数値型(Long)で宣言してください。

vba

1Dim rownum As Long 2rownum = .Sheets(1).Range("3:3").Find(What:=word).Column 3 4If .Sheets(1).Cells(i, "B").Value = .Sheets(2).Cells(j, "B").Value Then 5 .Sheets(2).Cells(j, k).Value = .Sheets(1).Cells(i, rownum).Value 6End If

Cellsでセルを指定するときは、
Cells(1, 3)
というように列を数値型(Long)で指定するか、
文字列(String)で指定するときは、列名で指定します。
Cells(1, "C")

.Column は数値ですので数値型でないとエラーになります。
Cells(1, "3") 3などという列名はないので。

投稿2021/06/09 08:51

hatena19

総合スコア34075

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

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

doggyman10

2021/06/09 09:40

Hatena19さん ありがとうございます。 宣言型が誤っていたことからエラーが表示されていたのですね.. 勉強不足で基本的にStringやLongを使いまわしてたため、 今後は宣言型も注意するようにいたします。 結論、ご回答頂いた内容を踏まえて再度試したところエラー表示せずに転記されましたが、 ただ意図しない内容が転記されます。 こちら原因お分かりになりますでしょうか。 意図しない内容: 本文中図の場合、 Sheets2のE列(検索値:A)がSheets1のB列情報(本来Sheets1のE列) Sheets2のF列(検索値:D)がSheets1のD列情報(本来Sheets1のH列) Sheets2のG列(検索値:H)がSheets1のL列情報(本来通り) 少しrownumで取得した内容がズレているの可能性も否めないですが、 こちらの宣言型を変更したことによって他のコード部分も合わせて調整が必要でしょうか? 差支えなければご教示頂けますと幸いです。
hatena19

2021/06/10 00:46 編集

> こちらの宣言型を変更したことによって他のコード部分も合わせて調整が必要でしょうか? その可能性はほとんどないですね。コードのロジック自体がどこか間違っているのでしょう。 デバッグ作業ということをご存知でしょうか。 もし、コードが意図と異なる動作をする場合は、デバッグで問題点を見つけるという作業をします。例えば、下記に解説されてます。(VBA デバッグで検索すれば他にもいろいろ見つかるので調べてみてください。) VBA デバッグの仕方 それでどこに原因があるか突き止めてください。それでも分からないときに、どこでどのように意図通りに動作しないのか具体的に質問してください。 https://www.tipsfound.com/vba/01010
doggyman10

2021/06/10 01:54 編集

hatena19さん ありがとうございます! これまではデバッグ作業において変数がしっかり取得できているのかのチェックするぐらいしか 把握できていなかったのですが、今後はエラー発生時にどこに原因があるか突き止め、どこでどのように意図通りに動作していないか確認するようにいたします。 また今回質問させて頂いた内容については、 Findメソッドの引数(Lookat)が指定していないことで部分検索になっていたため 意図しない内容の転記がされていたようです。 お忙しい中ご丁寧に説明頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問