文字列中の半角カタカナ文字だけを半角スペースに置換

このQ&Aのポイント
  • EXCELのVBAを使用して、文字列中の半角カタカナ文字だけを半角スペースに置換する方法が知りたいです。
  • また、その他の文字列(半角英字や数字)はそのまま残すように処理したいです。
  • カタカナ文字の数が多い場合、どのようにカタカナ文字の候補を定義すれば良いかわかりません。
回答を見る
  • ベストアンサー

文字列中の半角カタカナ文字だけを半角スペースに置換

文字列中の半角カタカナ文字だけを半角スペースに置換し、 「それ以外の文字列」だけをそのまま残して整形したいのです。 EXCELのVBAで処理できますか ? (Sheet1に文字列がある状態でSheet2に完成形を作成する) 「それ以外の文字列」とは、半角の英語(A,a,B,b)や半角数字で 全角や日本語漢字などはありません。 カタカナ文字の数が多いのでどのようにカタカナ文字の候補を 定義すれば上手く処理できるかイメージ出来ません。 以下に実際に近い例文及び完成形(整形後)のイメージです。 完成形は、イメージなので間違っているところがあると思われます。 整形前 Sheet1 ----------------------------------------------------------------- ワロイイアアー ー ー ーアアイイロワ ロイ゚ ゚゚ ワワイイイイワワ アー p r e s e n t s ーア ワワイイイイワワ ゚゚ ゚イロ ゚ワ ワロ゚゚゚ ゚゚ロイアー゚ ゚ーアイロ゚゚ ゚゚゚ロワ ワ゚  ゚ ゚゚ ゚゚ ゚  [ Turget 1 ] [ URL : http://www.gdbps.com.jp ] [ Doom : Windows ] ワロイアー   ーアイロワ ワロイイアアー ー : T A R G E T : ー ーアアイイロワ ロイ゚ ゚゚ ワワイイイイワワ アー ーア ワワイイイイワワ ゚゚ ゚イロ ゚ワ ワロ゚゚゚ ゚゚ロイアー゚ : LINE OF SETING : ゚ーアイロ゚゚ ゚゚゚ロワ ワ゚  ゚ ゚゚ ゚゚ ゚  ワワ ゚ワ ワ゚ ワワ ワロイイイイロロワ ワアー ーアワ ワロロイイイイロワ 整形後 sheet2 -------------------------------------------------------------- p r e s e n t s [ Turget 1 ] [ URL : http://www.gdbps.com.jp ] [ Doom : Windows ] : T A R G E T : : LINE OF SETING : ------------------------------------------------------------------

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.6

> 上記の方法で調べたら「20」とでました。 20は半角スペースですので先頭に半角スペースが含まれてコピペされてると思います。 式を以下に変更(TRIMは前後のスペースを削除します)してみてください。 =DEC2HEX(UNICODE(TRIM(どこかのセル))) また、「 .Pattern =」で指定する文字コードの前には「\」だけではなく「u」が必要です。 \u文字コード です。 なお、その文字がどの文字カテゴリなのかお知りになりたい場合は、IMEパッドを開いて文字一覧からそのコードを探してみてください。 上記の式でコードが出たらUnicodeの中にあると思います。 たとえば半角カタカナの「ア」のコード「FF71」を探す場合「U+FF70」の行の「1」の列になります。 探した文字コードを一番上の行で表示したときに左のツリーで選択されたものがカテゴリーになります。

NuboChan
質問者

お礼

kkkkkmさん、何度もありがとうございます。 >先頭に半角スペースが含まれてコピペされてると思います。 おっしゃるように半角スペースが最初に入っていました。 訂正してチェックすると問題の文字コードは、  kkkkkmさんが書き込みした「F8F2」でした。  \uF8F2 を追加して完成しました。 コードを追加する方法も理解できたので以後何とかなりそうです。 改めてお礼申し上げます。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.5

変換したA列のデータは元の文字数分半角スペースがあります Ws2.Cells(i, "A") = " " だと半角スペース1個だけ対応になりますので、半角スぺースの文字数分を比較するようにします。 また、行を削除する場合は、最後の行から削除しないと抜けが出ます。 たとえば、3行目の指示で3行目を削除した途端に元の4行目が3行目に、5行目が4行目になります。なので、次の4行目への指示は元の5行目への指示となり元の4行目がスルーされます。 以下は対象A列のセルにデータが無い場合は削除しないパターンです。 Dim i As Long, FRow As Long FRow = 1 Application.ScreenUpdating = False For i = 400 To FRow Step -1 If Ws2.Cells(i, "A") <> "" Then If Ws2.Cells(i, "A") = String(Len(Ws2.Cells(i, "A")), " ") Then Ws2.Rows(i).Delete End If Next i Application.ScreenUpdating = True

NuboChan
質問者

お礼

追加のアドバイスありがとうございます。 >四角に×になっている文字コードがわかれば OKWAVEに投稿する前は、見かけは四角でXのコードでは無いのですが   OKWAVEに投稿するとそのような見え方になりました。    >=DEC2HEX(UNICODE(どこかのセル))としたらわかります 上記の方法で調べたら「20」とでました。   以下のように変更してみましたが、「20」相当の文字コードの部分は     半角スペースに置換されなかったです。       (どこか間違ってますか ?)    .Pattern = "[\20\uFF61-\uFF9F]+" ---------------------------------------------- >対象A列のセルにデータが無い場合は削除しないパターンです。   「行を削除する場合は、最後の行から削除しないと抜けが出ます。」    言われてみると先頭から削除する方法は的外れでした。    (説明されると、「なるほど」と納得しました。)   データが無い場合は削除しないは、発想に全く無かったのです。   早速、コードを変更して改行のない整形分が出来ました。    (後は、見やすいように適当に改行を手動で入れる方法で十分です。)  

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.4

No1の一部訂正です。 連続した文字列を空白一個に変換してました。 myStr = Replace(myStr, Match.Value, " ", , 1) を myStr = Replace(myStr, Match.Value, String(Len(Match.Value), " "), , 1) に変更してください。 また、四角に×になっている文字コードがわかれば (その文字だけどこかのセルにコピーして =DEC2HEX(UNICODE(どこかのセル)) としたらわかります) .Pattern = "[\uFF61-\uFF9F]+" のところを コードがF8F2でしたら .Pattern = "[\uF8F2\uFF61-\uFF9F]+" にして試してみてください。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Excel関数では無理でしょう。 (特別のソフトを使わなければ)1文字単位の繰り返しの考えを採らないといけないので。 ーー 正規表現の回答は出ています。 ーーー Lile演算子を使う、による回答を上げる。 標準モジュールに Sub Sample1() Dim s As String lr = Range("A10000").End(xlUp).Row For i = 1 To lr s = "" x = Cells(i, "A") For j = 1 To Len(x) If Mid(x, j, 1) Like "[ア-ン]" Then s = s & " " Else s = s & Mid(x, j, 1) End If Next j Cells(i, "B") = s Next i End Sub 例データ  A列各セルに、データがあるとする。 B列が結果がでます。 ーー WEBに、記事がたくさんある事項ですよ。 もっとWEB照会を使え。検索語は like演算子 カタカナ vba カタカナ 判定 など。

  • kzr260v2
  • ベストアンサー率48% (789/1622)
回答No.2

今回のご要望を満たす仕組みとして、以前から正規表現というものがあります。特殊な文字検索が可能で、文字コードの並び範囲を指定することができます。例えば、半角カナでしたら、[ヲ-゚] という表現になります。以下の文字コード表を参照ください。「並び」と説明した意味が分かると思います。 しかし、Excelは正規表現に対応してないようですので、Windowsの標準機能ならPowerShellを使うか、正規表現に対応したテキストエディタなどのソフトを使うか、Excelに他者が作成した正規表現対応モジュールを追加する、このような方法になります。 PowerShellは、スクリプトといういわばプログラミングをする、というイメージになります。PowerShell自体を扱うことの慣れが必要になります。 まずは、以下のようなキーワードで、Googleなどを検索して、 PowerShell 初心者 次に、 PowerShell テキスト 文字列 置き換え 正規表現 このような検索をすることが考えられます。 テキストエディタを探すのは比較的簡単です。 テキストエディタ 正規表現 テキストエディタ 正規表現 フリーソフト このような感じです。使い方も、それほど難しくないと思います。 Excelに正規表現機能を追加する方向なら、 Excel 正規表現 このようなキーワードが考えられます。 私の個人的な考えとしては、Excelに他者が作成した機能をすることには、迷いがあります。Excelは巨大なソフトウェアですし、仕事で使用する重要なソフトウェアです。不安定になるのは大変困りますので、テスト用の別のパソコンが使えるなら、そちらでのみ試したい、そんな方向の方法です。 以上、参考にならなかったらごめんなさい。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.1

質問文で一部文字が四角に×になっているもの(外字?)が何か不明なので変換されませんがそれ以外は以下のコードで変換できると思います。 Sub Test() Dim c As Range Dim myStr As String Dim Match As Object, Matches As Object Dim Ws1 As Worksheet, Ws2 As Worksheet Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") With CreateObject("VBScript.RegExp") .Pattern = "[\uFF61-\uFF9F]+" .Global = True For Each c In Ws1.Range("A1:A20") '実際の範囲を指定してください。 myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) For Each Match In Matches myStr = Replace(myStr, Match.Value, " ", , 1) Next Match Ws2.Cells(c.Row, c.Column).Value = myStr End If Next c End With End Sub 参考 https://www.moug.net/tech/exvba/0140015.html

NuboChan
質問者

お礼

kkkkkmさん、コードの提示ありがとうございます。 お陰様でやりたいことはできました。 実際の整形シートを見直すと行に何も表示されない行が多数あって  これを削除するためにコードを追加したのですが   上手く機能しません。  どこが間違っているのでしょうか ? Sub Test_1() Dim c As Range Dim myStr As String Dim Match As Object, Matches As Object Dim Ws1 As Worksheet Dim Ws2 As Worksheet Set Ws1 = Sheets("Target") Set Ws2 = Sheets("整形") With CreateObject("VBScript.RegExp") .Pattern = "[\uFF61-\uFF9F]+" '正規表現で半角カナの文字リスト .Global = True 'サーチ範囲は任意で(A400) For Each c In Ws1.Range("A1:A400") myStr = c.Value If Len(myStr) > 0 Then Set Matches = .Execute(myStr) '半角カナを空白に置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, " ", , 1) Next Match Ws2.Cells(c.Row, c.Column).Value = myStr End If Next c End With  ’空白のセルは行を削除 Dim i As Long i = 1 Application.ScreenUpdating = False For i = i To 400 If Ws2.Cells(i, "A") = " " Then Ws2.Rows(i).Delete Next i Application.ScreenUpdating = True End Sub

関連するQ&A

  • 文字列にカタカナがあるかどうかの関数

    A列に入力されている文字列の中にカタカナ(半角,全角含む)が含まれている場合Errorを返す関数ってありますか? 文字列は何文字というのは決まっていません。

  • 文字列内の記号、スペースなどを削除する方法

    エクセル2000 OS:WinXPpro 本人の技量レベル:VBAはコピペして実行しても、修正が出来ないので、なるべく関数で処理したい。 半角カタカナ英数だけの文字列を作りたいのです。 元のデータには()などの記号、句読点、スペース等が含まれています。 一応TRIM関数で余分なスペースは削除しましたが文字列中の半角スペースが残っています。 これを半角カタカナ英数だけを残してベタの文字列にしたいのです。

  • 「Exel」で、指定した列が常に「半角カタカナ」で入力されるようにしたいのですが

    「Exel2000」を使っているのですが、セル(又は列)ごとに 入力設定が常に「半角カタカナ」になるよう、指定することは出来るのでしょうか? 「セルの書式設定」の「表示形式」では、数値や日付などの分類はあっても 文字入力の指定が出来るような項目はありませんよね? 他の列は「全角ひらがな」で入力していても、その列に来ると自動的に 半角カタカナで入力されるようにしたいのですが…。

  • 半角カタカナを全角カタカナに変換したい

    Windows2000/Microsoft Excel2000です。 入力されている文字列のカタカナが半角になっているのを 全角に一括変換する数式はありますでしょうか? 英数字は半角のまま残したいのですが。 JISを使うと英数字も全角になってしまいます。 ヘルプいただけると大変助かります。

  • 半角カナの文字列操作について

    通常10桁の半角カナの文字列があった場合下記のように String i = "イイイイイイイイイイ"; i.substring(0,5) + ","+i.substring(5,10) Systemout.println(i); として結果を イイイイイ イイイイイと文字列を分割しているのですが 10桁の文字列を半分に区切ろうとした場合 6文字目に濁点が存在した場合 String i = "イイイイバイバイ"; i.substring(0,5) + ","+i.substring(5,10) 結果が イイイイハ ゛イバイ と バの濁点とハが分割されてしまいます。 この半角カタカナの文字列でこの現象を 回避するために 文字列の中で濁点がヒットした場合 文字列の濁点を含んだ文字列の前か後ろで イイイイ ハ゛イバイ もしくは イイイイハ゛ イバイ のように 分割させたいのですがなにか良い方法はありませんでしょうか?? どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • 正規表現:囲われた文字列の置換

    シングルクオーテーションで囲われた文字列のシングルクオーテーションの前に文字を追加するように、正規表現を用いて置換しようと考えています。 全角文字は[^\x01-\x7E]で検索できるのはわかったのですが、シングルクオーテーションで囲われて、全角文字を含む場合という表現ができません。 下記のような、文字列を対象としています。置換をするのは、全角文字を含む文字列のみです。  全角文字のみ  半角文字のみ  全角半角文字両方 下記ののように置換したいです。 置換前: '全角文字や半角文字','testです','test'.'テスト'.'てすとtest','123' 置換後: A'全角文字や半角文字',A'testです','test'.A'テスト'.A'てすとtest','123' よろしくお願いします。

  • phpの半角カタカナの文字化け

    宜しくお願いします。 phpで変数に代入した文字列が半角カタカナだとhtmlからpostで渡された一回目の表示は普通に表示されるんですが、そこから先のphpにsubmitで引き渡される際(もしくは、同じphpファイル内でsubmidで送られた際)に、代入した文字列が化けてしまいます。perlでフォーム作ってた時はこんなエラーは発生しませんでした。 携帯用のフォームとして作っているので、出来れば半角カタカナで表示できると文字列がコンパクトになるので助かるんですが・・・作ってる環境は、win2000で、サーバのphpは4.1.2-p4となっています。phpinfoで調べてみた内容は、 mbstring.detect_order auto auto mbstring.func_overload 0 0 mbstring.http_input auto auto mbstring.http_output SJIS SJIS mbstring.internal_encoding EUC-JP EUC-JP mbstring.substitute_character no value no value となっております。 何卒、アドバイスの程、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • エクセルでひらがな全角~カナ半角の相互への置換方法について

    エクセルの文字列の置換ですが、 ひらがな全角文字からカタカナ半角文字への置換。 また、その逆にカタカナ半角からひらがな全角への置換。 方法があれば教えてください。 よろしくお願いいたします。

  • エクセル 半角英数6文字以上 8文字の入力制限

    エクセルのあるセル内に入力させた文字のチェックにあたり で半角英数(0,1,2,3,4,5,6,7,8,9)と(a,b,c,d,e,f,g,h,i,j,k,l,n,m,o,p,q,r,s,t,u,v,w,x,y,z) (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,) の組み合わせによる6文字以上8文字以内、さらに数字のみの 組み合わせを禁止したチェックを行ないたいのです。 現状 LENB関数で6未満 LENB関数で9以上をエラー ISNUMBER関数でTRUEの場合エラーとしているのですが 半角カタカナや記号に対してチェックをかける関数が 分かりません。 入力されてくるセルに対するチェックの関数は 半角カタカナチェックの関数式 記号チェックの関数式と別に分けていただいても構いませんので アドバイスいただけましたら幸いです。

  • 【VBA】 文字列の中から指定の文字列を取り出す

    VBAで文字列から指定の文字のn番目からn+1番目までの文字列を取り出すことは可能でしょうか? A1セルに下記の文字列があった場合、「1番目の半角スペースから2番目の半角スペースまでの文字列」を取り出したいのです。 5 53 00 8R この場合、53を取り出したいというわけです。 また、可能でしたら「最後の半角スペースから文字列の最後まで」を取り出す方法も教えていただけるとありがたいです。 この場合は8Rとなります。 InStr関数を使えばできるかもと思ったのですが、できそうなものが思い浮かびません。 どなたか教えていただけませんでしょうか。 よろしくお願いいたしますm(_ _)m

専門家に質問してみよう