Excelについてです。


ある列に「xx株式会社」「(株)yyy」といった文字列が羅列してあります。別に、文字列(会社名)とそのコード(証券コード)の対応表があります。
セル範囲内に、対応表に合致する文字列があるかどうかを検索し、あったならばその横の列に対応するコードを次々と付加していく。ただし、文字列には表記ゆれ(株式会社→(株)など)があるために正規表現が使えるなど、検索の柔軟さが確保されていることが条件です。(別に用意したtxtファイルなどから、表記ゆれ条件を指定できるとなおよいです。)

そういうマクロ/プログラムを、どこかで頒布/販売していないでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/08/23 10:20:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:airplant No.4

回答回数220ベストアンサー獲得回数49

ポイント10pt

正規表現で記載したリストに基づき、元データを変更するマクロを作ってみました。

これを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

上記で動作することは、確認済みです。

他の諸条件(正規表現でのゆれを現す件数や、ファイルが別なのか、同じなのかなど)が不明なので、これ以上は作っていません。ファイル数が多いようなので、自動でオープンしたり、今回作った関数を貼り付けるのを自動でということが必要なのかも知れません。

その他の回答3件)

id:minkpa No.1

回答回数4178ベストアンサー獲得回数55

id:miyatyu

素早い反応はうれしいのですが、質問内容と関係ないことをお答えいただいても困ります。

2007/08/16 15:22:46
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

表記のゆれがあるならば、一括で 置換しちゃえばいいでしょう。

たとえば 株式会社を(株)に置換する(逆でもいいですが)

それから Vlookupで取得して表示させればいいでしょう。

http://www.yoshikawa.co.jp/ybs/skilup/ybs0308.htm

id:miyatyu

回答ありがとうございます。

確かにそうなんですが、それを一々数百ファイルに対してやるのは面倒&マクロを一から書くのも(自分のレベルでは)大変。

ただ、同じように表記ゆれを許容したvlookupを実現したい人は結構いそうなので、それを一括でやってくれるマクロやソフトウェアはないかなと思っています。

2007/08/16 15:29:01
id:hiramatsu_kg No.3

回答回数424ベストアンサー獲得回数3

id:miyatyu

「はてなの人力検索がGoogleを超える日は来るのか?」

ずいぶんと婉曲な表現でしたが、hiramatsu_kgさんの仰りたいこと分かりました。

2007/08/17 18:27:45
id:airplant No.4

回答回数220ベストアンサー獲得回数49ここでベストアンサー

ポイント10pt

正規表現で記載したリストに基づき、元データを変更するマクロを作ってみました。

これを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

上記で動作することは、確認済みです。

他の諸条件(正規表現でのゆれを現す件数や、ファイルが別なのか、同じなのかなど)が不明なので、これ以上は作っていません。ファイル数が多いようなので、自動でオープンしたり、今回作った関数を貼り付けるのを自動でということが必要なのかも知れません。

  • id:miyatyu
    さらに、結果を外部書き出しで来たりすると最高です。
  • id:airplant
    2日前に回答を記載しました。開くのにためらわれていますでしょうか?

    回答概要:
    Step1.正規表現のリストを作っておく(タブ区切りなどで作って、Excelへ読み込んでおく)
    \(株\) 株式会社
    \(有限\) 有限会社
    [\((]有限[ \))] 有限会社
    (B1:C3のように参照してもいいが、面倒なので、名前をつけておく*1。ここでは上記の範囲をRegwordと名前付けしたと仮定)

    Step2.次の関数で正規化する。関数はマクロに登録しておく。
     =ConvByRegExp(B13,Regword)

    (株)はてな → 株式会社はてな
    (有限) なては商事 → 有限会社なては商事
    のように変換できる。

    *1: 名前付けは、私の日記でも説明してあります。
    http://d.hatena.ne.jp/airplant/20070808#1186598203
  • id:miyatyu
    airplantさん、ごめんなさい。
    ちょっと(本当の)旅に出ていて、回答チェックできませんでした。。。

    マクロまで作っていただき大変ありがとうございました。
  • id:airplant
    miyatyuさん、ポイント送付までいただいて、ありがとうございます。今日気づきました。
    連絡手段がないので、ここでお礼させていただきます。
    ところで、うまく要望の動作はしましたでしょうか?
    もし、だめなら相談にのりますよ。w
  • id:airplant
    =ConvByRegExp(会社, ゆれリスト)
    この式では、「#VALUE!」になってしまいます。
    2年半も放置しておりすみませんでした。
    第一パラメータには、A1や"株式会社ほげげ"のように文字列が限定できる式を書く必要があります。

    例.
    =ConvByRegExp(A1, ゆれリスト)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません