【動画24】の問題についてご教示願います(問題添付) データ転記先の表に該当する氏名が見つからない場合は、転記先表にエラーが出るようにプログラムを作成しました(下記参照) このプログラムを動かすと、D列に全てエラーが記載されてしまいます。 お忙しい中申し訳ありませんが、マッチングしていない氏名のみエラーが 出るにはどのようにしたら良いかご教示願います。 【回答1】 Sub test1() Dim saki Dim moto
For moto = 4 To 31 For saki = 4 To 31
If Worksheets("転記先").Range("B" & saki).Value = Worksheets("元データ").Range("B" & moto).Value Then Worksheets("転記先").Range("C" & saki).Value = Worksheets("元データ").Range("C" & moto).Value
If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value Else 'Worksheets("転記先").Range("D" & saki).Value = "エラー" End If Next Next
Sub test0004()
'変数kouで「鉄筋/5F部分/6階建」で1つ目のスラッシュを確認
Dim kou
'変数takasaで「鉄筋/5F部分/6階建」で2つ目のスラッシュを確認
Dim takasa
'変数kaiで「鉄筋/5F部分/6階建」で真ん中の「階」の部分を確認
Dim kai
'変数iで繰り返し処理
Dim i
For i = 2 To 51
kou = InStr(Range("D" & i), "/")
takasa = InStr(kou + 1, Range("D" & i), "/")
kai = Mid(Range("D" & i), kou + 1, takasa - kou - 1)
Range("J" & i) = Left(Range("D" & i), kou - 1)
Range("L" & i) = Mid(Range("D" & i), takasa + 1)
Range("K" & i) = kai
Next
End Sub
今回のプログラムもこれ↓です。
Sub test2()
Dim saki
Dim moto
For moto = 4 To 31
For saki = 4 To 31
If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
Else
Worksheets("転記先").Range("D" & saki).Value = "エラー"
End If
Next
Next
End Sub
Sub test2_ogawa()
Dim saki
Dim moto
For moto = 4 To 31
For saki = 4 To 31
If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
Else
Worksheets("転記先").Range("D" & saki).Value = "エラー"
End If
Next
Next
End Sub
受講生さんの投稿
(投稿ID: 3184) 添付ファイルのダウンロード権限がありません
データ転記先の表に該当する氏名が見つからない場合は、転記先表にエラーが出るようにプログラムを作成しました(下記参照)
このプログラムを動かすと、D列に全てエラーが記載されてしまいます。
お忙しい中申し訳ありませんが、マッチングしていない氏名のみエラーが
出るにはどのようにしたら良いかご教示願います。
【回答1】
Sub test1()
Dim saki
Dim moto
For moto = 4 To 31
For saki = 4 To 31
If Worksheets("転記先").Range("B" & saki).Value = Worksheets("元データ").Range("B" & moto).Value Then
Worksheets("転記先").Range("C" & saki).Value = Worksheets("元データ").Range("C" & moto).Value
ElseIf Worksheets("転記先").Range("B" & saki).Value <> Worksheets("元データ").Range("B" & moto).Value Then
Worksheets("転記先").Range("D" & saki).Value = "エラー"
End If
Next
【回答2】
Sub test2()
Dim saki
Dim moto
For moto = 4 To 31
For saki = 4 To 31
If Worksheets("転記先").Cells(saki, 2).Value = Worksheets("元データ").Cells(moto, 2).Value Then
Worksheets("転記先").Cells(saki, 3).Value = Worksheets("元データ").Cells(moto, 3).Value
Else
'Worksheets("転記先").Range("D" & saki).Value = "エラー"
End If
Next
Next
End Sub
小川慶一さんのコメント
(コメントID: 4634)
>このプログラムを動かすと、D列に全てエラーが記載されてしまいます。
>マッチングしていない氏名のみエラーが出るにはどのようにしたら良いかご教示願います。
「どのようにしたら良いか」ということであれば、まずは、インデントのきちんとされたプログラムを書くことです。
それができれば、自力で問題を解決できるようになるでしょう。
前回ご質問いただいたときの添付ファイルにあった以下のプログラムでもそうでしたが
今回のプログラムもこれ↓です。
これでは問題解決を自分でできなくて当然です。
インデントされてないプログラムでは、本人も問題を見つけられません。
テストをするにも大変です。
ということなので、以下の練習問題から、きちんとインデントされたプログラムを書くことを意識して全問解き直されることをお勧めします。
「If文とForNext構文を組み合わせる」
https://forum.pc5bai.com/lesson/page/141
以下を徹底してください。「ハナコのステップ」にしたがって動画で解説しているとおりにプログラムを書いていれば自然にこうなります。
[1] sub ... end sub の中身は4文字分右へ
[2] for ... next や if ... else ... end if の中身は4も自分右へ
「If文とForNext構文を組み合わせる」から順に問題を解いていって、上記の説明と動画解説だけでは理解できないところがあったら、質問してください。
↑
このままインデントされてないプログラムでゴリ押ししても、いずれもっと複雑な課題にトライしようとしても行き詰まるだけです。
難易度の高い問題を自力で解けるようになるには、基礎がしっかりしている必要があります。
数学で言えば、計算問題を早く正確に解けて、簡単な文章題が解けて、はじめて、難しい文章題が解けるようになるものです。
計算問題や簡単な文章題で足腰をしっかり鍛えないと、難しい文章題にチャレンジしようとしても必ず足元をすくわれます。
マクロもそれと同じです。簡単なマクロを書き上げるときの基本パターンをしっかり身につけていないと、難しいマクロを書こうとしても書きあげられません。
ということで、ここまで、嫌がらせではなくて、本当にそう思って書いていますので、ご理解いただければと思います。
とはいえ、今回だけは、いただいた質問そのものについても回答さしあげますね。
お送りいただいたプログラムを僕のほうで手直ししました。
以下のとおり。
↑
この状態にしてから、 [F8] でステップイン実行を30回くらいすれば何が起きているのか?十分に理解できることでしょう。
変数の値をプログラム実行中に確認するには、「自動データヒント」機能を利用できましたね。不審に思ったことがあったら、ステップインモードでのプログラム実行中に、変数 moto や変数 saki の値を確認しましょう。