- ベストアンサー
VBAにて文字を数字に変換
先日教えて頂いた下記コードについて If Right("0000000000" & Numbers1(i), 10) > Right("0000000000" & Numbers1(j), 10) Then Numbers1(i)に1や3が入っていますが、数字ではなく文字とみなされていました。 上記の処理をすると、数字に変換されました。 どうして数字に変換されるのでしょうか? (先日の質問を間違って締め切ってしまったため、改めて質問しました)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
それは全く思い違いで、「数字に変換」など、されてはいません。 1や3や11の文字は、その処理で 0000000001 0000000003 0000000011 という文字に計算されます。 桁数が合っているので、1や3より11の方が「大きい」という計算が成り立つようになります。 #補足 なぜ「文字列」だと"3"の方が"11"よりも「大きい」結果になってしまうのか、肝心の部分がまだ判ってないのでしょうか。 文字列の大小計算では、文字列の「先頭から1文字ずつ」比較して、先に大きいのが現れた方が「大きい」結果になります。 3と11では「1文字目」をまず比較して、3の方が1より大きいのでその時点で"3">"11"という計算結果になります。 桁数が合ってるということは、それぞれの先頭の1文字目の0から順に比較を開始、9文字目のところで「"0"<"1"」となるので、そこで11の方が大きい結果になります。
その他の回答 (1)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 前回の質問に対する回答で、本当に解決したのか疑問で、なぜ、そんな論理になっていくのか、水掛け論にもなりかねませんが、私も返事をつけさせてもらいます。 まず、用語の問題です。「数値」と「数字」です。 少なくとも、VBAでは、「数値」というのは、Integer や Long, Single や Double で扱うもので、Excel VBAで「数字」とは、数値なのか文字列なのか、曖昧な状態であるものです。どちらかというと、「文字列」という向きでもありますが。 最初の質問の要件 If Numbers1(i) > Numbers1(j) Then から、 If Right("0000000000" & Numbers1(i), 10) > Right("0000000000" & Numbers1(j), 10) Then とする論理が理解できません。文字列として、ゼロフィルして比較するなら、Format関数を使うのが一般的だと思います。 例: b = 123 a = Format(b, "0000000000") それはともかくとして、一体、どんな前提になっているのでしょうか。 Val関数という丸め方もないわけではありませんが、話は、最初から聞かないと分からないと思います。 文字列を、ワークシートでソートした所で同じ結果になるはずです。 Numbers1 というのは、配列ではないのでしょう。 >Numbers1(i)に1や3が入っていますが、数字ではなく文字とみなされていました。 そんなことはありません。配列だったら、配列のデータ型宣言というものがあるのではないでしょうか。 Dim Numbers(19) As String こんな風にしているのでしょうか? それとも、もともと、ComboBox などのテキスト型リストを、そのまま配列にしているのでしょうか? それを途中を切り出して、こうなったから、どう直すなんて、本来答えられる人などいないと思います。 それから、ここの質問と同質だと思います。 [VBA 桁数が混在するソート] http://okwave.jp/qa/q8662051.html
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。 大変よく分かりました。