• ベストアンサー

最も多い文字列を検索するには

皆様いつもお世話になっております。 最も多い文字列を検索するにはどのようにすればよいでしょうか。 具体的には (1)A列に6文字の文字列が並んでいます。 (2)先頭4文字の文字列で最も多い種類の文字列の値を取得する (3)最も多い文字列以外の文字列を含む行を削除する というプログラムを組みたいと思います。 よろしくお願いします。

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

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

ご自分でつくったコードをちゃんと提示しましょう。それが多くの回答をもらう ポイントです。 > (3)最も多い文字列以外の文字列を含む行を削除する 含む? これだと全ての行が削除対象になる気がしますが... 始まる...ですかね? プログラムを組むまでもなく、作業列を2つ設けて数式   B1 セル: =LEFT(A1,4)   C1 セル: =COUNTIF(B:B,B1) とし、データ終端までフィルでコピー。あとは C 列にオートフィルターをかけ、 最頻値以外を抽出して削除すれば良い気がしますが... 作業列を使わず、Excel VBA だけで完結させるなら、こんな感じかと。 Sub Sample()      Dim Dic     As Object   Dim rTable   As Range   Dim rDelRow   As Range   Dim C      As Range   Dim vDat    As Variant   Dim sKey    As String   Dim sModeKey  As String      ' 頭から切り出して調べる文字数   Const CHARCOUNT = 4      ' データ範囲   With Worksheets("Sheet1")     Set rTable = Range(.Cells(1, "A"), _            .Cells(Rows.Count, "A").End(xlUp))   End With   ' (2)先頭4文字の文字列で最も多い種類の文字列の値を取得する   ' --> sModeKey です   Set Dic = CreateObject("Scripting.Dictionary")   sModeKey = ""   For Each vDat In rTable.Value     ' 空または CHARCOUNT 以下のデータはここでは無視     If Not IsEmpty(vDat) And Len(vDat) >= CHARCOUNT Then       sKey = Left$(vDat, CHARCOUNT)       ' ※ Dictionary は キーが重複するとエラーになります       If Dic.Exists(sKey) Then         Dic(sKey) = Val(Dic(sKey)) + 1       Else         Dic.Add Key:=sKey, Item:=1       End If       ' 最頻値更新       If Len(sModeKey) > 0 Then         If Dic(sKey) > Dic(sModeKey) Then           sModeKey = sKey         End If       Else         sModeKey = sKey       End If     End If   Next   ' (3)最も多い文字列"以外"で"始まる"行を Select する   ' 本当は Find を使った方が速いけど長くなるので...   If Len(sModeKey) > 0 Then     sModeKey = sModeKey & "*"     For Each C In rTable.Cells       If Not C.Value Like sModeKey Then         If rDelRow Is Nothing Then           Set rDelRow = C         Else           Set rDelRow = Union(rDelRow, C)         End If       End If     Next   Else     ' 最頻値が得られなければデータ範囲全体     Set rDelRow = rTable   End If   ' 削除確認してOKなら削除   If Not rDelRow Is Nothing Then     rDelRow.EntireRow.Select     If MsgBox("削除OK?", vbOKCancel + vbExclamation) = vbOK Then       Selection.Delete Shift:=xlShiftUp       Selection.Cells(1).Select     End If   Else     MsgBox "削除対象はありません.", vbInformation   End If   ' 後始末   Set rTable = Nothing: Set rDelRow = Nothing   Set Dic = Nothing End Sub

yuichi8
質問者

お礼

KenKen_SPさん、こんにちは。 マクロの中で文字の最頻値以外の文字列の行を削除する必要があったので、質問させていただきました。 示していただいたコードですが、細かい場合分けまで考慮していただき参考になりました。 ありがとうございます。

その他の回答 (1)

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.1

