EnjomonWeb

ストックフォトサービスの画像

Excel VBA 電話番号からハイフンを削除し0から表示させる方法 | Evaluate&Replace

仕事でVBAを使うことがあり、やりたいことはネットで調べていますが、VBA初心者の私が分かりづらかったものを、初心者でも分かるように説明したいと思います。

効率的なコードが書けていない可能性もありますので、予めご了承ください。

今回はEvaluateとReplaceを使用し、電話番号など0から始まる数値データのハイフンを削除し、削除後も0から表示させる方法を紹介します。

使用ケース

以下のような顧客データがあり、別システムへデータを取り込む際に電話番号のハイフンを削除する必要がある、といったことが仕事上であるかと思います。

データが数件であれば自動化する必要もないと思いますが、その件数が大量で頻度も高い作業なのであれば、ある程度自動化できれば楽ですよね。

問題点(普通にハイフン削除すると・・・)

電話番号など0から始まる数字データのハイフンを削除すると、頭の0が表示されなくなってしまいます。

書式設定で頭の0を表示させることも可能ですが、データを上書き(例でいうと電話番号の変更など)すると、その書式は失われてしまいます。

なので、汎用性を高めるためにも、このような場合はハイフンを削除する前に、先頭にアポストロフィ(')を付けることで解決することができます。

サンプルコード


Sub hyphendelete()

Dim LastRow
Dim cell As Range

LastRow = Cells(Rows.Count, 4).End(xlUp).Row

Sheets("sheet1").Range("D2:D" & LastRow).Value = Evaluate("""'""&D2:D" & LastRow)

Call Range("D2:D" & LastRow).Replace("-", "")

For Each cell In ActiveSheet.UsedRange
  cell.Errors(xlNumberAsText).Ignore = True
Next

End Sub

コード解説

対象列の最終行取得

LastRow = Cells(Rows.Count, 4).End(xlUp).Row

まずはハイフンを削除したいデータがある列の最終行を取得してしまいます。

例でいうと電話番号なので4行目となります。

アポストロフィ追加(Evaluate)

Sheets("sheet1").Range("D2:D" & LastRow).Value = Evaluate("""'""&D2:D" & LastRow)

ハイフン削除する前に、対象列の全てのセル先頭にアポストロフィを追加します。

追加はEvaluateメソッドを使用します。EvaluateメソッドはExcelの数式を実行するための関数です。

今回はD2からD列の最終行までを、「Aから'A(アポストロフィ付)に変更しなさいよ」という数式を実行するようにしています。

"""'""&D2:D" の部分は少し分かりにくいですが、アポストロフィを""""(ダブルクォーテーション4つ)で囲んでいます。シート名は適時変更してください。

このアポストロフィを付けることによって、ハイフンが削除された後も頭の0が消えないようになります。

ハイフン削除(Replace)

Call Range("D2:D" & LastRow).Replace("-", "")

Replaceメソッドを使用し、ハイフンをブランクへ置換しています。

Replaceメソッド引数

Replace(What, Replacement, [LookAt, SearchOrder, MatchCase, MatchByte, SearchFormat, ReplaceFormat])

[]内は省略可能

ReplaceメソッドはExcelの置換ダイアログのオプションを引き継ぐため、マクロを実行するファイルで手動による置換を実行する場合は、引数の指定をしてください。

「call」については、なぜ必要か分かりませんでしたが、これがないと私の環境下ではエラーとなり作動しなかったため記述しております。

この辺りが説明できずもどかしいのですが、素人なのでお許しください。。。

セルエラー無視(Ignore)

For Each cell In ActiveSheet.UsedRange
  cell.Errors(xlNumberAsText).Ignore = True
Next

ここまででハイフン削除し0から表示させることができましたが、数値が文字列として保存されることで、セルにエラー表示(三角マーク)がでてしまいます。

表示されていても問題ないのですが見栄えが悪いので、エラーを無視する処理を実行しています。

エラー無視の処理はIgnore(イグノア)プロパティで行います。

Ignoreはエラーチェックオプションの状態の設定が可能であり、Falseで有効、Trueで無効となります。なので今回はTrueを設定します。

なかなかややこしいコードになってしまったので、分解して解説します。

これによりセルエラーも消え、目的通りの表示がされました。

あとは別システムに貼り付けするためにコピーまでを自動化したり、別のエクセルファイルへ書き出すなど、目的に応じ追加いただければと思います。

Excel VBAの画像

新規ブックを作成しマクロが登録されたボタンを設置する方法 | OnAction

Excel VBAの画像

複数のワークシートをまとめて表示・非表示にする方法 | Visible Not.Visible

Excel VBAの画像

セル位置が変わっても特定の範囲を選択する方法 | Find&Address

Excel VBAの画像

電話番号からハイフンを削除し0から表示させる方法 | Evaluate&Replace

Excel VBAの画像

ダイアログボックスからファイルを選択して開く | GetOpenFilename

About

EnjomonWebは、「えんじょもん」である元転勤族の管理人が石川県金沢市から発信する、WEB制作情報をメインとした情報発信サイトです。

コーディング習得過程で検索してもすぐに解決しなかったことや、初心者には分かりづらい内容を分かりやすく説明することができるサイトを目指しています。

※「えんじょもん」とは金沢弁で「遠方の人、県外出身の人」という意味の方言。