• 締切済み

半角・全角スペースチェック

エクセルのVBAで質問です。 現在、仕事でデータのコンバートの作業をしています。 送られてくるデータはTXTもしくはCSVなのです。 それを決められたフォーマットに加工しています。 それで現在、置換やオートフィルタの組み合わせで行っている作業を 自動化できないかと思い質問させていただきます。 氏名を 性 名としたいのですが、姓と名の間に半角スペースとしたいのです。 ただ、送られてくるデータが全角スペースだったり、 半角スペースが3つあったりとバラバラの状態です。 なのでいつもは置換で半角スペースに変えながら、 オートフィルタで半角スペースひとつを含まないものを出して 修正している状態です。 VBAでこれらをチェックし、自動修正することは可能でしょうか? よろしくおねがいします。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。#4 のWendy02です。 関数でしたら、以下のようにすればよいと思います。元のデータは、全角の漢字でしょうから、ASC()関数が使えます。 例 A1: abc ____efg 上記は、全角スペース+アンダーバー(_) ひとつを半角スペースとして3つあります。 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(ASC(TRIM(A1))," ","^",1)," ",""),"^"," ") ですが、この数式を直接マクロに入れるのはちょっと無理ね……。 マクロで、関数を貼り付け、結果を再び値貼り付けするのが、もっとも速いかな?

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.5

私なら「半角スペース2つを1つに置換」を数回繰り返し、「全角スペースを半角スペースに置換」しますね。 それと注意事項なんですが、>No1~4さん ここの掲示板には連続した半角スペースが書き込めない仕様になっています。 記述内容に連続したスペースがあれば1個に自動変換されます。 例:「 」←10個書いた もしソース内に連続スペースを使っていたらお気をつけください。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 一応、状況に合わせてワークシートで使えるように直してみました。 以下を、標準モジュールに貼り付けて、ワークシートに戻って、Alt + F8 または、コマンドボタンに取り付けてください。 最初に、場所を指定されますので、該当する列のどの行のセルでもいいので、ひとつ選択します。なお、自動修正として、入力した際に、チェックする場合は、コードが異なります。 '標準モジュールに限ります。 '------------------------------------------------------- Sub MainSpaceDel() 'Ver.2647729.02 '半角・全角を半角ひとつにするマクロ Dim rng As Variant Dim cl As Integer Dim EndCell As Range Dim TopCell As Range Dim c As Variant With Application  .DisplayAlerts = False  On Error Resume Next  Set rng = .InputBox("処理する列の任意のセルをクリックしてください", Type:=8)  On Error Resume Next  If TypeName(rng) <> "Range" Then Exit Sub  .DisplayAlerts = True End With   cl = rng.Cells(1).Column   Set EndCell = Cells(65536, cl).End(xlUp)   If EndCell.Row < 2 Then MsgBox "列が違うようです", 32: Exit Sub   Set TopCell = EndCell.End(xlUp)   Application.ScreenUpdating = False   For Each c In Range(TopCell, EndCell)    If Not IsEmpty(c) Then     c.Value = SpaceOneRemain(c.Value)    End If   Next c   Application.ScreenUpdating = True   Set rng = Nothing: Set EndCell = Nothing: Set TopCell = Nothing End Sub Function SpaceOneRemain(myText As Variant) '2バイト空白を除去して半角空白ひとつにする関数  Dim buf As String  Dim i As Long  If VarType(myText) = vbString _   And InStr(1, myText, Space(1), vbTextCompare) > 0 Then   buf = Trim$(myText)   buf = Replace(buf, Space(1), Space(1), , , vbTextCompare)   i = Len(myText) - Len(Replace(buf, Space(1), "", , , vbTextCompare))   buf = WorksheetFunction.Substitute(buf, Space(i), Space(1))  Else   buf = myText  End If  SpaceOneRemain = buf End Function '-------------------------------------------------------

noname#95859
noname#95859
回答No.3

こんなのはどうでしょうか? familynameの一覧表をテーブルとしてもちます。 対象のデータ(名前)をそのテーブルでスキャンして、 一致したら・・・・・・・ 具体的に以下に示します。 シート”nameref"のA列に御社の社員?のfamilynameを登録しておきます。 (65536を越えることはないと考えます) シート”data”のA列には、対象の名前が記述されているとします。 例: 小泉純一郎 小泉 純一郎 小泉 純一郎 Sub Macro1() Dim myArray As Variant Sheets("nameref").Select Erowpos = Range("A65536").End(xlUp).Address hani = "$A$1:" & Erowpos myArray = Range(hani).Value r = UBound(myArray, 1) '行数 Sheets("data").Select rowpos = 1 Do While Cells(rowpos, 1).Value <> "" myname = Cells(rowpos, 1).Value For i = 1 To r If InStr(myname, Trim(myArray(i, 1))) > 0 Then firstname = Trim(Replace(myname, Trim(myArray(i, 1)), "")) targetname = Trim(myArray(i, 1)) & " " & firstname Exit For End If Next Cells(rowpos, 2).Value = targetname rowpos = rowpos + 1 Loop End Sub このルーチンの実行結果は、B列に入ります。 このルーチンのポイントは、variant変数に配列を記憶させる点です。 ここでは、subrutineとしましたが、functionにすることも可能かと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 以下をユーザー定義関数にするか、サブルーチンにすればよいかと思います。 myText の変数宣言と、myText の文字代入を削除して、 myText を以下のように引数にしてやり、 Sub Delete2ByteSpaces(myText As String) として、MsgBox の代わりに、myText = buf にして、メインのコードから飛ばしてやればよいと思います。 また、以下のように、vbTextCompare にすれば、全角空白は、半角空白に変わります。 Sub Delete2ByteSpaces() '2バイト空白を除去 Dim buf As String Dim myText As String  myText = "あい  うえお"  buf = Trim$(myText)  buf = Replace(buf, Space(1), Space(1), , , vbTextCompare) '全角を半角にする  While InStr(buf, Space(2)) > 0   buf = Replace(buf, Space(2), Space(1))  Wend  MsgBox myText & " -> " & buf End Sub

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

「全角スペース」と「半角スペースが3つ」は =TRIM(SUBSTITUTE(A1," "," ")) という関数で処理できますが、 1.姓(名)の中に余分なスペースがある(「山 田」等) 2.姓と名の間にスペースが入っていない物に自動的にスペースを入れる は、VBAでも難しいと思います

