• ベストアンサー

シート内のひらがなを全て削除したい

こんばんは。エクセル2003です。 シート内の全てのひらがなを削除して 英数字、漢字、記号のみを残したいのですが Cells.Replace what:="あ", Replacement:="", LookAt:=xlPart Cells.Replace what:="い", Replacement:="", LookAt:=xlPart Cells.Replace what:="う", Replacement:="", LookAt:=xlPart ・ ・ ・ Cells.Replace what:="ん", Replacement:="", LookAt:=xlPart とやっていくしかないでしょうか? 何か効率のいい方法があれば教えて頂ければ助かります。 よろしくお願いします。

  • ijuhyg
  • お礼率99% (460/462)

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.6

完全に趣味の世界に入っておりますが、もっと速くならないかと、フリーのC/C++コンパイラ(BCC)で、ふりがなカット専用の関数(DLL)を作成してみました。C/C++は時々思い出したように勉強する万年初心者ですので、1日かかりましたが、#4の方法の5938msec → 4484msec に改善されました。ただ、関数を呼ぶVBAの方の作り方だけでも簡単に逆転してしまい、期待外れでした。(DLLの方も拙作だと思います) #4の方法は、そこそこ速いのだというのが結論です。

ijuhyg
質問者

お礼

何度もありがとうございます。 大変参考になりました。 私もそれくらい好きになりたいです。

その他の回答 (5)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#3&4です。確認不足ですみません。下から五行目の、 buf = Replace(buf, Mid(buf, i, 1), "", , 1) は消し損ないですので削除願います。

ijuhyg
質問者

お礼

わかりました。ありがとうございます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#3です。#1の方の方法の応用編も試してみましたので、報告まで。 Midでループを回すので、余り期待しておりませんでしたが、5秒前後とずっと速かったです。更に、位置決め打ちのワークシート関数ならもっと速くなるかと試してみましたが、13秒程度と逆に遅くなってしまいました。 Private Function funcReplaceKANA(targetString As Variant) As String Dim buf As String Dim i As Long Dim charCode As Long Dim myChar As String buf = targetString For i = Len(buf) To 1 Step -1 myChar = Mid(buf, i, 1) charCode = Asc(myChar) If (charCode <= -32015) And (charCode >= -32097) Then buf = Replace(buf, myChar, "", , 1) ' buf = Application.WorksheetFunction.Replace(buf, i, 1, "") buf = Replace(buf, Mid(buf, i, 1), "", , 1) End If Next i funcReplaceKANA = buf End Function

ijuhyg
質問者

お礼

何度もありがとうございます!

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

おもしろ半分でやってみました。お陰で明日は寝不足です。 http://hp.vector.co.jp/authors/VA023000/soft/zipcode.html から、ハイフン無し郵便番号辞書をダウンロードして、 090331_M.txt をエクセル2000に読み込んで試してみました。全部は読み込めないので、65536行×3列のデータです。2列目には若干、3列目には必ずひらがなが入っています。5年位前の遅いCeleronで、24秒弱かかりました。 Option Explicit Private Declare Function GetTickCount Lib "kernel32" () As Long Dim regEx As Object Sub replaceKANA() Dim targetString As String, patternString As String Dim startTime As Long Dim buff As String Dim targetRange As Range Dim tempArray As Variant Dim myRow As Long, myColumn As Long startTime = GetTickCount Application.ScreenUpdating = False Set targetRange = ActiveSheet.UsedRange Set regEx = CreateObject("VBScript.RegExp") tempArray = targetRange For myRow = 1 To UBound(tempArray, 1) For myColumn = 1 To UBound(tempArray, 2) tempArray(myRow, myColumn) = funcReplaceKANA(tempArray(myRow, myColumn)) Next myColumn Next myRow targetRange = tempArray Application.ScreenUpdating = True Debug.Print GetTickCount - startTime 'msec Set regEx = Nothing End Sub Private Function funcReplaceKANA(targetString As Variant) As String Dim patternString As String Dim Matches As Object, match As Object Dim buf As String buf = targetString patternString = "([ぁ-ん]+)" regEx.MultiLine = False regEx.Pattern = patternString regEx.IgnoreCase = False regEx.Global = True Set Matches = regEx.Execute(buf) If Matches.Count > 0 Then For Each match In Matches regEx.Pattern = match.subMatches.Item(0) buf = regEx.Replace(buf, "") Next match funcReplaceKANA = buf Else funcReplaceKANA = targetString End If Set Matches = Nothing Set match = Nothing End Function