要は、先頭4文字でもっともダブりが少ない文字列を抜き出すということですね。私はよくDictionaryやCollectionを使います。名前つき配列 というものです。同じ名前では登録できないので、先頭から4文字を加えて、全部同じなら1つ、全部異なるなら、4つになります。 A列の記載があるので、Excelの前提です。(試してません^_^; dim rg as Excel.Range dim dic as Scripting.Dictionary dim adrs as String dim i as long dim lcnt as long set rg = ActiveSheet.Range("A1") do while rg.text <> "" set dic = New Scripting.Dictionary for i=1 to 4 dic.add mid$(rg.text,i,1) 'ダブってもエラーにならなかったはず... next if (lcnt < dic.Count) then lcnt = dic.Count adrs = rg.address end if set rg = rg.Offset(1,0) loop

yuichi8
質問者

補足

ctpzrさんありがとうございます。 試してみましたが、2行目の "as ScriptingDictionary"のところで"ユーザ定義型は定義されてません"とエラーが出てしまいます。 どのように対処したらよいでしょうか?

関連するQ&A

  • 文字列検索とピックアップ

    EXCELの表があります。 今、この表のA1~A100までにある特定の文字列”αβγ“を含んだセル(含んだとしても1回のみ)と含まないセルがあります。含んだセルのある行のみを残して、他の行を削除したい。このための簡単な操作(処理)は何か? 一方法として、文字列検索をかけ、ピックアップされたものについてある列を使い1をたてるなどしてからソートしピックアップする以外の方法でかんがえつくものを教えてください。

  • エクセルにて 文字列を参照し検索して値を返す方法。

    ある列から文字列を参照し、参照した文字列を他の列から検索し、検索行の指定した列の値を返したいと思います。   A B C D 1 林 2 森 3 根  林 5 4 根   梨 3 例えば、B1に答えを返したいと思います。 条件は、A1の文字列(林檎)と同じ文字列のものをD列から検索し、検索されたら、その行のE列の値を返したいのです。 答えは5なるようにしたいです。 またA列の文字群は変化するので、特定な文字検索というよりは、セルにはいっている文字列を検索したいです。 たいへん困っております。分かるかたよろしくお願いします。

  • 特定の列に特定の文字があるとき

    VBAについてです。 たとえば、エクセルのA列に「あいうえお」という文字があったとき その行を削除したいという場合 素人ながらVBAを真似てみたら、A列以外のところに「あいうえお」が 入っている行も削除されてしまいました。 あくまでA列にその文字があったときにだけ削除したいのですが どのようにしたらいいのでしょうか。 InputBoxを使っていたら、どの列に文字が入っていても 削除されてしまい困っています。

  • VBA/FIND関数を使っての先頭文字列の検索方法

    エクセルVBAにてFIND関数を使って、 文字列検索⇒コピー&ペーストのマクロを作成しているのですが、 どうしても、先頭文字列から検索をする方法がわかりません。 たとえば、 あいうえお いうえおあ おあいうえ えおあいう という文字列から「あいう*」を検索したい場合、 1行目だけを抽出したいのですが、 1,3,4行目が抽出されてしまいます。 find関数では先頭文字からの検索はできないのでしょうか? もし、不可能な場合、先頭文字からの検索を行うにはどのように行えばよいでしょうか? アドバイス、よろしくお願いいたします。

  • EXCEL 関数で算出した値を文字列にしたい

    エクセル2003です。 例えばA1のセルでOFFSET関数を使い、A2の値を参照しています。 ただし、A2を含む2番目の行は全て不要であるため、削除しなければ なりません(非表示にするのではなく、削除したいです)。 ここで、A2の行を削除すると参照先がおかしくなってしまうため、 A1には関数で取得した値そのものを文字列として置換したいです。 このようなことは可能ですか?

  • 特定の文字列を含む行だけ削除する方法?

    いつもお世話になっています。 Unixであるテキストファイルから、 特定の文字列を含む行(レコード)だけを 削除する方法を教えてください。 現在、grepを使って、いろいろ試しているのですが、 正規表現で、 ”***”を含まない行(レコード)だけを 切り出すとう正規表現の説明が見あたりません。 "^**"は、**以外の文字を検索できるようですが、 文字列に対しては、使えません。 grep以外の方法でも良いのですが、 なるべくシンプルにできる方法がありましたら 教えてください。 宜敷お願いします。

  • 文字列の検索高速化について

    大容量の文字列から文字列を検索するのに四苦八苦しております。 現在は文字列を構造体→メモリを確保でなんとかやっておりますが、データの容量が大きい為、時間が掛かりすぎてしまいます。 データ 70文字×30000行程度(行数可変)の文字列ファイル(すべて半角英数) 検索する側、検索される側共に同じファイルを使用します。 検索する側から一行ずつ文字列を取得→特定のカラムから文字列を抜き出す→検索される側からヒットした行を抜き出す→別処理を行う (検索に使用した行はスルー、検索される側には検索文字列が複数存在する可能性あり→すべて抜き出したい) また、抜き出した行は検索する側、される側共に次以降二重処理して速度が遅くなってしまうかと思うので、できれば削除したい。(現在は二重処理も致仕方ないとしてそのままやっています) 過去ログを読むとハッシュテーブルが良いかと言われていますが、このような場合はどのようなアルゴリズムが良いのでしょうか。 質問がわかりずらく申し訳ないですが、アドバイスを頂ければと思います。 また、使用方法等が詳しく記載されているページ等がありましたら教えて頂ければ幸いです。

  • 複数の文字列を検索

    あるログファイルの文字列を取得して。検索でヒットした文字列行 を返すスクリプトを作成しております。 検索:"OK"    日付 対象行 : OK! Tue Jul 19 文字列"OK"は普通に # grep "OK" ログファイルPath で検索できますが、 文字列と日付を両方引っ掛ける場合は・・・ grep -e "OK" -e env LANG=c date -u +"%a %b $d" ログファイルPath 当然コマンドエラーになります。 dateコマンドから日付を取得して、grepにて引っ掛ける方法を知りたいので すが、お分かりになる方、ご教授お願い致します。

  • Excelで特定の文字列を含む行を削除する

    ある列に入力されている文字の中で、指定の文字列が含まれる行全体を削除して、上方向に詰めたいです。 具体的には、文字列の先頭にスペースがなく、"URL" 、"EMAIL" のどちらかが含まれる場合です。

  • バイナリファイル内の文字列を検索したい

    初心者で恐縮ですがよろしくお願いします。 入力された値でバイナリファイル内検索し、その値がある行を特定したいのですが、file_get_contentsしてみても歯抜けになってしまっていて、そのままの状態で文字列として取得することができません。↓でPHPはバイナリファイルも文字列として検索でいるとあったんですが・・・  http://blog.asial.co.jp/707 バイナリファイルはphpやjavascriptが該当すると認識しているんですが、正しいでしょうか?htmlゃcssファイルもバイナリファイルと言っていいんでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう