[[20180621150648]] 『特定の位置にある文字列を取り出したい』(ワニ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『特定の位置にある文字列を取り出したい』(ワニ)

検索で求める答えにたどり着けませんでした。
似た質問があれば誘導おねがいします。

次のようなデータ(10件〜20件)から一部だけを抜き出したいです。

「A事業本部  B事業部  C課  D所属  E担当 (F)」

この中からDだけを抜き出したいです。

データの特徴として、
・A〜Cまでの部署は増減があります。
 A事業本部  B事業部  C課  Dグループ  E  G担当 (F)のような場合は「E」が抽出目的。
・区切りになっているスペースは半角スペース2個、E担当 (F)の()の前だけ半角スペース1個。
  (分かりにくいと思うので上の例を選択してみてください)
・Dの次がE担当となるのは決まっている。

=MID(TRIM(A1),FIND("●", SUBSTITUTE(TRIM(A1), " ", "●",LEN(TRIM(A1)) - LEN(SUBSTITUTE(TRIM(A1), " ", ""))-2)),FIND("●", SUBSTITUTE(TRIM(A1), " ", "●",LEN(TRIM(A1)) - LEN(SUBSTITUTE(TRIM(A1), " ", ""))-1)))

とりあえずこんな形で組んでみましたが、結果は「D所属 E担当 (F)」で、Eから後ろを上手く処理できません。

関数ですがエクセル操作に不安がある人も扱うことが判明したので、出来ればVBAに落とし込みたいです。(VBA理解度は解説サイト頼りレベルです)

お手数ですが、知恵をお貸しください。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


A列に値があるとして

1)A列をB列にコピー
2)B列を選択して→データタブ→データツール→区切り位置
3)カンマやタブなどの区切り文字によってフィールドごとに区切られたデータを選んで次へ
4)スペースにチェックを入れて次へ
5)不要な列を選んで、削除するを選んで行く。
6)完了

これで必要なデータが抜き出せます。
この操作を自動で行いたければ、
この操作をマクロの記録でコードに変換するところから始めてみてください。

(まっつわん) 2018/06/21(木) 16:37


 G担当 ( の直前に来る文字列を抽出
 Gは任意のスペース以外の単・複数文字列
 データはA列

 ということで

 Sub test()
     Dim a, i As Long, temp As String
     With Range("a1", Range("a" & Rows.Count).End(xlUp))
         a = .Value
         For i = 1 To UBound(a, 1)
             temp = GetBeforeTxt(a(i, 1), "担当")
             If temp <> "" Then a(i, 1) = temp
         Next
         .Columns(2).Value = a
     End With
 End Sub 

 Function GetBeforeTxt(ByVal txt As String, myStr As String) As String
     With CreateObject("VBScript.RegExp")
         .Pattern = "\S+(?= +\S+" & myStr & " *\()"
         If .test(txt) Then GetBeforeTxt = .Execute(txt)(0)
     End With
 End Function
(seiya) 2018/06/21(木) 16:44

文字数の関係でかけなかったことを書こうと思っていれば、早速のご回答ありがとうございます。

まっつわんさん
>区切り位置での対応方法の提示ありがとうございます。

A事業本部  B事業部  C課  "D所属"  E担当 (F)
A事業本部  B事業部  C課  Dグループ  "E所属"  G担当 (F)

↑区切り位置を使用すると、取り出したい文字列がD列とE列などにバラける場合があるので今回は使用できないんです。
 規定の位置にある文字列を取り出す際は活用させていただきます。

seiyaさん
>実行したところ、目的の形になりました!ありがとうございました!
(ワニ) 2018/06/21(木) 18:24


すいません。クローズしようと思っていたのですが、
ファイルにあった他のVBAと処理の速さが違うのが気になりまして。

別内容ですが続けて質問させていただきます。

元々あった他のVBAとseiyaさんのものは速さが段違い(他が遅い)でして
このタイミングで改善できないかと思った次第です。

Sub 会社入力()

    Dim ans As String
    Dim rng As Range
    
    Range("B1").Select
    Range(Selection, Selection.End(xlDown)).Select
        Selection.Offset(1).Resize(Selection.Rows.Count - 1).Select
        
    ans = InputBox("会社名を入力してください。", "会社名入力", "")
    
    For Each rng In Selection

    For i = 8 To Cells(Rows.Count, 1).End(xlUp).Row
        With rng

            .Value = ans & .Value      'この行を修正
   
        End With

       Next i
    Next
    
ActiveCell.Select

End Sub

ファイルには他にも全角半角変換のVBAもありますが、基本Range("B1").Select〜で入力済みのセルを取得しています。
動かすと処理!次!処理!次!みたいな動きになりもっさりします。

よろしくお願いいたします。(別で立てたほうがいいなどのご指摘もお待ちしています。)
(ワニ) 2018/06/22(金) 17:00


 こういうことですか?

 Sub 会社入力()
     Dim ans As String, x As Long
     x = Range("a" & Rows.Count).End(xlUp).Row - 7
     With Range("b2", Range("b2").End(xlDown))
          ans = InputBox("会社名を入力してください。", "会社名入力", "")
          .Value = .Parent.Evaluate("index(rept(""" & ans & """," & x & ")&" & .Address & ",,)")
     End With
 End Sub
(seiya) 2018/06/22(金) 18:47

>動かすと処理!次!処理!次!みたいな動きになりもっさりします。
セルをselectするのも不要な動作で遅くなりますし、
個々のセルを個別に読み書きするのも遅い原因です。
セルの読み書きの回数を出来るだけ少なくするのが、
高速化のセオリーです。

Sub 会社入力2()

    Dim Rng As Range
    Dim v As Variant
    Dim i As Long
    Dim s As Long

    Set Rng = Range(Range("B2"), Cells(Rows.Count, "B").End(xlUp))
    v = Rng.Value
    s = InputBox("会社名を入力してください。", "会社名入力", "")

    For i = 1 To UBound(v, 1)
        v(i, 1) = s & v(i, 1)
    Next

    Rng.Value = v
End Sub

参考URL>>
http://officetanaka.net/excel/vba/speed/
(まっつわん) 2018/06/22(金) 21:12


 >動かすと処理!次!処理!次!みたいな動きになりもっさりします。

 そらそうでしょう。
 毎回何行分か解らんけど、上書き繰り返しているし。

 >For i = 8 To Cells(Rows.Count, 1).End(xlUp).Row
 >     With rng
 >         .Value = ans & .Value      'この行を修正
 >     End With
 >Next i
(BJ) 2018/06/22(金) 22:53

書き込みが遅くなりました。

seiyaさん、まっつわんさん、BJさんありがとうございます!

絶対処理もっとはやくなるよなぁ…と思いつつも
どうにもさわりきれない領域でしたので大変助かりました!

これにて本当に終わりとさせていただきます。
重ね重ね質問に回答いただきありがとうございました。
(ワニ) 2018/06/28(木) 14:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.