• ベストアンサー

エクセルVBAで文字列の重複を削除する方法?

VBAでの質問でしゅ。エクセルは2000です。 変数MyStrに全角カンマで区切られた文字列データが10種類程度あります。 現在、ある条件のもとに、MyStr=MyStr & Cell(i,2) & "、"のように取り込んで、最後にMyStr=Left(MyStr, Len(MyStr) - 1) で一番最後の「、」を削除しています。 例えば、MyStrの中身は、 OK建設株式会社、Goo工業合資会社、MM商事有限会社、AA合名会社、株式会社BB企画、OK建設株式会社、CC工業合資会社、DD商事有限会社、EE合名会社、株式会社BB企画 のような感じです。この中には重複したデータがある可能性があります。(例ではOK建設株式会社と株式会社BB企画) これを重複を排除し、変数MyStrの中身を、 OK建設株式会社、Goo工業合資会社、MM商事有限会社、AA合名会社、株式会社BB企画、CC工業合資会社、DD商事有限会社、EE合名会社  と変える方法はないでしょうか? あるいは、変数 MyStrにデータを取り込む際にすでにMyStrに入っているデータは除くような方法でもかまいません。 お知恵をお貸しくださいませ。 (o。_。)oペコッ.

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 #2 さんの >素直に配列かなんかを使って重複除去プログラムをまじめに作ったほうがいいかも? 私もそうは思ったのですが、ここの掲示板では、あまりそういう雰囲気にないということと、Excel VBAでは、こういう場合は、本来、AdvancedFilter を使ってしまいます。 あえて、後学のためにこんなコードを披露しておきます。以下のコードは、いろんなコードを十分に検討していればよいのですが、これしかないというようなコードではありません。 なお、本来、Dictionary オブジェクトにセルの値から直接入れればよいです。 今回は、文字列として出来上がっているという条件の下で書きました。 Sub DictionaryMethod() Dim objDic As Object Dim myText As String Dim arData As Variant Dim i As Long Dim v As Variant Dim arOut As Variant '本来はセルから取る Const strText = "OK建設株式会社、Goo工業合資会社、MM商事有限会社、AA合名会社、株式会社BB企画、OK建設株式会社、CC工業合資会社、DD商事有限会社、EE合名会社、株式会社BB企画"  Set objDic = CreateObject("Scripting.Dictionary")    myText = WorksheetFunction.Substitute(strText, " ", "") '半角空白抜き  arData = Split(myText, "、")   i = 1  For Each v In arData    If objDic.Exists(v) = False Then     objDic.Add v, i 'i はダミーです。     i = i + 1      End If  Next v  arOut = objDic.Keys    '出力する方法  Range("A1").Resize(objDic.Count).Value = WorksheetFunction.Transpose(arOut)  Set objDic = Nothing End Sub

merlionXX
質問者

お礼

Dictionary オブジェクトですか。 はじめて聞く言葉です。 VBAの呪文は奥が深いのですねえ・・・。 やってみて上手くいきました。 ただ、 > 'i はダミーです。 の意味がわかりません。 > arOut = objDic.Keys これはobjDicをarOutという配列に取り込んだのですよね?Keysってなんでしょう?

その他の回答 (9)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

