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

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

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

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

1564閲覧

VBA セルの検索と条件分岐による転記

jabe

総合スコア43

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/03/08 05:35

編集2020/03/08 11:29

前提・実現したいこと

現在、VBAにてexcel業務を効率化出来る様に、勉強をし始めました。
恥ずかしながら、制御構文を使いこなせてない為、アドバイスを頂きたいと考えています。よろしくお願いします。![![イメージ説明f341c36f32e969a535337b14c85d87cd.jpeg)

sheet2のセルC2値に対して、sheet1のB4〜B列最終行まで検索を行い、以下条件を処理を行う。
・完全合致した場合は、sheet1のB4〜B列の該当セルへ上書きを実施。
・合致しない場合は、sheet1のB4〜B列の最終入力済セルの次行(空白)へ転記。

発生している問題・エラーメッセージ

該当のソースコード

VBA

1Sub 検索転記() 2Dim number As Range '入力値 3Dim result As Range '検索結果 4Dim lastline As Long '最終行 5Dim ws1 As Worksheet 6Dim ws2 As Worksheet 7 8Set ws1 = Worksheets("sheet1") 9Set ws2 = Worksheets("sheet2") 10Set number = ws2.Range("C2") 11 12lastline = ws1.Cells(Rows.Count, "B").End(xlUp).Row 13 14For i = 4 To lastline 15Set result = ws1.Range("B" & i).Find(number, lookat:=xlWhole) 16 17If result Is Nothing Then 'Rangeが「Nothing」である場合 18 n = Cells(Rows.Count, "B").End(xlUp).Row + 1 19 ws1.Range("B" & n).Value = number.Value 20 21ElseIf Not result Is Nothing Then 22 ws1.Range("B" & i).Value = number.Value 23 24End If 25 26Next i 27 28End Sub 29

試したこと

if、for文にて作成したのですが、合致しない場合への情報分岐と合致した場合の上書きがどのようなロジックを立てて作成したらよいか分からない為、アドバイスをいただきたいです。

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

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

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

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

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

yureighost

2020/03/08 07:35

今のコードを実行して、自分で何が問題だとかの疑問はありましたか? そういったことを書いてくださると回答しやすいです。
jabe

2020/03/08 11:43

連絡ありがとうございます。 自分の中では、該当セルが無い場合にif文にてどのよに分岐をしていけばよいのかロジックが分からず、そこが問題だと思っています。
guest

回答1

0

ベストアンサー

把握しておられるかわかりませんが、Excelのシートの例に貼られてる画像の状態で、
現在の処理で動作させると、No欄に大量の1が書き込まれてしまいます。
これはFor文で行数分検索チェックしているからで、そこが根本的に勘違いされてるところだと思います。
Find関数は複数のセルを範囲指定して検索できますのでそれを使います。
多分これでご要望にある動作はできてると思います。
修正した部分にはコメントを入れさせてもらいましたので確認してみてください。

VBA

1Sub 検索転記() 2 Dim number As Range '入力値 3 Dim result As Range '検索結果 4 Dim lastline As Long '最終行 5 Dim ws1 As Worksheet 6 Dim ws2 As Worksheet 7 8 Set ws1 = Worksheets("sheet1") 9 Set ws2 = Worksheets("sheet2") 10 Set number = ws2.Range("C2") 11 12 lastline = ws1.Cells(Rows.Count, "B").End(xlUp).Row 13 14 'No列の開始行から最終行の範囲で検索する 15 Set result = ws1.Range(ws1.Cells(4, 2), ws1.Cells(lastline, 2)).Find(number, lookat:=xlWhole) 16 17 'For文は不要 18 19 If result Is Nothing Then 'Rangeが「Nothing」である場合 20 n = Cells(Rows.Count, "B").End(xlUp).Row + 1 21 ws1.Range("B" & n).Value = number.Value 22 23 ElseIf Not result Is Nothing Then 24 'Findの結果で取得されたRangeから行数を取得し、その行に書き込む 25 ws1.Cells(result.Row, 2).Value = number.Value 26 27 End If 28End Sub

投稿2020/03/08 12:09

yureighost

総合スコア2183

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

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

jabe

2020/03/08 12:38

早速の連絡とコードありがとうございます。 実現したい内容通りに動作できました。 はい、大量の1が書き込まれていました。 アドバイスの通り、Find関数の考え方が誤っていました。 また、コード自体(rangeではなく、cellsを使用しているところも)も分かりやすく勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問