• ベストアンサー

エクセルでの文字列の検索と追加表示していきたい。

   A  B    C  1  い   2  ろ  3  い  1 4  に  5  ほ  6  い  1、3 7  と  8  ろ  2 9  り 10 に  4 11 い  1,3、6 12 ろ  2、8   文字列A内で重複するものの行の番号を上のように追加していきたいのですが、可能でしょうか? 自分でいろりろ試してみましたが、ダメでした。 この方法を教えてください!

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

  • ベストアンサー
noname#52504
noname#52504
回答No.3

かなり強引な方法ですが、作業列を使えば、数式でもできなくはないです。 各列1行目を B列:作業列1 =COUNTIF($A$1:A1,A1) C列:作業列2 =A1&"【"&B1 D列:作業列3 =IF(B1=1,"",MATCH(A1&"【"&(B1-1),$C$1:C1,0)-1) E列:結果列 =IF(B1=1,"",IF(B1=2,"",OFFSET($E$1,D1,0)&",")&ROW(OFFSET($E$1,D1,0))) として、以下末行までフィル。 "【"のところは、「4番目の413」と「34番目の41」を区別するための区切記号なので、A列の末尾にこない文字ならば何でもOKです。 0~999までのランダムな整数15,000行についてテストしてみましたが、職場のノート(CeleronM 1.4G)で2分弱、自宅のデスクトップ(Pentium 4G)でも70秒ほど要しました。

noname#40064
質問者

お礼

できました。御礼が遅くなってしまって申し訳ありません。 VBAは理解不能でした~(涙

その他の回答 (2)

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

こんばんは。 本来、1つの語だけの検索なら、配列数式で出来ますが、複数ある場合、VBAのユーザー定義関数のようなものにするか、並べ替えなどを使わなければ不可能だと思います。以下は、ワークシートの配列数式と同じ考え方です。 これは、もしかしたら、Excel 2000 以下で、大量のデータですと、支障があるかもしれません。 '<標準モジュール> Function FindValueRows(myRange As Range, arg2 As Range) As String   Dim RangeAddress As String   Dim buf As String   Dim RowCount As Long   Dim Ar() As Variant   Dim i As Long   If IsEmpty(arg2) Or IsError(arg2) Then Exit Function     RangeAddress = myRange.Cells(1).Resize(Application.Caller().Row - myRange.Cells(1).Row + 1).Address   If Application.Caller().Row - myRange.Cells(1).Row = 0 Then Exit Function     Ar() = Evaluate(RangeAddress & "=" & arg2.Address)     For i = LBound(Ar(), 1) To UBound(Ar(), 1) - 1    If Not IsError(Ar(i, 1)) Then     If Ar(i, 1) Then       buf = buf & "," & i     End If    End If   Next i   FindValueRows = Mid$(buf, 2) End Function 私の方の使い方は、FindValueRows(検索範囲,検索文字セル) =FindValueRows($A$1:$A$12,A1) 式をドラッグして、フィルダウンコピーします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

'標準モジュールに以下のような関数を定義する '指定した範囲で指定した値がある位置をカンマ区切りの文字列で返す Public Function dupPos(r As Range, v As String) As String Dim ret As String, x As Range, pos As Long ret = "" pos = 0 For Each x In r pos = pos + 1 If x.Value = v Then ret = ret & pos & "," End If Next If ret = "" Then dupPos = "" Else dupPos = Left(ret, Len(ret) - 1) End If End Function A列にA1からデータが入っている時 B2に =JIS(dupPos($A$1:A1,A2)) の式をいれ下にフィル(コピー)する

関連するQ&A

専門家に質問してみよう