関連するQ&A

  • VBAの記述の中で半角スペースで区切らなければいけない時、区切ってはい

    VBAの記述の中で半角スペースで区切らなければいけない時、区切ってはいけない時を教えてください。 以下は参考書のとうりに記述しました。 ------------------------------------- Sub 分割() 氏名 = Range("A2").Value 姓 = Left(氏名, 2) 名 = Mid(氏名, 4, 10) Range("B2").Value = 姓 Range("C2").Value = 名 End Sub ------------------------------------- ・氏名 = Range ・Left(氏名, 2) ・姓 = Left ・名 = Mid ・氏名, 4, 10 半角スペースは無しで記述を入力したのですが 上記の    = の前後と   2 と 4 と 10 の前に 勝手に半角スペースが入りました。 試しに Range("C2")の Range と ("C2") の間に半角スペースを入れようと Range ("C2")とすると 強制的に排除され Range("C2") に戻されました。 試しに 氏名 = Range("A2").Value の「.Value」の前に半角スペースを入れて 氏名 = Range("A2") .Value としたら記述が赤字になって エラーメッセージが出ました。 試しに Range("B2").Value = 姓 の Range の部分でRとaの間に半角スペースを入れて  R ange と記述したら確定されました。 (強制的に戻らないのでしょうか?  またエラーメッセージが出ないのでしょうか?) 1.記述の中で半角スペースを入れなければならない所。 2.記述の中で半角スペースを入れてはいけない所。 3.入力してはいけない所に半角スペースを入力した場合エラーと表示される時。 4.入力してはいけない所に半角スペースを入力した場合エラーと表示してくれない時。 5.半角スペースが必要な部分に自動で入力してくれない時。 6.半角スペースが必要な部分に自動で入力される時。    上記4種類の定義を教えていただきたいです。 NO.4とNO.5は実害があります。 NO.3とNO.6は実害はないのですが理屈を知らないので、 NO.1とNO.2を知っていないと駄目ではと思いました。 参考書では見当たりませんでした。 わかりやすいサイトがあったら教えていただけるとありがたいです。 お願いします。

  • マクロで全角を一括で半角に置換したいです

    マクロで下記の作業を行いたいのですがよくわかりません。 アドバイスお願いします。 ■作業内容 『Excelでsheetにある全角の文字を一括で半角に置換したい』 ※基本的に半角にできるもの(カナ・英数字・記号)は全て半角にしたいのですが、『~』だけは半角にしたくありません。 ■画面のイメージ ・sheet1にはマクロを組み込んだボタン画面 ・sheet2に全角のデータA ・sheet3にデータAを半角にしたデータA’が返される ■作業イメージ (1)sheet1のボタンをクリック (2)sheet2のデータを半角にしてsheet3に返す (3)『~』を『~』に置換し直す。 すみませんがよろしくお願いいたします。

  • 半角文字を全角に置き換えたいっっ

    アクセステーブル内のデータの中に半角文字が含まれており、これを自動で全角に置換したいのですが、何か簡単に置き換えられる方法はありますでしょうか? 宜しくお願いします。

  • LotusNotesで全角の空白を半角に変換したい

    LotusNotesR507を使ってます。 LotusNotesのデータベースで、氏名を入力するフィールドがあります。 深く考えてなかったのですが、姓と名の間に"全角スペース"を入れる人と "半角スペース"を入れる人がいて、結果的にビューで見たときいまいち 見た目がよくない状態です。(使用上問題はないのですが・・) そこで、全角スペースを半角スペースに変換するエージェントを作ろうと しているんですが、上手くできません。 @narrowか@ReplaceSubstringあたりを使えばいいのかと思ったのですが・・ それとも何か宣言をしなくてはいけないのが欠落してるのでしょうか? Notesはあまり詳しくないので、分かりやすく解説頂けるとあり難いです。 よろしくお願いします。

  • Access2000のクエリで全角文字を半角にするには?

    もともとのデータが全角英数字になっているフィールドを半角に変換したいのですが、クエリー実行時に変換できますでしょうか? 文字列関数のASCかな?とも思い、やってみたのですが、うまくいかず、とりあえず元のテーブルのデータを編集を置換でもって半角にしました。 でも、出来ればテーブルのデータは変更したくないので、クエリーでやる方法はありませんでしょうか? あまり専門的なことは分かりません。VBAは使ったことがありませんのでよろしくお願いします。

  • 再変換時、スペースを全角⇔半角

    最近Windows Vistaを使い始めました。 文字入力の時、再変換機能を使うことがよくあるのですが、 スペースを入れた文章を範囲選択などで再変換した時に、全角スペースを半角にすることはできますか? 厳密には、できるというのはわかっているのですが。 以前XPを使っているときは最初から普通にできたので、そういう設定を変えたこともなく、どこをいじればできるようになるのかわからず困っています。 現在の状態は、半角だったものを全角にすることはできるのですが、全角から半角に変えることができません。 既定言語はMicrosoft office IME 2007です。 (必要かどうかわかりませんが、似たようなトピックで書かれていたので一応書いておきます。) 詳しい方、ぜひご回答願います。

  • ACCESSのデータに自動で半角スペースを入れたい

    ACCESSのデータに自動で半角スペースを入れたい 例えば フィールドサイズ:15(テキスト型) のフィールドに10桁の数字を入力 した場合、残りの5桁に自動的に半角スペース(もしくは「0」)を入力する方法はないでしょうか? 例)  1234567890 → 000001234567890         → @@@@@1234567890(@は半角スペース) テーブル・クエリどちらでもかまいませんので教えてください。 よろしくお願いします。

  • 全角文字をまとめて半角に変換する方法を教えてください!

    業務上の処理で困っていることがあります。お知恵をお貸し下さい 「メーカーからCVSファイルでデータが届く→それを読み込んで伝票発行」という作業を行っているのですが 住所等の番地やマンション名等(カナ)が全て全角で入力されている状態なのです。(同じ文字列に漢字や平仮名も混じっています) 伝票発行するソフトは規定文字数が少なめなのでこれをいちいち半角に直してから 読み込まないといけません。手作業になりますし、件数も多いので困っています 「選択した行(シート全体でも構いません)の文字列で半角に直せるものは半角に変換」というマクロを組むことは可能でしょうか? 初心者レベルですが何度かVBAを使ったことはあります 何卒よろしくお願い致します。

  • スペースの入った文字列の呼び方

    データベースから全てのデータをSQLで取り出し、 それを一度、HASHにいれてから配列で取り出そうと思っているのですが、 データベースに"姓'半角スペース'名"(例、山田 太郎)のようにはいっている 名前データを配列を使って呼び出すと、姓(例、山田)までしか表示されません。 説明が分かりにくいかもしれませんが困っています。 よろしくお願いします。

  • エクセル半角スペースがあるセルも重複にする

    エクセルについての質問です 以下の様なデータが3000くらいまであります。 A1 パソコン 比較 A2 パソコン比較 A3 PC 比較 A4 DELL 比較 A5 IBM 比較 A6 IBM比較 半角スペースと半角スペースがないものも同じものとしてとらえて、スペースがない方を削除したいのですが、上記の例ですとA2とA6になります。 SUBSTITUTE関数で半角スペースを削除して、その後フィルタで「重複するセルを無視する」とやるとできるのですが、このやり方だとA3,A4のような半角スペースが必要なセルまで半角スペースがなくなってしまいます。 これができる関数などはありますでしょうか? 関数を使わなくても、一括で処理できる方法があれば教えてください。 よろしくおねがいします。

専門家に質問してみよう