ある列に「xx株式会社」「(株)yyy」といった文字列が羅列してあります。別に、文字列(会社名)とそのコード(証券コード)の対応表があります。
セル範囲内に、対応表に合致する文字列があるかどうかを検索し、あったならばその横の列に対応するコードを次々と付加していく。ただし、文字列には表記ゆれ(株式会社→(株)など)があるために正規表現が使えるなど、検索の柔軟さが確保されていることが条件です。(別に用意したtxtファイルなどから、表記ゆれ条件を指定できるとなおよいです。)
そういうマクロ/プログラムを、どこかで頒布/販売していないでしょうか?
正規表現で記載したリストに基づき、元データを変更するマクロを作ってみました。
これをVLOOKUPすれば出てきます。
●シート側
A | B | C |
---|---|---|
(株)はてな | =ConvByRegExp(会社, ゆれリスト) | vlookup(正規化会社,.... |
(関数は、手打ち以外に、関数の挿入→ユーザ定義関数でも入れられます)
●名前定義の前提(全部をA:Aとか、D20:E23のように書いてもいいですが、、、)
A列:会社
B列:正規化会社
どこか:ゆれリスト(→別シートにして、同じ物を全部使う。マクロのExcelに入れておくといいと思う)
D | E | |
---|---|---|
20 | \(株\) | 株式会社 |
21 | \(有\) | 有限会社 |
22 | [\((]有限[\))] | 有限会社 |
23 |
→もし名前付けが分からないときは、下記を参照ください。
http://d.hatena.ne.jp/airplant/20070808#1186598203
●マクロ
Option Explicit '正規表現リストを元に文字列を変更する ' '表記方法 ConvByRegExp(ソース文字列, 正規表現リスト) ' 出力:正規表現で置換え後の文字列 'Excel内からの呼び出し: ' = ConvByRegExp(Src, ExpList) ' Src:ソースの列に名前を付けるか、A:Aのように指定 ' ExpList:「s/from-pattern/to-pattern/」のfromとtoのパターンリストを ' 配列として囲んだものを指定する。リストの最後はNull。 ' \(株\) 株式会社 ' \(有\) 有限会社 ' [\((]有限[\))] 有限会社 Function ConvByRegExp(strSrc As String, ParamArray RGEPattern() As Variant) As String Dim oRge As Variant Dim lnI As Long Dim strRep As String '引数2(正規表現リスト)がなければ#N/Aエラー返して終わり If IsMissing(RGEPattern) Then ConvByRegExp = CVErr(xlErrNA) Exit Function Else If Not IsArray(RGEPattern) Then ConvByRegExp = CVErr(xlErrNA) Exit Function End If End If Set oRge = CreateObject("VBScript.RegExp") With oRge .IgnoreCase = True '大小文字無視 .Global = True '文字列全体が対象 lnI = 1 Do While RGEPattern(0)(lnI, 1) <> "" .Pattern = RGEPattern(0)(lnI, 1) '検索パターン If .Test(strSrc) Then 'マッチしたら文字列変更 strRep = RGEPattern(0)(lnI, 2) ConvByRegExp = .Replace(strSrc, strRep) Set oRge = Nothing Exit Function End If lnI = lnI + 1 Loop End With ConvByRegExp = strSrc Set oRge = Nothing End Function
上記で動作することは、確認済みです。
他の諸条件(正規表現でのゆれを現す件数や、ファイルが別なのか、同じなのかなど)が不明なので、これ以上は作っていません。ファイル数が多いようなので、自動でオープンしたり、今回作った関数を貼り付けるのを自動でということが必要なのかも知れません。
表記のゆれがあるならば、一括で 置換しちゃえばいいでしょう。
たとえば 株式会社を(株)に置換する(逆でもいいですが)
それから Vlookupで取得して表示させればいいでしょう。
回答ありがとうございます。
確かにそうなんですが、それを一々数百ファイルに対してやるのは面倒&マクロを一から書くのも(自分のレベルでは)大変。
ただ、同じように表記ゆれを許容したvlookupを実現したい人は結構いそうなので、それを一括でやってくれるマクロやソフトウェアはないかなと思っています。
「はてなの人力検索がGoogleを超える日は来るのか?」
ずいぶんと婉曲な表現でしたが、hiramatsu_kgさんの仰りたいこと分かりました。
正規表現で記載したリストに基づき、元データを変更するマクロを作ってみました。
これをVLOOKUPすれば出てきます。
●シート側
A | B | C |
---|---|---|
(株)はてな | =ConvByRegExp(会社, ゆれリスト) | vlookup(正規化会社,.... |
(関数は、手打ち以外に、関数の挿入→ユーザ定義関数でも入れられます)
●名前定義の前提(全部をA:Aとか、D20:E23のように書いてもいいですが、、、)
A列:会社
B列:正規化会社
どこか:ゆれリスト(→別シートにして、同じ物を全部使う。マクロのExcelに入れておくといいと思う)
D | E | |
---|---|---|
20 | \(株\) | 株式会社 |
21 | \(有\) | 有限会社 |
22 | [\((]有限[\))] | 有限会社 |
23 |
→もし名前付けが分からないときは、下記を参照ください。
http://d.hatena.ne.jp/airplant/20070808#1186598203
●マクロ
Option Explicit '正規表現リストを元に文字列を変更する ' '表記方法 ConvByRegExp(ソース文字列, 正規表現リスト) ' 出力:正規表現で置換え後の文字列 'Excel内からの呼び出し: ' = ConvByRegExp(Src, ExpList) ' Src:ソースの列に名前を付けるか、A:Aのように指定 ' ExpList:「s/from-pattern/to-pattern/」のfromとtoのパターンリストを ' 配列として囲んだものを指定する。リストの最後はNull。 ' \(株\) 株式会社 ' \(有\) 有限会社 ' [\((]有限[\))] 有限会社 Function ConvByRegExp(strSrc As String, ParamArray RGEPattern() As Variant) As String Dim oRge As Variant Dim lnI As Long Dim strRep As String '引数2(正規表現リスト)がなければ#N/Aエラー返して終わり If IsMissing(RGEPattern) Then ConvByRegExp = CVErr(xlErrNA) Exit Function Else If Not IsArray(RGEPattern) Then ConvByRegExp = CVErr(xlErrNA) Exit Function End If End If Set oRge = CreateObject("VBScript.RegExp") With oRge .IgnoreCase = True '大小文字無視 .Global = True '文字列全体が対象 lnI = 1 Do While RGEPattern(0)(lnI, 1) <> "" .Pattern = RGEPattern(0)(lnI, 1) '検索パターン If .Test(strSrc) Then 'マッチしたら文字列変更 strRep = RGEPattern(0)(lnI, 2) ConvByRegExp = .Replace(strSrc, strRep) Set oRge = Nothing Exit Function End If lnI = lnI + 1 Loop End With ConvByRegExp = strSrc Set oRge = Nothing End Function
上記で動作することは、確認済みです。
他の諸条件(正規表現でのゆれを現す件数や、ファイルが別なのか、同じなのかなど)が不明なので、これ以上は作っていません。ファイル数が多いようなので、自動でオープンしたり、今回作った関数を貼り付けるのを自動でということが必要なのかも知れません。
素早い反応はうれしいのですが、質問内容と関係ないことをお答えいただいても困ります。