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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

1304閲覧

VBAのエラー解消方法について

Rinriinrinrin

総合スコア13

VBA

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2021/02/17 08:22

編集2021/02/17 08:29

マクロを使用して下記繰り返し作業を自動化することを考えています。
条件
0. 契約日~解約日まで1が月ごとに'別シート'に元シートのA2~AB2値を自動にコピー&ペースト
0. A3~AB3の場合も同様に契約日~解約日(解約日の値がない場合は今日まで繰り返す)まで1カ月ごとに'別シート'にレコード自動作成を繰り返す
例えばA2の場合2013/8,2013/9/,2013/10,2013/11...2021/2の様に契約日~今日まで1が月ごとに'別シート'に契約レコード自動作成

下記VBAを実装した所、添付画像の通りエラーが発生しておりエラーの解決方法についてご教示いただけますと幸いです。
元シート
イメージ説明
発生したエラー
イメージ説明
デバッグ結果
イメージ説明

コード

VBA

1Sub Sample2() 2 Dim moto As Worksheet 3 Dim lastRow, i 4 Set moto = Sheets("元シート") 5 lastRow = moto.Cells(Rows.Count, 2).End(xlUp).Row 6 Dim saki As Worksheet, outRow As Long 7 Set saki = Sheets.Add(, moto) 8 moto.Range("A1:AB1").Copy saki.Range("A1:AB1") 9 outRow = 2 10 For i = 2 To lastRow 11 Dim startDate As Date 12 Dim endDate As Date 13 Dim repeatCount As Long 14 startDate = moto.Cells(i, 4) 15 If IsEmpty(moto.Cells(i, 5)) Then 16 endDate = Date 17 Else 18 endDate = moto.Cells(i, 2) 19 End If 20 repeatCount = DateDiff("m", startDate, endDate) 21 Dim j As Long 22 For j = 0 To repeatCount 23 saki.Cells(outRow, 1) = DateAdd("m", j, moto.Cells(i, 1)) 24 saki.Cells(outRow, 2) = moto.Cells(i, 2) 25 saki.Cells(outRow, 3) = moto.Cells(i, 3) 26 saki.Cells(outRow, 4) = moto.Cells(i, 4) 27 saki.Cells(outRow, 5) = moto.Cells(i, 5) 28 saki.Cells(outRow, 6) = moto.Cells(i, 6) 29 saki.Cells(outRow, 7) = moto.Cells(i, 7) 30 saki.Cells(outRow, 8) = moto.Cells(i, 8) 31 saki.Cells(outRow, 9) = moto.Cells(i, 9) 32 saki.Cells(outRow, 10) = moto.Cells(i, 10) 33 saki.Cells(outRow, 11) = moto.Cells(i, 11) 34 saki.Cells(outRow, 12) = moto.Cells(i, 12) 35 saki.Cells(outRow, 13) = moto.Cells(i, 13) 36 saki.Cells(outRow, 14) = moto.Cells(i, 14) 37 saki.Cells(outRow, 15) = moto.Cells(i, 15) 38 saki.Cells(outRow, 16) = moto.Cells(i, 16) 39 saki.Cells(outRow, 17) = moto.Cells(i, 17) 40 saki.Cells(outRow, 18) = moto.Cells(i, 18) 41 saki.Cells(outRow, 19) = moto.Cells(i, 19) 42 saki.Cells(outRow, 20) = moto.Cells(i, 20) 43 saki.Cells(outRow, 21) = moto.Cells(i, 21) 44 saki.Cells(outRow, 22) = moto.Cells(i, 22) 45 saki.Cells(outRow, 23) = moto.Cells(i, 23) 46 outRow = outRow + 1 47 Next 48 Next 49 With saki.UsedRange 50 .EntireColumn.AutoFit 51 End With 52End Sub```

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

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

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

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

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

guest

回答3

0

エラーが発生しているこの部分について。

vba

1 If IsEmpty(moto.Cells(i, 5)) Then 2 endDate = Date 3 Else 4 endDate = moto.Cells(i, 2) 5 End If

ターゲットの行の5列目のセル(解約日)が空の場合は現在日時、そうでない場合は2列目のセル(ID)をendDateにセットしているプログラムに読めます。
VBAはある程度の自動変換機能があるので日付っぽい文字列は自動的に日付に変換されますが、この4行目に入っているIDはどう頑張っても日付に変換することができない文字列なので「(String型とDate型で)型が一致しない」というエラーが発生します。

そもそも実行したい処理とコードが大きく異なっている気もします。設計から見直してみましょう。

投稿2021/02/17 09:41

hope_mucci

総合スコア4447

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

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

0

ベストアンサー

デバッグするときには、
イミディエイトウィンドウか、エラーが起きる直前の行で、
Debug.Print moto.Cells(i, 2)
みたいにして確認していきましょう。

答えを言うと、
エラーが出ているのは、

契約日~解約日(解約日の値がない場合は今日まで繰り返す

の部分。

VBA

1 If IsEmpty(moto.Cells(i, 5)) Then '解約日の値がない場合は 2 endDate = Date 'endDate(月数を計算するための変数)に「今日」を入れる 3 Else 'そうでなければ 4 endDate = moto.Cells(i, 2) 'endDate(月数を計算するための変数)に「解約日の値」を入れる 5 End If

正しくはmoto.Cells(i, 5)だと思います。
最初の質問のときとレイアウトが変わっているのに追随できていない

投稿2021/02/17 08:42

jinoji

総合スコア4585

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

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

Rinriinrinrin

2021/02/17 09:09

jinojiさんご回答ありがとうございます! アドバイスいただいた通り、下記値を修正した所エラー解決いたしました! endDate = moto.Cells(i, 2) → endDate = moto.Cells(i, 5) ご指導いつもありがとうございます!!! またデバッグする際の手順についてのアドバイスありがとうございます。 今後エラーが起きる直前の行で、Debug.Print moto.Cells(i, 2)の様に確認していきます! 今後ともよろしくお願いいたします。
guest

0

変数endDateがDate型で宣言されていますが、moto.Cels(i,2)は元シートの2列目、つまりB列のIDを見ています。そのため、「Date型にこの文字列は入らないよ」とVBAに怒られています。

おそらくですが、ここはmoto.Cells(i,1)の間違いではないですか?

投稿2021/02/17 08:37

Usirow

総合スコア364

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問