🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1025閲覧

エクセル VBA

m_ao

総合スコア5

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/12/07 09:41

編集2020/12/12 10:54

エクセル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ページで確認できます。

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

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

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

tatsu99

2020/12/07 12:54

1.File List: の":"は半角で Product No. : の":"は全角ですが それで間違いないでしょうか。
m_ao

2020/12/07 13:48

すみません。すべて半角です。記載ミスです。
guest

回答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

tatsu99

総合スコア5493

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

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

m_ao

2020/12/08 12:22

コードの記載ありがとうございました。抽出することができました。もし今後検索キーワードが増えた場合にもkw3として追加していくことも可能でしょうか。
tatsu99

2020/12/08 12:24

はい。可能です。
m_ao

2020/12/09 13:02

あと少し勉強させてください。 wstr = Replace(str, vbCrLf, vbLf) arr = Split(wstr, vbLf, -1, 0) ここでは何を行っているのでしょうか。 またfind = False とは検索なのでしょうか。
tatsu99

2020/12/09 13:27 編集

>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の場合は、キーワードが出現済みということなので、その行が空白でなければ、戻り値の文字列に追加し続けます。その行が空白なら、処理を打ち切ります。 尚、空白行は、改行以外に、半角スペース、全角スペースから構成される場合も含んでいます。
m_ao

2020/12/09 15:02

色々と教えて頂きありがとうございました。
guest

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
hatena19

総合スコア34073

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

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

m_ao

2020/12/07 12:47

回答頂きありがとうございました。自分のところで実行したのですが、4行目ExtractText でコンパイルエラーとなりました。SubまたはFunctionが定義されていません。とのメッセージでした。私のほうでの設定が不足しているようです、どうかご教示ください。
hatena19

2020/12/07 12:52

ExtractText関数は作成してますか。 (回答のコードをコピーして標準モジュールに貼り付ければ使えるようになります。)
m_ao

2020/12/07 13:47

ExtractText関数というのを使用したことが今まで無かったです。よくわからないので作成の仕方を探してみます。
hatena19

2020/12/08 00:37

ExtractText関数はユーザー定義関数です。この回答の下から2つめのコードブロックがそれです。 Public Function ExtractText(myStr As String, FindStr As String) As String で始まるコードです。 これをコピーして標準モジュールに貼り付けてください。
m_ao

2020/12/08 12:30

コード1を忘れていました。実行してみたのですが、G列には特定の文字から下までが結果として表示されました。もう一度確認してみます。 コメントありがとうございました。
hatena19

2020/12/08 12:39

「空白」というのを改行のみ行と判断してコードを書きましたが、半角空白または全角空白が含まれているのなら、コードを書きなおす必要がありますが、tatsu99さんのコードでできているなら、そちらを使ってください。
m_ao

2020/12/09 13:03

hatena19さん ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問