• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:携帯番号へ一括でハイフン挿入 の続き)

【Excel VBA】携帯番号へ一括でハイフン挿入

このQ&Aのポイント
  • 個人的にA列が文字型でも数値型でも処理できるようにコードを考えていました。
  • 最初は、文字型と数値型と分けてIF文で処理を選択できるようにしたのですが偶然の産物ですが下記のコードではIF文が無くても処理できるようです。
  • どうして処理できるのか、理由は何でしょうか?突き詰めるとやはり不具合が出ますか?

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

  • ベストアンサー
回答No.2

Sh1.Cells(i, "B") = Right(Sh1.Cells(i, "A"), Len(Sh1.Cells(i, "A") - 1)) は、 ・A列が数値の場合 「A列の数値から1を引いて、それを文字列にして、その長さ分を右から切り取って、数値としてB列にセットする」ので、結局「A列の内容を数値にしてB列の値にする」と言う処理をします。 ・A列が文字列の場合 「A列の文字列を数値に変換して、その数値から1を引いて、それを文字列にして、その長さ分を右から切り取って、数値としてB列にセットする」ので、結局「A列の内容を数値にしてB列の値にする」と言う処理をします。 つまり、この行は「数値ならそのまま、文字列なら数値化してB列に入れる」という処理をします。 その結果、 ・A列が数値の場合 そのままB列に入れる ・A列が文字列の場合 頭の0が取れた状態でB列に入れる という結果になります。 本当は Sh1.Cells(i, "B") = Right(Sh1.Cells(i, "A"), Len(Sh1.Cells(i, "A") - 1)) ではなくて Sh1.Cells(i, "B") = Right(Sh1.Cells(i, "A"), Len(Sh1.Cells(i, "A")) - 1) と書きたかったのだと思いますが、こう書いた場合、文字列の場合は成功しますが、数値だったら頭の「9」が削れてしまい、うまく行きません。 1を引く位置を書き間違ったおかげで「偶然、目的通りに動作してしまった」のです。 結局「数値ならそのまま、文字列なら頭の0を取る」のですから Sh1.Cells(i, "B") = Right(Sh1.Cells(i, "A"), Len(Sh1.Cells(i, "A") - 1)) の代わりに Sh1.Cells(i, "B") = Val(Sh1.Cells(i, "A")) と書けば、良いだけの話です。

NuboChan
質問者

お礼

PCの不具合により回答が遅れてすいません。 (Pcを起動させるも映像が出ない状態が続き   モニターのケーブルの接触不良の特定まで長時間が必要でした。) >1を引く位置を書き間違ったおかげで「偶然、目的通りに動作してしまった」のです。 とてもわかり易い説明をありがとうございます。 偶然の産物のコードが上手く処理できている理由が判りました。 >Sh1.Cells(i, "B") = Val(Sh1.Cells(i, "A")) >と書けば、良いだけの話です。 この発想は、私には思い浮かばないコードです。

すると、全ての回答が全文表示されます。

その他の回答 (2)

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

・質問文への注文。 >携帯番号へ一括で 質問を、一見した時、携帯電話の電話番号の質問かと誤解した。 それは携帯アプリ作成の話になって、難しい課題だ。 ーー エクセルのシートデータの編集の質問だよね。エクセルと取って、当然と思うな。 標題で明記すること。 >下記のコードではIF文が無くても処理できるようです はどの部分か?具体例(コード部分)ぐらい書いておくこと。 シートのデータが、数値データの場合、文字列”0”などを先頭に付加すると、全体が 文字列として扱われる。 そのことに気付いたというだけのことか? 文字列を扱う関数利用(の結果)でもそうなるようだ。 例 セルA1に数字(数値、半角数字)を入れておく。 Sub tesy02() '先頭 x = "0" & Cells(1, "A") MsgBox VarType(x) '後尾 x = Cells(1, "A") & "0" MsgBox VarType(x) '中間 x = Left(Cells(1, "A"), 2) & "0" & Right(Cells(1, "A"), Len(Cells(1, "A")) - 2) MsgBox VarType(x) End Sub を作り実行。 http://officetanaka.net/excel/vba/function/VarType.htm vbString 8 文字列型 --- Sub test03() Cells(1, "C") = "'" & Cells(1, "A") MsgBox VarType(Cells(1, "C")) End Sub のことも知っているか? ーーー >A列が文字型でも数値型でも処理できるようにコードを考えていました。 (B列にハイフン挿入型に変換して書き込み) はどういうコードか質問に示してないが、 数値か文字列を意識することは重要で、エクセルの、この点での、たまたまの癖と考えるべきでしょう。 ーーー Sub test04() x = Cells(1, "A") 'A1は数値データとする Cells(1, "D") = Mid(x, 1, 2) & "-" & Mid(x, 3, 3) & "-" & Right(x, Len(x) - 2 + 3) End Sub 数式バー部には、セータ先頭に'が着く。 文字列を扱う関数を通すと結果は文字列の値になる。 この議論が有効なのは、元データが数値の時だけであろう。 日付もセルの値は、日付シリアル値という数値なんだが、どうなるか、やっていないので断言できない。 (省略) >突き詰めるとやはり不具合が出ますか どういうケースがあり得るか、考え(列挙し)つくすのは難しそう。 今までの経験では、上記仕組みが働く点は例外ないと思う。

