
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ペコッ.
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
Dictionary オブジェクトですか。
はじめて聞く言葉です。
VBAの呪文は奥が深いのですねえ・・・。
やってみて上手くいきました。
ただ、
> 'i はダミーです。
の意味がわかりません。
> arOut = objDic.Keys
これはobjDicをarOutという配列に取り込んだのですよね?Keysってなんでしょう?
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 …
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
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
有難うございました。
このようにしてみたのですがうまく行きません。
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
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 で配列を連結する
とかでしょうか。
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
'-----------------------------------------------------
以上です。
ありがとうございます。
これもうまく作動します。
> myDic.Add Cells(i, "B").Value, ""
の ,"" はなんでしょうか?
Wendy02さんの、objDic.Add v, i のiに当るのでしょうか?
No.4
- 回答日時:
kobouzuです。
daibutsuyoさん、凄い!
InStr(MyStr, "、" & Cell(i,2) & "、")
これは頭の隅にも浮かびませんでした。(^^;;;
それから、先の投稿はdaibutsuyoさんの回答が、云々、というものではありませんので。。。
質問者が色んな場合を想定しているのかどうかの確認のためです。
これからも目から鱗の回答、期待しています。
No.2
- 回答日時:
エキスパートさん、台風の中から(まだですが、、)こんにちは。
またまた老婆心ながらの一言。
>If (InStr(MyStr, Cells(i, 2)) =0) Then MyStr = MyStr & Cells(i, 2) & "、"
>取り込まない方法については一発で解決しました!
本当に解決ですか?
文字列によっては拙いことはありませぬか?
例えば、いま、
myStr = "大山田商会、南鹿児島建設、長野商事" として
次のデータが、”鹿児島建設” だとどうでせう。
上手くいきますか???
そんな部分一致の会社名はありましぇ~ん、ということであれば無視!
これに限らず、コードを書くときは色んな場合を想定しなければいけません、
と偉そうなことを言ってみる。(^o^)。。。
以上です。
貴重なご指摘有難うございました!
ありえますね!
南鹿児島建設株式会社と鹿児島建設株式会社 なら頭の違い
有限会社薩摩芋焼酎販売と有限会社薩摩芋焼酎 なら後ろの違いですが どちらも部分一致してしまいますね!
う~ん。
No.1
- 回答日時:
InStr関数で、MyStr中に今加えようとしている文字列が含まれているかどうかチェックしたらどうでしょうか?
if (InStr(MyStr, Cell(i,2)) > 0) then MyStr=MyStr & Cell(i,2) & "、"
'If (InStr(MyStr, Cells(i, 2)) =0) Then MyStr = MyStr & Cells(i, 2) & "、"
ですね。
取り込まない方法については一発で解決しました!
有難うございました。
あとは、既に入ってるものを削除する方法があるのか・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 会社設立・起業・開業 会社の設立年月日について 2 2023/01/13 16:03
- Excel(エクセル) エクセルの数式で教えてください。 5 2023/02/10 15:11
- 就職 就職先 どちら 2 2022/09/29 18:54
- 会社設立・起業・開業 2006年で有限会社はなくなり新規で設立が出来なくなったみたいですね。 これから1人で法人を作る事は 4 2023/04/05 01:25
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- 会社経営 民間企業はほぼ株式会社なんですが、株式会社で経営する理由ってなんですか? 株式会社ではない民間企業だ 7 2023/02/01 23:46
- 会社設立・起業・開業 グループ会社や子会社としての要件を満たすのかどうか? 1 2022/12/30 08:48
- 経済 例えば、私が莫大な資産家で合資会社を設立して、三菱などのグループ会社の上場企業の株式を51%以上買い 4 2023/01/12 22:13
- 法学 全部取得条項付株式の取得と引換えにする株式の発行 申請書について 1 2022/12/21 17:32
- Excel(エクセル) Excel 数行を1組とする300組ほどあるデータの項目を揃えたいです。 3 2023/01/26 19:38
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?
-
【お題】動物のキャッチフレーズ
【お題】「百獣の王 ライオン」「実は動物界最強 カバ」は分かるけど、それはちょっとピンと来ないなと思った動物のキャッチフレーズ
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
単二電池
あなたの家に何本ありますか?
-
カラオケの鉄板ソング
歌えばその場が絶対盛り上がる「鉄板ソング」を教えてください!
-
同じセルで重複している文字を削除したい
Excel(エクセル)
-
同一セル内の重複文字を削除したいです
Excel(エクセル)
-
エクセル セル内の重複する文字列を削除する方法
その他(Microsoft Office)
-
-
4
Excel 文字列を結合するときに重複をなくしたい 関数・VBA
Excel(エクセル)
-
5
同一セル内での重複削除
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
鉄筋のSD295とSD345
-
自分の会社は「弊社」「当社」...
-
架電、切電、終話・・・??
-
鋼材のたわみに関する質問です...
-
草の単位体積重量について
-
お客様に対して「お世話になっ...
-
配筋補強の要らない床貫通スリ...
-
直庸って知ってる方いますか?
-
職人さんが架台(かだい)を「が...
-
リテーナとは??
-
建設工事について質問です。
-
水準測量において
-
メーターボックス開け方
-
土木の設計図の測点について
-
【ソフトウェア開発】 UD、CD,...
-
フォートナイトをwin10でやる時...
-
尤度 裕度 違いは?
-
今 建築業の職人さん めちゃく...
-
帽子を被ったまま帽子のツバを...
-
★★まちの電気屋さんの年収はど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自分の会社は「弊社」「当社」...
-
鋼材のたわみに関する質問です...
-
架電、切電、終話・・・??
-
鉄筋のSD295とSD345
-
草の単位体積重量について
-
お客様に対して「お世話になっ...
-
配筋補強の要らない床貫通スリ...
-
リテーナとは??
-
直庸って知ってる方いますか?
-
職人さんが架台(かだい)を「が...
-
今 建築業の職人さん めちゃく...
-
土木の設計図の測点について
-
水準測量において
-
メーターボックス開け方
-
現場打ちの集水桝に鉄筋は必要...
-
建築用語の英語翻訳がわかりま...
-
「土方」という言葉は現在は放...
-
施工例として使わせて貰うとき...
-
尤度 裕度 違いは?
-
TP+19.0mとは
おすすめ情報