ijuhyg
質問者

お礼

すごいです!できました! 寝不足のところありがとうございます。

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

操作でやる話だが ワードは正規表現まがいの検索・置換機能が有る。2000ぐらいからかな。 エクセルシートの範囲をワードの表にコピー貼り付け。 置換 検索する文字列 [あ-ん] []-は半角(正確には小文字の「ぁ」から、「ん」まで(文字一覧から) 置換後の文字列 何も入れない オプションをクリック ワイルドカードを使用するにチェック。 全てを置換。 これをコピーしエクセルの任意のセル(を左上隅として)に貼り付ける。 ワードでマクロの記録をとればワードVBAでコードはわかると思う。 === またはエクセルVBAでVBScriptを使う方法もある。 RegExp http://officetanaka.net/excel/vba/tips/tips38.htmScriptingObjec WEBを探せばコード例が有ると思うが。

ijuhyg
質問者

お礼

ちょっと私には難しいですね。調べてからやってみます。ありがとうございます。

  • suo2k
  • ベストアンサー率44% (183/408)
回答No.1

文字コードを指定して、for文でまわせば短縮できますし、応用もききやすいです。 ひらがなの文字コード…が -32097 ~ -32015 (小さい ぁ ~ ん)かな なので例として -------------------------- Dim i As Long Dim moji As String For i = -32097 to -32015 moji = chr(i) Cells.Replace what:=moji, Replacement:="", LookAt:=xlPart next i -------------------------- こんな感じ? replaceの後にでも msgbox "「" & moji & "」を削除しました" とか入れておくとテストするとき何の文字を置換したか確認できて良いと思います。

ijuhyg
質問者

お礼

危うく非効率な作業をやるとこだったので質問してよかったです! 大変参考になりました。ご回答ありがとうございます。

関連するQ&A

  • CSVファイルの「20090423」を日付型の「2009/4/23」へ変換したい

    CSVファイルには書式設定が標準で「20090423」と入力されていますが これを日付型の「2009/4/23」へ変換したいのですがどうすればいいでしょうか? 現在は With Columns(1) .Replace what:="200809", Replacement:="2008/09/", LookAt:=xlPart .Replace what:="200810", Replacement:="2008/10/", LookAt:=xlPart .Replace what:="200811", Replacement:="2008/11/", LookAt:=xlPart .Replace what:="200812", Replacement:="2008/12/", LookAt:=xlPart .Replace what:="200901", Replacement:="2009/01/", LookAt:=xlPart .Replace what:="200902", Replacement:="2009/02/", LookAt:=xlPart End With とやっていますが量が多くて追いつけません。 ご教授よろしくお願いします。

  • エクセル(2003) 「1900/1/0」を消したい

    セルA1に0を入力し 書式設定で日付→yyyy/m/dを選択しました。 しかし下記のマクロ実行しても 0が空白になりません。 Sub 日付置換() Cells.Replace what:="1900/1/0", Replacement:="", LookAt:=xlPart Cells.Replace what:="00/01/00", Replacement:="", LookAt:=xlPart Cells.Replace what:="0", Replacement:="", LookAt:=xlWhole End Sub なら最初から0なんか入力しなきゃいいじゃん。 と思われるかもしれませんが これはCSVファイルで出力したもので 最初から0の数値にも書式設定がかかってて「1900/1/0」となっています。 「1900/1/0」のデータをなくしたいのですが どんな方法がありますか? データ量が多いためマクロなどで一度に行ないたいです。 アドバイスよろしくお願いします。

  • LookAt の定数を変数で指定するには?

    エクセルvbaです。 Sub test() Dim strLookAt As String strLookAt = "xlPart" Cells.Replace What:="aaa", Replacement:="iii", LookAt:=strLookAt End Sub このようなことはできないのでしょうか? LookAtの部分のxlWhole または xlPart かをシートから読み取って変数に格納し、 Replace メソッドで置換したいのですが、 このコードを実行すると「型が一致しません」になります。 多分、LookAt:=strLookAtでエラーになってるのだと思います。 String型だからいけないのでしょうか? 回避方法を教えてください。よろしくお願いします。

  • Cells.Replace What:="*234

    このような事は出来ないのでしょうか? 「2345」で終わる文字列を検索して 「2345?」にしたいのですが Sub test() Cells.Replace What:="*2345", Replacement:="*2345?", LookAt:=xlWhole End Sub を実行すると「a12345」が「*2345?」になってしまいます。 お尻のみ完全一致で「2345」以前の文字列は変更せず 「a12345」を「a12345?」にするにはどうすれば良いでしょうか? 実際の置換妻帯データは 「5」と「?」が連続している訳ではないので Sub test() Cells.Replace What:="5", Replacement:="5?", LookAt:=xlPart End Sub は考えていません。

  • 半角全角区別しない場合の置換

    エクセルvbaで Cells.Replace What:=str置換前, Replacement:=str置換後, LookAt:=xlPart のように置換するときに 半角でも全角でも置換できるようにするにはどうすればいいですか? Replaceにカーソルを当てF1を押すと ライブラリでVBAとExcelのヘルプがありますが どちらを見ても、半角全角区別しない場合の書き方は書いてなかったため わかりませんでした。

  • VBAセル参照のパスのブック名に汎用性を持たせたい

    皆様どうぞ宜しくお願いいたします。マクロ初心者です。 Excel 2003で作業をしております。 今回の仕事で必要なので、大変困っております。 BOOK1とBOOK2を開き、BOOK1のAシートのセル参照をBOOK2でもBOOK2でのセル参照として活かす為、BOOK1のAシートの=をすべて#に置換した後、BOOK2にAシートをコピーし、逆に#を=に戻しました。 ここから後なのですが、BOOK名が特定されてしまうため、汎用性が効きません。 どのようにすればよいのかお教えください。 どうぞ宜しくお願いいたします。 下記マクロコード Cells.Replace What:="=", Replacement:="#", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False Sheets("店頭").Select Sheets("店頭").Copy Before:=Workbooks("ここの部分です.xls").Sheets(3) Cells.Replace What:="#", Replacement:="=", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub

  • エクセルでVBAを使ってブック内にある特定の言葉をすべて置き換えしたい

    VBAの超初心者なのですが、 品番変更に伴い複数枚のシートから成るエクセルファイルの特定の文字を置換えたいのですが・・・。 Range(Cells(1, 1), Cells(65536, 256)).Replace What:="旧品番", Replacement:="新品番" で1枚のシートだけなら置換えできたのですが、すべてのシート(ファイル内すべて)の置換え方がわかりません。 どうしたらよいのでしょう。教えてください。

  • 置換のVBA

    エクセルのあるシート内の「abc」という文字列を「abc20」に置換するには以下で可能ですが、 Sub chikan() Cells.Replace What:="abc", Replacement:="abc" & "20", _ LookAt:=xlPart,SearchOrder:=xlByRows, MatchCase:=False End Sub 「abc」という文字列を連番で「abc20」「abc21」「abc22」・・・・・というふうに置換するにはどうすればいいでしょうか?

  • エクセルの置換の検索場所に「ブック」を指定し置換

    エクセルの置換の検索場所に「ブック」を指定し置換するには? 過去ログを見たのですが http://okwave.jp/qa/q5268557.html シートをループするしかないのでしょうか? Sub Macro2() Cells.Replace What:="aaaa", Replacement:="zzz", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End Sub のように、シート全体にするかブック全体にするかのプロパティは存在しないのでしょうか?

  • 置換する場合も最高文字数は何文字ですか?

    エクセルvbaで置換する場合も最高文字数は何文字ですか? と言うのも、 Cells(1, 1).Replace What:=mystr, Replacement:="", LookAt:=xlPart で、mystrは260文字なのですが、これを実行しようとすると 型が一致しません。(Error 13) と言うエラーになるのですが、 これは変数に格納されている文字数が多いせいか、他のエラーなのかわからないのですが 文字制限ってあるのでしょうか?

専門家に質問してみよう