NuboChan
質問者

お礼

PCの不具合により回答が遅れてすいません。 (Pcを起動させるも映像が出ない状態が続き   モニターのケーブルの接触不良の特定まで長時間が必要でした。) >エクセルのシートデータの編集の質問だよね。エクセルと取って、当然と思うな。 >標題で明記すること。 失礼しました。 説明不足でしたが、添付の画像を見てもらえればシートの質問だと分かると思ったのです。。。。 >>下記のコードではIF文が無くても処理できるようです >はどの部分か?具体例(コード部分)ぐらい書いておくこと。 If文のコードは、質問とは直接関係しまいのであえて書き込みしませんでした。 >シートのデータが、数値データの場合、文字列”0”などを先頭に付加すると、全体が >文字列として扱われる。 >そのことに気付いたというだけのことか? 先頭に”0"を更かしても数値型では無視されるが 'に続く"0"は文字型では認識されてゼロが先頭になるぐらいは理解しています。 ---------------- 色々具体例を挙げて説明いただきありがとうございます。   自分の知識では追いつかない部分もありますがトレースして調べてみます。

すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率66% (1747/2623)
回答No.1

> どうして処理できるのか、理由は何でしょうか ? Sh1.Cells(i, "A") - 1 この部分でしょうか。 Excelは数字文字列に数値演算をすると数値にしてくれると思いますが 文字列を数値にするValがありますので Sh1.Cells(i, "B") = Val(Sh1.Cells(i, "A")) でいいのではないでしょうか。 Valにしておけばデータの中に ABC12345678 みたいなデータがあっても正しく出力はしませんがとりあえずエラーになりません。 また、Rightなどの引数に数値を渡すのはどうなんだろうということでしたら Strを使って文字列にして(正の場合頭にスペースが入るので除きます) NN = Right(Str(Sh1.Cells(i, "B")), Len(Str(Sh1.Cells(i, "B")) - 1)) など考えられます。

NuboChan
質問者

お礼

PCの不具合により回答が遅れてすいません。 (Pcを起動させるも映像が出ない状態が続き   モニターのケーブルの接触不良の特定まで長時間が必要でした。) kkkkkmさん、いつも回答ありがとうございます。 >Sh1.Cells(i, "B") = Val(Sh1.Cells(i, "A")) >でいいのではないでしょうか。 No.2さん(chie65535)からも以下のように同じ回答を頂きました。   >Sh1.Cells(i, "B") = Val(Sh1.Cells(i, "A"))   >と書けば、良いだけの話です。 この発想は、私には思い浮かばないコードです。 >Rightなどの引数に数値を渡すのはどうなんだろうということでしたら >Strを使って文字列にして(正の場合頭にスペースが入るので除きます) >NN = Right(Str(Sh1.Cells(i, "B")), Len(Str(Sh1.Cells(i, "B")) - 1)) >など考えられます。 最初から、DATAが数値型なら文字コード変換するのも有りですね。 ---------------

すると、全ての回答が全文表示されます。

関連するQ&A