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

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

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

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

Q&A

解決済

2回答

2526閲覧

VBA Find After 引数の使い方

hajihaji

総合スコア18

VBA

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

0グッド

0クリップ

投稿2021/12/21 01:15

編集2021/12/21 01:18

ひとつのブック内に同じフォームのシートが複数あり、該当するセル(【】で囲まれた値)があればをSheet1に抽出できるものを作っています。
しかし最初に該当したセルの次から検索がかかり、最初に該当したセルの情報が抜けてしまいます。
After:=で引数を設定することを試みましたがどうしてもうまくいきません。
After:=s.Cells(Rows.Count, "B").End(xlUp)など最終行からの検索をしようと
Set rngSearch = myRange.Find(What:="【", LookAt:=xlPart, SearchOrder:=xlByColumns)のなかに設置してもうまくいきませんでした。
どのように設定すればいいかご教示いただけますと幸いです。

Sub test() Dim sh1 As Worksheet Dim rngSearch As Range Dim myRange As Range Dim strAdr As String Dim s As Variant Dim R1, R2 As Long On Error Resume Next Set sh1 = Worksheets("Sheet1") For Each s In ThisWorkbook.Worksheets R1 = sh1.Cells(Rows.Count, "A").End(xlUp).row R2 = s.Cells(Rows.Count, "B").End(xlUp).row Set myRange = s.Range(s.Cells(1, "B"), s.Cells(R2, "B")) Set rngSearch = myRange.Find(What:="【", LookAt:=xlPart, SearchOrder:=xlByColumns) If Not rngSearch Is Nothing Then strAdr = rngSearch.Address n = R1 + 1 Do Set rngSearch = myRange.FindNext(rngSearch) If rngSearch Is Nothing Then Exit Do Else If s.Name <> "Sheet1" And _ strAdr <> rngSearch.Address Then sh1.Cells(n, "E") = Left(Mid(rngSearch, InStr(rngSearch, "【") + 1), InStr(Mid(rngSearch, InStr(rngSearch, "【") + 1), "】") - 1) End If End If n = n + 1 Loop While rngSearch.Address <> strAdr End If Next End Sub

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

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

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

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

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

guest

回答2

0

ベストアンサー

VBScript.RegExp ほど高機能ではありませんが、一応Findメソッドでもワイルドカードは使えます。

vba

1Set rngSearch = myRange.Find(What:="*【*】*", LookAt:=xlWhole, SearchOrder:=xlByColumns)

ワイルドカードを使って検索(Find メソッド) | ExcelWork.info

上記以外にも、いろいろ間違っていたり、余分なコードがあるので、修正しました。
修正箇所が多いので、いちいち解説するのは大変なのて、もとコードと見比べて、どこが違っているかご自身で研究してください。

vba

1Sub test() 2 Dim sh1 As Worksheet 3 Dim rngSearch As Range 4 Dim myRange As Range 5 Dim strAdr As String 6 Dim s As Variant 7 Dim R1 As Long, R2 As Long 8 On Error Resume Next 9 Set sh1 = Worksheets("Sheet1") 10 R1 = sh1.Cells(Rows.Count, "E").End(xlUp).Row + 1 11 For Each s In ThisWorkbook.Worksheets 12 If s.Name <> "Sheet1" Then 13 R2 = s.Cells(Rows.Count, "B").End(xlUp).Row 14 Set myRange = s.Range(s.Cells(1, "B"), s.Cells(R2, "B")) 15 Set rngSearch = myRange.Find(What:="*【*】*", LookAt:=xlWhole, SearchOrder:=xlByColumns) 16 If Not rngSearch Is Nothing Then 17 strAdr = rngSearch.Address 18 Do 19 sh1.Cells(R1, "E") = Left(Mid(rngSearch, InStr(rngSearch, "【") + 1), InStr(Mid(rngSearch, InStr(rngSearch, "【") + 1), "】") - 1) 20 R1 = R1 + 1 21 Set rngSearch = myRange.FindNext(rngSearch) 22 Loop While rngSearch.Address <> strAdr 23 End If 24 End If 25 Next 26End Sub

ちなみに、

vba

1sh1.Cells(R1, "E") = Left(Mid(rngSearch, InStr(rngSearch, "【") + 1), InStr(Mid(rngSearch, InStr(rngSearch, "【") + 1), "】") - 1) 2```の部分は、下記のように簡略化できます。 3```vba 4sh1.Cells(R1, "E") = Split(Split(rngSearch, "【")(1), "】")(0)

投稿2021/12/21 03:00

編集2021/12/21 04:10
hatena19

総合スコア33620

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

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

hajihaji

2021/12/21 03:18

ご回答ありがとうございます。最初にヒットした情報が抽出から抜け落ちてしまいます。もし解決策があればご教示いただけますと幸いです。
hatena19

2021/12/21 04:12

修正コードを追記しておきましたので、ご参照ください。
hajihaji

2021/12/21 06:33

ご回答ありがとうございます。解決いたしました。無駄な部分があることを痛感いたしました。 もっと勉強するようにいたします。ありがとうございました。
guest

0

【】で囲まれた値を抽出するだけであれば、正規表現を使うと処理がシンプルになりそうな気がします。
正規表現によるマッチング

例えば、こんなコードで

Private Sub CommandButton1_Click() Dim regexp As Object Dim i As Long Set regexp = CreateObject("VBScript.RegExp") With regexp .Pattern = "^【.*】$" .Global = True For i = 1 To 5 If .Test(Cells(i, 2)) Then Cells(i, 1) = Cells(i, 2) End If Next End With Set regexp = Nothing End Sub

こうなります。
実行結果

投稿2021/12/21 01:55

編集2021/12/21 02:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hajihaji

2021/12/21 02:06

ご回答ありがとうございます。調べてみます。
hajihaji

2021/12/21 02:31

こういう方法もあるんですね。ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/12/21 04:25 編集

代理デバッグする気はないのであまりコードは追ってませんが、とりあえずFindで見つけた項目を処理せずに、すぐにFindNext呼んでるのに問題があるんじゃないですかね。もっとコードをシンプルにして、デバッグで一行づつステップ実行して動きを確認してみたらどうですかね。
hajihaji

2021/12/21 06:31

ご指摘ありがとうございます。確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問