こんにちは。Wendy02です。 >Dictionary オブジェクトですか。 >はじめて聞く言葉です。 でも……。しょせん外部オブジェクトですからね……。(^^; そんなに使えるものとは思っていません。Excelは、内部にいろいろありますからね。 >> 'i はダミーです。 >の意味がわかりません。 i は、単に、割り振りだけです。それ自体は、ここでは役に立っていませんね。 >> arOut = objDic.Keys >これはobjDicをarOutという配列に取り込んだのですよね?Keysってなんでしょう? Dictionary オブジェクトには、Key と Item があって、Key側に名称が入っていますから、それを配列で取り出しました。 Dictionary オブジェクト

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/jsobjdictionary.asp
merlionXX
質問者

お礼

ありがとうございます。 輝けるみなさまの足元にも及びませんが、すこしずつ勉強してまいりたいと思っております。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

こんな感じです。 Collection というオブジェクトがあります。よく、Worksheets コレクション...といった表現がこのサイトでもでてきますけど、 アレです。 Worksheets は組み込みですが、自分でコレクションを作ること が可能です。値のほか、オブジェクトも扱うことができますので 使い方の工夫次第で非常に便利ですよ。 今回は、Dictionary と同じような使い方をしましたが、重複判定 処理には Dictionary の方が高速なので、参考情報まででした。 Sub test2()      Dim Buf()    As String   Dim SourceArray As Variant   Dim UniqueArray As Collection   Dim vItem    As Variant      SourceArray = Split("OK建設株式会社、Goo工業合資会社、MM商事有限会社、AA合名会社、株式会社BB企画、OK建設株式会社、CC工業合資会社、DD商事有限会社、EE合名会社、株式会社BB企画", "、")      ' // ユニークデータを取り出す   Set UniqueArray = New Collection   On Error Resume Next   For Each vItem In SourceArray     UniqueArray.Add vItem, vItem   Next   On Error GoTo 0      ' // UniqueArray というのは Collection オブジェクトです。   ' // 配列にするためには、For ループなどで回します。   ' // Collection は 1オリジン(添え字が1から始まる)のに注意   ReDim Buf(UniqueArray.Count - 1)   For i = 1 To UniqueArray.Count     Buf(i - 1) = UniqueArray(i)   Next      ' // Join は指定した区切り文字で一次元配列の内容を   ' // 連結する関数です ※Excel2000以降      ' // 改行コードで連結する場合   MsgBox Join$(Buf, vbCrLf) End Sub

merlionXX
質問者

お礼

ご丁寧にありがとうございました。 まだ消化不良ですが、とても勉強になりました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.8

#7 の記載ミス訂正です。   ' // 一次元配列から重複を取り除く   Set UniqueArray = New Collection   On Error Resume Next   For Each vItem In SourceArray     UniqueArray.Add vItem, vItem ' <-- キーの重複不可を利用です   Next   On Error GoTo 0

merlionXX
質問者

お礼

有難うございました。 このようにしてみたのですがうまく行きません。 Sub test2() SourceArray = Split("OK建設株式会社、Goo工業合資会社、MM商事有限会社、AA合名会社、株式会社BB企画、OK建設株式会社、CC工業合資会社、DD商事有限会社、EE合名会社、株式会社BB企画", "、") Set UniqueArray = New Collection On Error Resume Next For Each vItem In SourceArray UniqueArray.Add vItem, vItem ' <-- キーの重複不可を利用です Next On Error GoTo 0 MsgBox Join(UniqueArray) End Sub

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

私も参加^^  蛇足回答だけどね。。 配列からユニークデータを取り出すなら、定番は Dictionary ですが Collection を使ってもできますよ。   ' // 一次元配列から重複を取り除く   Set UniqueArray = New Collection   On Error Resume Next   For Each vItem In SourceArray     UniqueArray.Add vItem   Next   On Error GoTo 0 Collection は同一値を Add しようとするとエラーになるのを利用 してます。 回答ですが、処理の流れとしては 1. 前処理として区切り文字となる「、」記号の全半角統一 2. Split で配列にばらす 3. 必要なら配列要素に Trim などの加工を行う 4. 3 の配列に対し、#3ご回答の方法や上述のような方法でユニーク   データを取り出す 5. 4. のデータを配列に戻す 4. Join で配列を連結する とかでしょうか。

merlionXX
質問者

お礼

ありがとうございました。 せっかく教示いただいたのですが、 4. のデータを配列に戻す  が、残念ながら出来ませんでした。

回答No.6

またまた、kobouzuです。 回答もせずに人の回答云々では、おい、おい、だろうと ランチ(スパ&珈琲)を食べた後。。。。と思ってたら Wendy02さんの回答が出てました。。。(^^;;; が、折角書いたのでアップップ。 '----------------------------------------------- Sub Test()  Dim i As Long  Dim myStr As String  Dim myDic  Set myDic = CreateObject("Scripting.Dictionary")  For i = 2 To Range("B65536").End(xlup).Row    If myDic.exists(Cells(i, "B").Value) = False Then      myStr = myStr & Cells(i, "B").Value & "、"      myDic.Add Cells(i, "B").Value, ""    End If  Next i  myStr = Left(myStr, Len(myStr) - 1) End Sub '----------------------------------------------------- 以上です。

merlionXX
質問者

お礼

ありがとうございます。 これもうまく作動します。 > myDic.Add Cells(i, "B").Value, "" の ,"" はなんでしょうか? Wendy02さんの、objDic.Add v, i のiに当るのでしょうか?

回答No.4

kobouzuです。 daibutsuyoさん、凄い! InStr(MyStr, "、" & Cell(i,2) & "、") これは頭の隅にも浮かびませんでした。(^^;;; それから、先の投稿はdaibutsuyoさんの回答が、云々、というものではありませんので。。。 質問者が色んな場合を想定しているのかどうかの確認のためです。   これからも目から鱗の回答、期待しています。  

noname#62235
noname#62235
回答No.3

#1です。 MyStrの先頭にも"、"をつけるようにして、 判定を InStr(MyStr, "、" & Cell(i,2) & "、") にすれば解決できるかな?(会社名には「、」が使われていない前提) まあ、細かいこと言い出したら、この部分一致判定はザルだらけになる危険性大なので、素直に配列かなんかを使って重複除去プログラムをまじめに作ったほうがいいかも? 面倒だけど。

merlionXX
質問者

お礼

ありがとうございます。 前後に”、”あるいは絶対使用されないような文字をつけて判定すれば大丈夫ですね。

回答No.2

エキスパートさん、台風の中から(まだですが、、)こんにちは。 またまた老婆心ながらの一言。 >If (InStr(MyStr, Cells(i, 2)) =0) Then MyStr = MyStr & Cells(i, 2) & "、" >取り込まない方法については一発で解決しました! 本当に解決ですか? 文字列によっては拙いことはありませぬか? 例えば、いま、 myStr = "大山田商会、南鹿児島建設、長野商事" として 次のデータが、”鹿児島建設” だとどうでせう。 上手くいきますか???   そんな部分一致の会社名はありましぇ~ん、ということであれば無視! これに限らず、コードを書くときは色んな場合を想定しなければいけません、 と偉そうなことを言ってみる。(^o^)。。。 以上です。  

merlionXX
質問者

お礼

貴重なご指摘有難うございました! ありえますね! 南鹿児島建設株式会社と鹿児島建設株式会社 なら頭の違い 有限会社薩摩芋焼酎販売と有限会社薩摩芋焼酎 なら後ろの違いですが どちらも部分一致してしまいますね! う~ん。

noname#62235
noname#62235
回答No.1

InStr関数で、MyStr中に今加えようとしている文字列が含まれているかどうかチェックしたらどうでしょうか? if (InStr(MyStr, Cell(i,2)) > 0) then MyStr=MyStr & Cell(i,2) & "、"

merlionXX
質問者

お礼

'If (InStr(MyStr, Cells(i, 2)) =0) Then MyStr = MyStr & Cells(i, 2) & "、" ですね。 取り込まない方法については一発で解決しました! 有難うございました。 あとは、既に入ってるものを削除する方法があるのか・・・

関連するQ&A

  • 企業4形態

    株式会社、有限会社、合名会社、合資会社について詳しく教えてください。

  • 会社といっても色々・・・

    起業する時に必要なことはなんでしょう? 起業の仕方の質問は、色々あり参考にさせて頂きました 会社といってもいろいろあるみたいなのですが、 合資会社・合名会社・有限会社・株式会社。 僕なりに調べて考えた結果、一番良いのは有限会社じゃないかなーと思います。 合資、合名については、責任が無限と言うこと、 有限、株式は、出資分のみでいいと言う点だけで決めたのですが、そこで、お聞きしたいのが有限会社は、一人ではできないのでしょうか? 出資金の集め方。維持の仕方等・・・ アドバイスいただきたいです。 みなさん宜しくお願いします。

  • 会社への出資について

    ちょっと疑問に思ったので質問させていただきます。 会社には ・株式会社 ・有限会社 ・合資会社 ・合名会社 がありますよね。 株式会社の場合、出資金(資本金)に限度額って言うのはないと思うのですが、有限会社・合資会社・合名会社には出資金の限度額って言うのはあるのでしょうか。 その他にそれぞれの形態にするメリットとか利用の仕方などありましたら教えていただきたいのですが。

  • 会社形態がわからなくって

    はじめまして。起業を考えていていろいろ参考資料を読みあさっています。 財務とかも必要なのですが、 合名会社とか合資会社とか・・・いまいちこの形態の意味がわかりません。株式会社にしたいとは思いますが、まだまだ株式にするまでの利益が上がっていませんので今は、考えていません。 (ホントは、株式でと・・・。)世間一般の社会的評価とか見栄えとかありますが、家族で切り盛りしているとこなので合名会社とか合資会社を考えています。(会社法改正する前の有限会社が良かったのかと思うんですが。) 合名会社とか合資会社の違いとかいろいろな事を詳しく教えてください。

  • エクセル セルをそれぞれ分ける方法

    一つのセルに、 4154あいうえお商事 4654かきくけこ建設 53123さしすせそ(株) 3234たちつてと有限会社 8746なにぬねの 6546はひふへほ商事 8674まみむめも電気 864やゆよ商事 554らりるれろ板金 と入力されているのを      ↓ 4154   あいうえお商事 4654   かきくけこ建設 53123   さしすせそ(株) 3234   たちつてと有限会社 8746   なにぬねの 6546   はひふへほ商事 8674   まみむめも電気 864   やゆよ商事 554   らりるれろ板金 二つのセルにそれぞれ分ける方法を教えてください。

  • 合名会社が少ないのはなぜ

    合名会社や合資会社が少ないのは無限責任ということで嫌われているのでしょうか。組織が簡略で株式会社や有限会社より資本金も少なくて設立も簡単そうなんですが。

  • 合資会社の略字はないのですか?

    こんにちは。 株式会社は(株)、有限会社は(有)と書くことがありますが、合資会社はどのように表記するのでしょうか? (合)だと合名会社と区別がつかないですよね。 ご存知の方教えてください。

  • 会社員をしていますが節税のために、会社を設立しようと思います。会社を設

    会社員をしていますが節税のために、会社を設立しようと思います。会社を設立し、家賃を社宅として経費計上するのが目的です。 株式会社、有限会社、合資会社、合名会社などいろいろありますが、できる限り費用がかからず、簡単に設立できる会社で、上記のような節税が可能な方針でやりたいと思っています。 簡単に、かつ、費用がかからず設立できる合名会社、合資会社あたりにしようと思っていますが、社宅として経費計上する場合、株式会社や有限会社じゃないとダメというような制約はありますでしょうか。

  • 合名会社の存続理由(合名会社が存在する理由を教えてください)

    会社法について、業務で必要なため、職場で勉強会をしています。 新会社法ができましたが、「合名会社が存続している理由ってあるの?」と聞かれて、色々と調べているのですが、適当な答えが見つかりません。 有限会社は株式会社に統合されており、合名会社はいまや老舗の酒造会社くらいしか見当たりません。合資会社にはまあ多少なりとも意味があるような気がしますが(有限責任社員により資本拡大が可能)、合名会社が法改正後も存続している理由がうまく説明できません。 データ引用元もわかれば、あわせてお教え願います。

  • 大企業=株式会社?

    トヨタとかNTTとかJRとか三菱とか、誰もが知ってる有名な会社は全て株式会社だと思います。何故でしょう?必然? 株式会社の他に、合資会社と合同会社と合名会社があると思います。少し前には有限会社というのもあったそうですが、法改正でそれは株式会社になったと記憶しています。 有名な合資会社といえば何処でしょう?日本の会社の名前を挙げてもらえるとありがたいです。合同会社でも合名会社でも良いです。 早稲田大学は会社ですか?駿台予備校は株式会社で、大株主は駿河台大学だったと思いますが、正しい?

専門家に質問してみよう