[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『特定の文字だけ残したい』(さふらん)
一つのセルの中に
田中大貴,山田太郎,山下祐介,田中次郎,・・・
と20名ほど200行に渡り入力されています。
田中さんだけを残して
田中大貴,田中次郎
と変換したいのですが、どの様にしたら良いでしょうか?
置換でできますか?
< 使用 Excel:Excel2003、使用 OS:Windows7 >
1)区切り文字でカンマ「,」でデータを分割するhttps://www.forguncy.com/blog/20170424_delimiterposition 2)各列を例えばA列にまとめる 3)2)をオートフィルタで田中*とする ではダメでしょうか?
(稲葉) 2019/03/07(木) 11:54
1つのセルに20名の名前がカンマ区切りで入っている
という事ですよね。
関数で分解しても良いのですが、
リボンのデータ⇒区切り位置を使ってカンマ区切りするか
CSVファイルとしてデータファイルを読み直すなどして
1つのセルに20人ぶんの名前⇒20のセルに各人名
と分解してはどうでしょうか。
さらに横(AA列とか)以右で最初の二文字が田中だったらその値、違ったら空白にする
田中さんだけ残したものを文字列として1つのセルに収めたいなら文字列の連結する。
セルが増えるのが嫌ならこれを一旦作成したあと、それぞれの関数を繋げていきますが、長〜くなります。
マクロでやっちゃえば楽なんですが。
(無精髭) 2019/03/07(木) 11:57
シンプルな方法だけど、田中と佐藤とか言われたとき、自分で直せるかしら? Sub test() Dim m As Variant Dim buf As String Dim r As Range With CreateObject("VBScript.REGEXP") .Global = True .Pattern = "(^|,)(田中.*?)(,|$)" ' 先頭または,の次に田中が来て、,か文章の最後で終わる最小単位 For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp)) 'A1〜A列の最後まで buf = "" If r.Value <> "" Then If .test(r.Value) Then For Each m In .Execute(r.Value) buf = buf & "," & m.submatches(1) Next m End If End If r.Offset(, 1).Value = Mid$(buf, 2) ' 隣の列に書き出し Next r End With End Sub
(稲葉) 2019/03/07(木) 12:23
あ、これじゃダメですね ↑無視してください! (稲葉) 2019/03/07(木) 12:34
Dim dt() As Variant, c As Range, i As Long, j As Long For Each c In Cells.SpecialCells(2) j = 0 Erase dt For i = 0 To UBound(Split(c.Value, ",")) ReDim Preserve dt(j) If Left(Split(c.Value, ",")(i), 2) = "田中" Then dt(j) = Split(c.Value, ",")(i): j = j + 1 Next i c.Value = Join(dt, ",") Next c End Sub (mm) 2019/03/07(木) 12:36
Sub test() Dim r As Range, temp As String, m As Object With CreateObject("VBScript.RegExp") .Global = True .Pattern = "(^|,)(田中.+?)(?=(,|$))" For Each r In Range("a1", Range("a" & Rows.Count).End(xlUp)) For Each m In .Execute(r.Value) temp = temp & "," & m.submatches(1) Next If Len(temp) Then r.Value = Mid$(temp, 2) temp = "" Next End With End Sub (seiya) 2019/03/07(木) 12:53
seiyaさんの参考にさせてもらいます。 後読み先読みがわからない・・・何度調べても理解できない
最終的にできたけど、私のは無駄が多いみたいですね。 >.Pattern = "(^|,)(田中|山田)(.+?)(?=(,|$))" >buf = buf & "," & m.submatches(1) & m.submatches(2) (稲葉) 2019/03/07(木) 12:54
Dim sLname As String '抽出する姓 Dim Narray As Variant Dim iArC As Integer 'セルに含まれる人名数(カンマ区切り)おおよそ20個 Dim sCellString As String '対象セルのデータ Dim iCounter As Integer 'セル内の人名番号、先頭からゼロスタート Dim sOutputString As String '出力文字列 Dim iTargetRow As Integer '処理対象行番号
' ====初期化====
sLname = "田中" sOutputString = "" iTargetRow = Cells(Rows.Count, "A").End(xlUp).Row '対象行をデータ最後尾行にする
' ====処理====
Do While iTargetRow > 0 '処理対象が1行目以降なら実行。ゼロ行目は無いのでLoopを抜ける sCellString = Cells(iTargetRow, "A").Value '入力されているデータを取得 If InStr(sCellString, sLname) = 0 Then 'データに対象文字列が無ければ Cells(iTargetRow, "B") = "" '空白を出力 Else '対象文字列があったので Narray = Split(sCellString, ",") 'カンマ区切りで配列に格納 iArC = UBound(Narray) '配列のデータ数 For iCounter = 0 To iArC '各要素に対して処理 If InStr(Narray(iCounter), sLname) Then '対象要素に対象文字列があれば sOutputString = sOutputString + "," + Narray(iCounter) '出力用変数に追加 End If '要素に対する処理終わり(文字列があってもなくても) Next iCounter '次の要素へ戻る End If 'セルに対する処置終わり Cells(iTargetRow, "B") = sOutputString 'カンマから始まる文字列になるが後から消そう sOutputString = "" '次のセルの処置の為空白に戻す iTargetRow = iTargetRow - 1 '一つ上の行へ Loop End Sub
(通りすがりのおっさん) 2019/03/07(木) 14:16
単純に
Sub test() Dim r As Range For Each r In Range("a1", Range("a" & Rows.Count).End(xlUp)) If r.Value <> "" Then r.Value = Replace(Join(Filter(Split(Join(Split("^" & r.Value, ","), ",^"), ","), "^田中"), ","), "^", "") End If Next End Sub (seiya) 2019/03/07(木) 14:57
1) Alt + F11でVBEを起動 2) [挿入] - [標準モジュール] 3) 右空白部分に下記コードを貼り付け Alt + Q でエクセルに戻る 4)Alt + F8 で test を選択して [実行]
Sub test() Dim r As Range For Each r In Range("c1", Range("c" & Rows.Count).End(xlUp)) If r.Value <> "" Then r.Value = Replace(Join(Filter(Split(Join(Split("^" & r.Value, ","), ",^"), ","), "^田中"), ","), "^", "") End If Next End Sub
コードはC列の値を変更するので、他のセル、例えばD列にするには
r.Value = Replace(Join(Filter(Split(Join(Split("^" & r.Val..... を r(,2).Value = Replace(Join(Filter(Split(Join(Split("^" & r.Val..... にする。
(seiya) 2019/03/07(木) 15:23
説明文一行修正
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.