- 締切済み
エクセルでの削除
エクセルをあまり使い慣れないのですが 以下のような削除を一括して 削除する方法を教えてください。 ahisxxxxxxxxxxxbsrema○○○○xxxaxisite ahisなどのアルファベット部分が全てのセルで同じ文字 xxxxxの部分が異なる文字 ○○○○の部分がセルで異なりますが この部分のみを残して削除したいのですが 範囲の指定とかできれば簡単にできそうなのですが 異なる文字を表す方法があるのでしょうか? 例えば上記の××を含めて指定する方法があったら 教えてください。 今回は○○の部分のみ残す方法を知りたく また 現在まで上記のような指定ができれば 簡単と思っていましたので ついでにお聞きしています。 よろしく お願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 xxxaxisite(文字数変動、半角英数字のみ)を削除できればよいのですが。 以下は、ここの回答を最初に書くときから用意していたコードです。パターンを書き換えることによって、だいたいのことは対応できます。得意技ほどでもないのですが、VBAでは、あまり器用に扱う人は多くないようです。理由は、VBScript.RegExp 自体が中途半端な仕様だからですが。 正規表現: xxxaxisite(文字数変動、半角英数字のみ)以外 パターン: "[^\d\w]+" 日本語と英数字でこの部分の区分けができた場合: "[\u3041-\u30FE\u4E00-\u9FFF\uFF61-\uFF8F\u25A0-\u25EF]+" このようにして、正規表現のメタキャラクタで書ければ、だいたいの問題は解決できます。 今回、改めて、文字全部をしらべてみました。このコードは、Unicode で範囲を括っています。Unicode では、中国・韓国の漢字も含まれてしまいます。VBAでは、Unicode の範囲を括れません。実際の文字を入れても可能ですが、掲示板の正確上、Unicode を全部出せません。 正規表現は歴史的に長いので、とても洗練されたパターンが既に出来ています。 ユーザー定義関数の方は、応用が利くようにいろんなオプションが付いています。 このコードは、どこに入れても動きますが、標準モジュールに入れておくと良いです。 '------------------------------------------- Sub Test1() Dim c As Variant ''半角文字・数字以外 Const mPTN As String = "([^\d\w]+)" '日本語文字 ''Const mPTN = "[\u3041-\u30FE\u4E00-\u9FFF\uFF61-\uFF8F\u25A0-\u25EF]+" With ActiveSheet For Each c In .Range("A1", .Cells(Rows.Count, 1).End(xlUp)) c.Offset(, 1).Value = PickUp(c.Value, mPTN) Next c End With End Sub 'ユーザー定義関数 Function PickUp(strTxt As Variant, Ptn As String, Optional Bln As Boolean = True) Dim buf As String Dim Matches As Object Dim Match As Object With CreateObject("VBScript.RegExp") strTxt = Trim(StrConv(strTxt, vbNarrow)) 'パターン .Pattern = Ptn .Global = Bln 'False にすると、まとまった単語 '.MultiLine = False 'マルチライン .IgnoreCase = False '大文字・小文字区別なし If .Test(strTxt) Then Set Matches = .Execute(strTxt) For Each Match In Matches buf = buf & "," & Match.Value Next Else buf = "" End If End With If Len(buf) > 1 Then buf = Mid$(buf, 2) End If PickUp = buf End Function '-------------------------------------------
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #4の説明を合わせて、もう一度読み直してみました。 元の質問 「ahisなどのアルファベット部分が全てのセルで同じ文字xxxxxの部分が異なる文字 ○○○○の部分がセルで異なりますがこの部分のみを残して削除したいのですが」 ------------------------------------------- 題材: 1、明日の(天気はくもりだけど)楽しい遠足((にしたい))とおもう。 2、明日の(遠足はいつも遊びにいくところ)楽しい遠足((に絶対になる))とおもう。 ------------------------------------------- 二つの文章の差を取る方法があります。一語ずつ、比較していきます。 1~3語までで、「明日の」が、ヒットします。5語ではヒットしません。「明日の」は、キーワードとして残ります。 次に、「天」×、次の「気」×と、どんどん調べていくのです。ヒットしたら、二語・三語と増やしていきます。しかし、「も」などはヒットしますが、二語になるとヒットしません。こんなふうに探していく方法があります。ただ、そういうコードを作るのは、私自身はためらいを感じます。 '------------------------------------------- 最初の質問内容に戻りますが、 ahisxxxxxxxxxxxbsrema○○○○xxxaxisite ahis, bsrema,axisite は既定の単語, x それぞれは変化し既定しない、長さも既定しない。 ○○○○ は、他の単語とは共有であっても、変化値であり、単語数も決まっていない。 '------------------------------------------- xxxaxisite のxxx は、単語数自体が決まっていると考える人もいたようですが、もともと変化値ですから、単語数が決まっていない、と考えたほうが自然だと思います。 ということは、 質問内容からは、 ○○○○xxxx は、どちらも変化するので、○○○○|xxxx の区切れが分かりません。その先の規定値直前までを範囲するなら、可能です。しかし、そうではないわけです。 ○○○○|xxxx の区切れを別けなくてはなりません。それを手がかりとするには、単独では、文法解析のような作業が必要になります。 例えば、「楽しい遠足」の次は、必ず、ひらがなの助詞になりすまね。 短歌や和歌でなければ、「楽しい遠足」のままでは終わらない。仮に、「楽しい遠足旅行」であっても、次は、助詞が来ます。 1、__________明日の(天気はくもりだけど)楽しい遠足((にしたい))とおもう。 2、明日の(遠足はいつも遊びにいくところ)楽しい遠足((に絶対になる))とおもう。 日本語の場合は、かなり高い割合で分解は可能だと思います。ですが、これは、単に、例を出したサンプルだと思います。これをそのまま実際の質問とは受け取れませんから、メタキャラクタを使ったコードを出しても、そう決め付けはできないと思います。 質問の主旨としては、共有(共通)する単語を出したいということだと思います。 例えば、有名な検索ツールとしては、大学で無料で配布されている、KWIC やコンコーダンスツールというものがあります。特に、コンコーダンスは、聖書に使用されるのは、ご存知の方も多いかと思います。 しかし、そのようなツールでも、単語そのものは、ユーザー任意で入れます。また、日本語検索ツールで、Unix 系のNamazuシステムは、文法的な検索単語を抽出が行われますが、それには、辞書が必要です。決まっていない長さの単語で、それぞれの行から共有する単語を拾い出せというようなことは、質問としてはありえるにしても、私には、ExcelやVBAには、単独では、あまり現実的ではないような気がします。私は、こういう手法は、自分のプログラミング・スタイルに合わないので、避けたいと思うのです。 素朴な疑問として、なぜ、人(ユーザー)がそれを決定できないのか、と思うのです。そういう点で、私が質問を読み違えているのか、もう少し詳しい説明が必要だと思います。
補足
ご親切にありがとうございます。 やっとおしゃっていたことが 理解できました。 ○○○○xxxx が全てアルファベットであった場合 文字数も分からないと その区切りは 今回の場合 全く質問者の私の気分によることに なってしまうわけですね。 我ながら お恥ずかしい限りです。 今行っています作業は ○○○○の部分に日本語が主にきます。 たまにアルファベットもきますが これが日本語だけとしまして xxxx の部分がアルファベットと数字だけの場合はどうなるでしょうか? ahisxxxxxxxxxxxbsrema○○○○xxxaxisite 以前教えて頂いた方法で文字数を多くすると○○以降は抜き出せるように おもいましたが。 そうしますと多少の例外はありますが(作業上神経は使いますが) 日本語と英数字でこの部分の区分けができた場合はどうなるでしょうか? ○○○○ xxxaxisite 今回のみにかぎれば xxxaxisite(文字数変動、半角英数字のみ)を 削除できればよいのですが。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 ahisxxxxxxxxxxxbsrema○○○○xxxaxisite ○○を残せ この質問内容で、正答が出るとは思えないのですが。 もし、回答するなら、それは、単なる回答者側の「キメウチ」によって可能だと思うだけです。 ------------------------------------------- 同じような質問も書かれていますが、こちらも書かせていただきます。 [書かれている条件の、不足している部分] ・ahisなどのアルファベット部分が全てのセルで同じ文字 -- bsrema の説明はないです。「など」としているなら、bsrema が入るだろうと予測するだけですが、ahis は、ここでは関係ないです。 --もし、複数の文字列から共通文字を探せというなら、マクロですが、かなり難しくなります。 ・○○の数が決められていないから、○○○○ は、果たして4個なのか、2個なのか、書かれていません。 --その文字数そのものを探し出すのなら、複数の文字列から、共通文字をマクロで比較しなければなりません。 ------------------------------------------- 「キメウチ」の例 =MID(A1,FIND("bsrema",A1)+6,4) 直前の文字---> "bsrema" 直前の文字数---> 6文字 検索文字数---> 4文字
補足
二名の方よりご指摘頂きましたので 自分の質問を読み直すと 確かにわかり難い質問になってしまっています。 とりあえず アルファベット部分は全て同一文字のつもりで質問しております。アルファベットは全てですのでbsrema部分は同一文字のつもりで質問しております。例えを上げたのが災いしたように思います。 ○○○○の部分の文字数は変動可能がよかったのですが かなり複雑になるようで残念です。現状ではそこまでの理解は 私にとってかなり難解と 思っています。この部分は簡単な文章が入り文字数はかなりばらつきます。価格などには Wendy02さん、KURUMITOさんに教えて頂いた方法は 非常に有用だとおもうのですが 置換で行えばとおもいますが これらを一括して指定できる方法があれば あらゆる面で非常に助かるのですが ないでしょうか? 例えば ahisxxxxxxxxxxxbsrema○○○○xxxaxisite 1、明日の(天気はくもりだけど)楽しい遠足((にしたい))とおもう。 2、明日の(遠足はいつも遊びにいくところ)楽しい遠足((に絶対になる))とおもう。 ( )と(())の部分が異なりますが この部分を指定できれば(文字数は 変動します) 広範囲に対応できるのですが エクセルで指定する方法は ないでしょうか? いまさらですが エクセルは2002 オフィスXpのものです。
- imogasi
- ベストアンサー率27% (4737/17069)
補足要求。 質問説明が不十分。 データの特徴を判るのは質問者しかいない。 1例しか挙げてなくて、特徴はわからない。 エクセル関数や、VBAは知らなくても、大人の常識で○○の部分の特徴を質問者自信が考えて文章化しないと。読者・回答者に投げてはダメでしょう。 ルールなきところに関数もぷろぐらむも役立てられないのは常識。 だからルール・規則性を探すこと。 ○○の部分は文字数が一定か、ぐらい書かないと。 ーーー (1)○○の部分始めは、bsremaの出現から右に6文字目のようだがそうか? (2)axisite出現から左に4文字目が終わりのようだがそうか? (1)(2)について補足してほしい。
- KURUMITO
- ベストアンサー率42% (1835/4283)
式が間違っていました。 =IF(A1="","",MID(A1,FIND("bsrema",A1)+6,FIND("xxxaxisite",A1)-FIND("bsrema",A1)-6)) また、xxxaxisiteでxxxは任意の文字である場合には =IF(A1="","",MID(A1,FIND("bsrema",A1)+6,FIND("axisite",A1)-FIND("bsrema",A1)-9))
- KURUMITO
- ベストアンサー率42% (1835/4283)
A列に文字が入力されているとしてB1セルには次の式を入力し下方にオートフィルドラッグします。 =IF(A1="","",MID(A1,FIND(A1,FIND("bsrema",A1)+6,FIND("xxxaxisite",A1)-FIND("bsrema",A1)-6)) また、xxxaxisiteでxxxは任意の文字である場合には =IF(A1="","",MID(A1,FIND(A1,FIND("bsrema",A1)+6,FIND("axisite",A1)-FIND("bsrema",A1)-9))
お礼
ご連絡遅くなって非常に申し訳ありません。 ばたばたしておりましてなかなか熟慮する時間がないのが現状で 申し訳なく 思います。 最初から私の質問ががまとに当たるのをまっていらしたようで 恐れ入ります。 教えて頂いた内容は 現状の私の実力では 意味不明の部分が多くあります。特に前半のVBAとかメタキャラに困惑しております。 作成して頂いたものを理解して自分で多少の変更を加えられるように なればかなり広い範囲で使用できるような気がしています。 今は エクセルにとりあえず入れて動かしたいのですが ただいま 思考錯誤中です。 エクセルが難しいとよく効きますが 使い方しだいで恐ろしく広範囲な 作業ができるだろうと 確信したしだいです。