質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5643閲覧

VBA 郵便番号にハイフンをいれたい

12356

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/10/14 10:08

A列にある7桁の数字(ハイフンが入っていたり入っていなかったりする)を
全てハイフンが入る"000-0000"に統一したいです。

VBA

1Dim Rng1 As Range 2 For Each Rng1 In Range("A1", Cells(Rows.Count, 1).End(xlUp)) 3 If Len(Rng1.Text) = 7 And IsNumeric(Rng1.Value) Then 4 Rng1.Value = Format(Rng1.Value, "000-0000") 5 End If 6 Next

ネットにあるコードを使用しましたが、反映されません。
自分でもFormat関数を使用してコードを書きましたが、値が全て"000-0000"になってしまいます…

何か書き方が違うのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/10/14 11:19

問題は再現できませんでした。 A列で7桁の数字のセルは、たとえば1234567なら123-4567になりました。 なので原因はわかりませんが、試しにA列の書式を予め標準か文字列にしてみてはどうでしょうか。
hatena19

2021/10/14 15:31

提示されていない部分のコードで何かしている可能性が大。 0にしているとか。
YT0014

2021/10/14 22:20 編集

Rng1.Valueの変換前の値をDebug.Printなどでご確認いただきご提示ください。
12356

2021/10/15 02:35

皆様、ご回答ありがとうございます。 データに「 ' 」が入り混じっていたのでそちらが原因かもしれません。 色々とご教示いただきありがとうございました。
YT0014

2021/10/15 02:43

12356さん、その場合、IsNumeric()がfalseになるでしょうし、Len()の結果も異なるので、IFの中は実行されないと思うのですが。 当該セルで、Format()が実行されているのは確認されましたか?
12356

2021/10/15 03:05

YT0014様、ご回答ありがとうございます。 上記コードでは実行されませんでした。 見直しをしてみます。
guest

回答3

0

自己解決

VBA

1'//使用セルの最終行を取得 2 Dim fin_line As Long, k As Long 3 4 With ws.UsedRange 5 fin_line = .Rows(.Rows.Count).row 6 End With 7 For k = 2 To fin_line 8 9 If Len(Range("A" & k).Text) = 7 And IsNumeric(ws.Range("A" & k).Value) Then 10 ws.Range("A" & k).Value = Format(ws.Range("A" & k), "000-0000") 11 12 End If 13Next

皆様のお手を煩わせました。
ご回答いただきありがとうございました。

投稿2021/10/15 03:40

12356

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご提示いただいたコードと動作を見る限り、問題のセルの値は文字列になっているために、Format()では、"0000-000"を、書式外として、そのまま出力しているものと思われます。

追記:
申し訳ございません。上記記述は誤りで、文字列でも、問題ない事を確認いたしました。
動作は、仕様書だけでなく、実際の動作を確認するべきと、己を戒めます。

確認のため、VarType(Rng1.Value)の値を出力してみてください。
VarType 関数

修正方法ですが、Val()を使って、強制的に数値にすれば、Format()が使えるかと思います。
Val 関数

コーディングの際は、使用する関数などの仕様は正確に把握するようにしてください。

以下に今回の問題点を挙げておきます。参考になれば幸いです。

・IsNumeric()は、数値型であることを判定しているのではなく、数値として処理できることを判定しています。
つまり、数字の1だろうと、文字列の"1"だろうと、Trueと判定します。
IsNumeric 関数

・Format()は、与えられたデータの型により、動作が異なる関数です。
"0000-000"が郵便番号の書式として機能するのは、データが数値型の場合のみです。
Format 関数

投稿2021/10/14 12:07

編集2021/10/14 22:17
YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/10/14 13:00 編集

セルの書式が文字列になっていても Format(Rng1.Value, "000-0000") は効きました。 (Excel 2013)
hatena19

2021/10/14 13:25

私の Microsoft 365 のExcelでも、文字列で "000-0000" はききますね。 Debug.Print Format("0123456", "000-0000") ’012-3456
YT0014

2021/10/15 09:58 編集

ご指摘ありがとうございます。 手元のExcel2013でも、確認できました。 回答に誤りであったことを追記させていただき、削除を申請しましたが却下されました。
guest

0

たんに、先頭3文字取り出してハイフン入れれば入れればいいだけなんでは。

全てハイフンが入る"000-0000"に統一したいです。

自分でもFormat関数を使用してコードを書きましたが、値が全て"000-0000"になってしまいます…

そうなってるってはなしなんでは

投稿2021/10/14 11:14

編集2021/10/14 11:16
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問