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

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

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

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

Q&A

解決済

2回答

656閲覧

Range(cells,cells).findの使い方

tatata1111

総合スコア9

VBA

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

0グッド

0クリップ

投稿2023/11/22 11:29

編集2023/11/22 11:33

実現したいこと

Q2に書いてある特定の文字列A(櫛引橋上流)の右にある4つのセル(R2,S2,T2,U2)に存在する数字を、L列を検索してAと一致する文字列が存在する全ての行のG列,H列,I列,J列にコピーする。
全ての行にコピーが終わったら同様に、Q3に書いてある特定の文字列B(剣吉)の右にある4つのセル(R3,S3,T3,U3)に存在する数字を、L列を検索してBと一致する文字列が存在する全ての行のG列,H列,I列,J列にコピーする。
これを自動で繰り返し行えるようにしたいです。

具体的には、既にG2,H2,I2,J2にR2,S2,T2,U2をコピーしてしてありますが、
G3,H3,I3,J3~G13,H13,I13,J13 / G15,H15,I15,J15 / G17,・・・
にもR2,S2,T2,U2をコピーし、それが完了したら
R3,S3,T3,U3を G14,H14,I14,J14 / G16,・・・ にコピーし、
次にR4,S4,T4,U4を・・・
ということを、繰り返し自動で行いたい、ということです。説明が下手で申し訳ありません・・・。
自動化の案をお持ちの方はご教授いただければ幸いです。よろしくお願いいたします。

イメージ説明

前提

ほぼ初心者です。
こちらのサイト様を参考にしてコードを考えてみたのですがエラーで動きませんでした。
https://vba-terakoya.com/get-cellnumber/

また、10000行程度あるため手動でコピーすることは断念しました。

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

アプリケーション定義またはオブジェクト定義のエラーです

該当のソースコード

Sub Sample2() Dim i As Long Dim k As Long Dim D As String, Memo As Long Dim buf As Long For i = 2 To 3 'data.csvの情報をそれぞれ D(日)、Memoに代入しておく D = Cells(i, 17) Memo1 = Cells(i, 18) Memo2 = Cells(i, 19) Memo3 = Cells(i, 20) Memo4 = Cells(i, 21) For k = 2 To 3 '表の日と合致する行を探してmemoの内容を転記する buf = ReturnCellNum(D) Cells(buf, 7) = Memo1 Cells(buf, 8) = Memo2 Cells(buf, 9) = Memo3 Cells(buf, 10) = Memo4 Next k Next i End Sub Function ReturnCellNum(Name As String) As Long Dim FoundCell As Variant Set FoundCell = Range(Cells(k, 12), Cells(3, 12)).Find(Name) If FoundCell Is Nothing Then MsgBox "見つかりませんでした" Else ReturnCellNum = FoundCell.Row End If

試したこと

Sub Sample2()
Dim i As Long
Dim k As Long
Dim D As String, Memo As Long
Dim buf As Long

For i = 2 To 3
'data.csvの情報をそれぞれ D(日)、Memoに代入しておく
D = Cells(i, 17)
Memo1 = Cells(i, 18)
Memo2 = Cells(i, 19)
Memo3 = Cells(i, 20)
Memo4 = Cells(i, 21)

’表の日と合致する行を探してmemoの内容を転記する
buf = ReturnCellNum(D)
Cells(buf, 7) = Memo1
Cells(buf, 8) = Memo2
Cells(buf, 9) = Memo3
Cells(buf, 10) = Memo4

Next i

End Sub

Function ReturnCellNum(Name As String) As Long

Dim FoundCell As Variant

Set FoundCell = Range("L1:L3").Find(Name)
If FoundCell Is Nothing Then
MsgBox "見つかりませんでした"
Else
ReturnCellNum = FoundCell.Row
End If

だと2行目にはコピーされるのですが、3行目にはコピーされずにループが終わってしまいます(その結果がスクショです)。

補足情報(FW/ツールのバージョンなど)

記載するコードには、動くかどうかのテストとしてループの数字から2 To 3にしてありますが、最終的には2 To 10000にしたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

FindFindnextを使う案
参考 Findメソッド(Find,FindNext,FindPrevious)|VBA入門 2023-11-23

VBA

