- ベストアンサー
【EXCELで文字抜出】上の行と同じ部分まで
エクセルで上の行と同じ部分まで文字を抜き出したいのですが うまいように思いつきません。 ぜひアドバイスお願いします! たとえば A列に元データ B列に抜き出しということで A列 B列 ABCマート柳沼店 ABCマート ABCマート朝霞店 ABCマート ABCマート朝霞店 ABCマート 越後屋 新潟本店 越後屋 越後屋 燕店 越後屋
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 A1 に文字列があるとして、 このような式で、取り出せます。 =IF(MAX(IF(ISERROR(MATCH({"ト","屋"},MID(A1,ROW($A$1:$A$256),1),0)),0,MATCH({"ト","屋"},MID(A1,ROW($A$1:$A$256),1),0)))=0,A1,LEFT(A1,MAX(IF(ISERROR(MATCH({"ト","屋"},MID(A1,ROW($A$1:$A$256),1),0)),0,MATCH({"ト","屋"},MID(A1,ROW($A$1:$A$256),1),0))))) 配列数式ですから、一旦式を入力したら、目的の式にF2を押して、『ShiftとCtrlを押しながらEnterキー』を押します。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #4 のWendy02 です。果たして、マクロという解決方法が有効なのかはわかりませんし、質問者さんが、ここをフィードバックするかは分かりませんが、ちょっとかんがえてみました。これは、条件的には「並び替え」が済んでいないと、何の役にも立ちません。 データのある列の一番上に、セルポインターを持ってきてから、マクロを実行します。そのセルから下に範囲を選択して実行します。 現在のところ、例えば、右隣のセル A列にあるのなら、B列に出力するように作られています。 '<標準モジュール> Sub SamePickup() Dim myCol As Range, c As Range, i As Long, j As Long Dim myData() As String, buf As Variant '元のデータの一番上の場所にマウスポインターを置くこと Set myCol = Range(ActiveCell, ActiveCell.End(xlDown)) If myCol.Count = 1 Then Exit Sub For Each c In myCol.Cells ReDim Preserve myData(1, i) buf = SameAbove(c) 'ユーザー定義関数へ If c.Value <> buf Then myData(0, i) = buf If buf <> "" Then myData(1, i) = Application.CountIf(myCol, buf) End If End If i = i + 1 Next For Each c In myCol.Cells For j = LBound(myData, 2) To UBound(myData, 2) If myData(1, j) <> "" Then If InStr(1, c.Value, myData(0, j)) > 0 Then '右隣のセルに出力する c.Offset(, 1).Value = myData(0, j) End If ElseIf myData(1, j) = "s" Then c.Offset(, 1).Value = myData(0, j) End If Next j Next End Sub Private Function SameAbove(ByVal myRng As Range) Dim i As Integer, num As Integer, Ret As Variant Set myRng = myRng.Cells(1, 1) If myRng.Row <> 1 Then i = 1 Do num = InStr(1, myRng.Offset(-1).Value, Mid(myRng.Value, 1, i)) If num = 0 And i = 1 Then i = Len(myRng.Value): Exit Do ElseIf num = 0 And i > 1 Then i = i - 1: Exit Do End If i = i + 1 Loop Until i > Len(myRng.Value) Ret = Mid(myRng.Value, 1, i) Else Ret = myRng.Value End If SameAbove = Ret End Function
お礼
関数ならずとも、こちらまでご丁寧にアドバイスくださってありがとうございます。 自分でも判断したとおり条件が曖昧なのです。 関数式はうまくいきました。 こういったデータは何らか自分で加工も必要かと思いました。 VBAですが”はじめての”級の本で最近 勉強中です。 日常仕事をしていると思った通りのデータで渡されるわけではないので データ処理は奥が深いと思いました。 ◆すみません、お礼の言葉から外れてますね。
- imogasi
- ベストアンサー率27% (4737/17069)
私製関数をつくって見ました。 VBEの標準モジュールに Function samea(a) Dim cl As Range fst = "y" For Each cl In a If fst = "y" Then b = cl fst = "n" Else k = 0 For i = 1 To WorksheetFunction.Min(Len(cl), Len(b)) If Mid(cl, i, 1) = Mid(b, i, 1) Then k = k + 1 Else GoTo p01 End If Next i p01: b = Mid(b, 1, k) End If Next samea = b End Function をおきます。 結果を出したいセルに=samea(A6:A8)のように範囲指定してください。 先頭からの共通文字列を返します。
お礼
お礼のコメントが非常に遅くなり大変失礼しました。 VBEでオリジナルを作ってくださってありがとうございます。 これもまたうまく行きました。 ありがとうございます エクセルには色々なやり方があるのですね どこか必ず共通する法則が自分できちんと読めないと(事前に加工も) 関数もVBAもダメなんだと思いました。
- Sucelggug(@xyz37005)
- ベストアンサー率51% (369/715)
A列のデータを見ると“屋号”+“支店名”となってるようですが “屋号”のみ抜き出したいと言うことでよろしいでしょうか? おそらく指定の形式に抜き出すのは無理です。 仮に抜き出す条件を“上または下のデータと同じ部分があれば抜き出す”としたとして A列 B列 ABCマート柳沼店 ABCマート ABCマート朝霞店 ABCマート ABCマート朝霞店 ABCマート朝霞店 越後屋 新潟本店 越後屋 越後屋 燕店 越後屋 となってしまうはずです。 つまりA列にまったく同じデータが連続してあった場合、 A列のデータをそのままB列に代入してしまいます。 でてくる屋号が決まってるならやりようはあると思いますが。
お礼
大変失礼しました。お礼、相当遅くなりました!!(締め切り間違いしました) お詫び申し上げます。 おっしゃるとおり屋号に決まりがないのです。
- mshr1962
- ベストアンサー率39% (7417/18945)
#1のmshr1962です。 すみません。コピーする数式を間違えました。 =IF(ISERROR(FIND(" ",ASC(A2))),A2,LEFT(A2,FIND(" ",ASC(A2),1)-1)) が正解です。
- mshr1962
- ベストアンサー率39% (7417/18945)
ABCマート 柳沼店 越後屋 新潟本店 のようにスペースで分けられているなら =LEFT(A2,FIND(" ",ASC(A2),1)-1) ただし、スペースがない場合、元の文字列を表示なら =IF(ISERROR(FIND(ASC(A2),"* *")),LEFT(A2,FIND(" ",ASC(A2),1)-1),A2)
お礼
早速のご返答 ありがとうございます!! ご配慮のとおり スペース無しもあります しかし 結果が#VALUE!となってしまいます。どうしてなんでしょうか
補足
すみません!! 勘違いしていたようです うまくできました! ありがとうございました
お礼
お礼が遅れました、大変失礼しました!! 上記の式でやってみたらうまくいきました 配列式ですね。 しかし、、、素晴らしいです・・・!! ここまで思いつきもしません。 このような式が立てられるのはやはり日々の使いこなしと 才能なのでしょうか。