エクセルvbaで特定の文字から次の空白行まで貼り付けるという指定方法をご教示ください。
VBA
1Sub Macro1() 2Dim myStr As String 3 Dim findStr As String 4 Dim findNo As Integer 5 myStr = Range("F3") 6 findStr = "1. File List:" 7 findNo = InStr(myStr, findStr) 8 Range("G3") = Right(myStr, Len(myStr) - findNo) 9End Sub
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
1.File List: の":"は半角で
Product No. : の":"は全角ですが
それで間違いないでしょうか。
すみません。すべて半角です。記載ミスです。

回答2件
0
ベストアンサー
以下のようにしてください。
標準モジュールに登録してください。
VBA
1'F列の文章から目的の文字列を取り出し、G列へ設定 2Public Sub 抽出() 3 Dim maxrow As Long 4 Dim wrow As Long 5 maxrow = Cells(Rows.Count, "F").End(xlUp).Row '最終行を求める 6 7 For wrow = 3 To maxrow 8 Cells(wrow, "G").Value = MyGetText(Cells(wrow, "F").Value) 9 Next 10 11End Sub 12'文章から検索ワード1,2の文字列を含む行を取得する 13Public Function MyGetText(ByVal str As String) As String 14 Const kw1 As String = "1.File List:" '検索ワード1 15 Const kw2 As String = "Product No. :" '検索ワード2 16 Dim arr As Variant 17 Dim wstr As String 18 Dim find As Boolean 19 Dim RegExp As Object 20 Dim i As Long 21 Set RegExp = CreateObject("VBScript.RegExp") 22 RegExp.Pattern = "^[\s ]*$" '半角空白及び全角空白だけからなる行 23 MyGetText = "" 24 wstr = Replace(str, vbCrLf, vbLf) '改行がvbCrLfの場合の保険 25 arr = Split(wstr, vbLf, -1, 0) 26 If UBound(arr) < 1 Then Exit Function 27 find = False 28 For i = 0 To UBound(arr) 29 If find = False Then 30 If Left(arr(i), Len(kw1)) = kw1 Or Left(arr(i), Len(kw2)) = kw2 Then 31 find = True 32 MyGetText = arr(i) & vbLf 33 End If 34 Else 35 If RegExp.test(arr(i)) = True Then 36 Exit For 37 End If 38 MyGetText = MyGetText & arr(i) & vbLf 39 End If 40 Next 41End Function 42
投稿2020/12/07 23:53
総合スコア5540
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
コードの記載ありがとうございました。抽出することができました。もし今後検索キーワードが増えた場合にもkw3として追加していくことも可能でしょうか。
はい。可能です。
あと少し勉強させてください。
wstr = Replace(str, vbCrLf, vbLf)
arr = Split(wstr, vbLf, -1, 0)
ここでは何を行っているのでしょうか。
またfind = False とは検索なのでしょうか。
>wstr = Replace(str, vbCrLf, vbLf)
上記ですが、改行がvbcrlf(0xD0A)の場合と、vblf(0xA)の場合が考えられます。
vblfを使うのが本来の使い方ですが、まれにvbcrlfに設定してあるケースもあるので、その場合を考量して
vbcrlfをvblfに一旦、置き換えます。
その後
>arr = Split(wstr, vbLf, -1, 0)
によって、vblf(改行)で、文字列を分割します。
つまり、arrには、各行の文字列が格納されます。
>またfind = False とは検索なのでしょうか。
findはキーワードの文字が出現したかどうかを表すフラグです。
キーワードを検索済みかどうかという意味でfindと名付けましたが、flagという変数名の方が判りやすいかも知れません。
arrの各行を先頭から処理します。arr(0)~arr(N)まで。(Nは最後の行)
findがfalseの場合は、その行がキーワードに一致するか否かを判定し、一致するならfindをtrueにし、その文字を戻り値の文字列に設定します。
findがtrueの場合は、キーワードが出現済みということなので、その行が空白でなければ、戻り値の文字列に追加し続けます。その行が空白なら、処理を打ち切ります。
尚、空白行は、改行以外に、半角スペース、全角スペースから構成される場合も含んでいます。
色々と教えて頂きありがとうございました。

0
とりあえず、
text
11.File List: 2BBBBBBBBBBB V1.0 3CCCCCCCCCCCCCCCCCCCCCCCCCC
の部分を取り出すコード例
vba
1 Dim myStr As String, FindStr As String 2 myStr = Range("F3").Text 3 FindStr = "1. File List:" 4 5 Range("G3").Value = FindStr & Split(Split(myStr, FindStr)(1), vbLf & vbLf)(0)
エクセルのセル内の改行は vbLf
追記
上記のコードを踏まえて、汎用関数にすると、
コード1
vba
1Public Function ExtractText(myStr As String, FindStr As String) As String 2 Dim ary 3 ary = Split(myStr, FindStr) 4 If UBound(ary) > 0 Then 5 ExtractText = FindStr & Split(Split(myStr, FindStr)(1), vbLf & vbLf)(0) 6 End If 7End Function
これを使って、F列を最後まで、処理するには、ループを使うことになります。
いろいろありますが、For Each を使うと簡潔に記述できます。
コード2
vba
1Public Sub Proc1() 2 Dim Rng As Range, res As String 3 For Each Rng In Range("F3", Range("F2").End(xlDown)) 4 res = ExtractText(Rng.Text, "1.File List:") 5 If res = "" Then 6 res = ExtractText(Rng.Text, "Product No. :") 7 End If 8 Rng.Offset(, 1).Value = res 9 Next 10End Sub
説明補足
上記のコード1、コード2をコピーして標準モジュールに貼り付けて、Proc1
を実行してください。
投稿2020/12/07 10:22
編集2020/12/08 00:42総合スコア34367
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答頂きありがとうございました。自分のところで実行したのですが、4行目ExtractText でコンパイルエラーとなりました。SubまたはFunctionが定義されていません。とのメッセージでした。私のほうでの設定が不足しているようです、どうかご教示ください。
ExtractText関数は作成してますか。
(回答のコードをコピーして標準モジュールに貼り付ければ使えるようになります。)
ExtractText関数というのを使用したことが今まで無かったです。よくわからないので作成の仕方を探してみます。
ExtractText関数はユーザー定義関数です。この回答の下から2つめのコードブロックがそれです。
Public Function ExtractText(myStr As String, FindStr As String) As String
で始まるコードです。
これをコピーして標準モジュールに貼り付けてください。
コード1を忘れていました。実行してみたのですが、G列には特定の文字から下までが結果として表示されました。もう一度確認してみます。
コメントありがとうございました。
「空白」というのを改行のみ行と判断してコードを書きましたが、半角空白または全角空白が含まれているのなら、コードを書きなおす必要がありますが、tatsu99さんのコードでできているなら、そちらを使ってください。
hatena19さん ありがとうございました。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。