1Private Sub Codetest022() 2 3Dim i As Long 4Dim D As String 5Dim buf As Long 6Dim FoundCell As Variant 7Dim FirstAddress As String 8Dim 検索範囲 As Range 9 10Set 検索範囲 = Range("L1:L19") 11 12For i = 2 To 12 13'data.csvの情報をそれぞれ D(日)、Memoに代入しておく 14D = Cells(i, 17) 15Memo1 = Cells(i, 18) 16Memo2 = Cells(i, 19) 17Memo3 = Cells(i, 20) 18Memo4 = Cells(i, 21) 19 20'表の日と合致する行を探してmemoの内容を転記する 21 Set FoundCell = 検索範囲.Find(D) 22 23 If Not FoundCell Is Nothing Then 24 FirstAddress = FoundCell.Address 25 buf = FoundCell.Row 26 27 Call Codetest022処理(buf, Memo1, Memo2, Memo3, Memo4) 28 29 Do 30 Set FoundCell = 検索範囲.FindNext(FoundCell) 31 32' Debug.Print FirstAddress & " / " & FoundCell.Address 33 If FoundCell Is Nothing Then Exit Do 34 If FoundCell.Address = FirstAddress Then Exit Do 35 36 buf = FoundCell.Row 37 38 Call Codetest022処理(buf, Memo1, Memo2, Memo3, Memo4) 39 40 DoEvents 41 Loop 42 End If 43Next i 44 45End Sub 46Private Sub Codetest022処理(buf As Long, Memo1 As Variant, Memo2 As Variant, Memo3 As Variant, Memo4 As Variant) 47 48 Cells(buf, 7) = Memo1 49 Cells(buf, 8) = Memo2 50 Cells(buf, 9) = Memo3 51 Cells(buf, 10) = Memo4 52 53End Sub

ディクショナリ、配列を使う案

VBA

1Private Sub Codetest019() 2 3Dim ディクショナリ As Object 4 Set ディクショナリ = CreateObject("Scripting.Dictionary") 5 6Dim 行 As Long 7Dim キー As String 8 9 With Workbooks("hoge").Worksheets("huga") 10 11 12 For 行 = 2 To .Cells(Rows.count, "Q").End(xlUp).Row 13 14' If Not ディクショナリ.exists(.Cells(行, "Q")) Then 15 On Error GoTo Error1 16 17 キー = .Cells(行, "Q").Value 18 ディクショナリ.Add キー, 行 19 20 On Error GoTo 0 21' End If 22 23 Next 24 25 26Dim コピー先配列() 27 ReDim コピー先配列(2 To .Cells(Rows.count, "L").End(xlUp).Row, 1 To 4) 28 29 For 行 = 2 To .Cells(Rows.count, "L").End(xlUp).Row 30 31 キー = .Cells(行, "L") 32 33 If ディクショナリ.exists(キー) Then 34 35 コピー先配列(行, 1) = .Cells(ディクショナリ.Item(キー), "R") 36 コピー先配列(行, 2) = .Cells(ディクショナリ.Item(キー), "S") 37 コピー先配列(行, 3) = .Cells(ディクショナリ.Item(キー), "T") 38 コピー先配列(行, 4) = .Cells(ディクショナリ.Item(キー), "U") 39 40 End If 41 42 Next 43 44 .Cells(2, "G").Resize(UBound(コピー先配列, 1) - 1, UBound(コピー先配列, 2)) = コピー先配列 45 46 End With 47 48 Exit Sub 49 50Error1: 51 MsgBox "列Qに重複があります。" 52 53 Stop 54 55End Sub

イメージ説明

投稿2023/11/23 01:44

編集2023/11/24 19:10
hawawa

総合スコア89

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

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

tatata1111

2023/11/23 04:21

ご回答いただきありがとうございました!ご教授いただいたコードで無事に動くことを確認できました。 元々の私のコードを活かした方法に加え、別の方法まで教えていただき大変勉強になりました。本当に助かりました!!
guest

0

以下のようにしてください。
L列の文字がQ列にない場合は、そこで停止します。

VBA

1Option Explicit 2 3 4Public Sub 転記() 5 Dim ws As Worksheet 6 Dim dicT As Object 7 Dim maxrow1 As Long 8 Dim maxrow2 As Long 9 Dim row1 As Long 10 Dim row2 As Long 11 Dim key As Variant 12 Set ws = ActiveSheet 13 Set dicT = CreateObject("Scripting.Dictionary") 14 maxrow1 = ws.Cells(rows.Count, "L").End(xlUp).Row 15 maxrow2 = ws.Cells(rows.Count, "Q").End(xlUp).Row 16 For row2 = 2 To maxrow2 17 key = ws.Cells(row2, "Q").Value 18 dicT(key) = row2 19 Next 20 For row1 = 2 To maxrow1 21 key = ws.Cells(row1, "L").Value 22 If dicT.exists(key) = False Then 23 MsgBox (key & "はQ列に存在しません") 24 ws.Activate 25 ws.Cells(row1, "L").Select 26 Exit Sub 27 End If 28 row2 = dicT(key) 29 ws.Cells(row1, "G").Resize(1, 4).Value = ws.Cells(row2, "R").Resize(1, 4).Value 30 Next 31 MsgBox ("完了") 32End Sub 33

投稿2023/11/22 23:48

tatsu99

総合スコア5533

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

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

tatata1111

2023/11/23 04:23 編集

ご回答いただきありがとうございました!ご教授いただいたコードで無事に動くことを確認できました。 また、全く知らないコードを教えていただいたため大変勉強になりました。本当に助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問