• ベストアンサー

VBAにて文字を数字に変換

先日教えて頂いた下記コードについて If Right("0000000000" & Numbers1(i), 10) > Right("0000000000" & Numbers1(j), 10) Then Numbers1(i)に1や3が入っていますが、数字ではなく文字とみなされていました。 上記の処理をすると、数字に変換されました。 どうして数字に変換されるのでしょうか? (先日の質問を間違って締め切ってしまったため、改めて質問しました)

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

それは全く思い違いで、「数字に変換」など、されてはいません。 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の方が大きい結果になります。

mk1234
質問者

お礼

回答ありがとうございます。 大変よく分かりました。

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

その他の回答 (1)

回答No.2

こんにちは。 前回の質問に対する回答で、本当に解決したのか疑問で、なぜ、そんな論理になっていくのか、水掛け論にもなりかねませんが、私も返事をつけさせてもらいます。 まず、用語の問題です。「数値」と「数字」です。 少なくとも、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

mk1234
質問者

お礼

回答ありがとうございます。

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

関連するQ&A

  • VBA ソートすると、1、11、2,3になって・・

    VBAにて下記のようなコードでソートすると、1、11、2,3になってしまいました。 数字ではなく、文字として認識していると、このようになると書かれていました。 どうすれば、1、2、3、11と並び替えれるのしょうか? If Numbers1(i) > Numbers1(j) Then

  • 文字列の一番右が数字であるかどうかの判断

    お世話になります。 文字列の一番最後が数字である場合と数字でない場合について判断する方法を教えて頂きたいのですが、数字である場合 then以下の処理をするという風にしたいと思っています。ですが以下のところでつまずいて数字であるかどう確かめればよいのやらわからないので教えて下さい。    If Right("abcdef7", 1) = ここに何を書けばいいのでしょう?    Then 処理する。    end if という文なんですけど。=の右はなにをかけばいいのでしょうか?

  • 文字の変換についてわかりません。Jを押したら1の数字が、Kを押したら2の数字が、Lを押したら3の数字が

    文字の変換についてわかりません。Jを押したら1の数字が、Kを押したら2の数字が、Lを押したら3の数字が入力されてしまうのですが、そうではなくてLとOを押したら「ろ」、KとIを押したら「き」としたいのですが設定方法を教えてください。お願いします。

  • VBA 文字に半角が含まれているか確認する方法

    VBAで文字に半角が含まれているか調べる方法を教えて頂けないでしょうか?全角が含まれているかのチェックはできたのですが。。。 下記は全角が含まれているかのチェックです。 If Asc(Mid(文字列, i, 1)) < 0 Or Asc(Mid(文字列, i, 1)) > 256 Then   処理 End If

  • 数字変換について

    下記のように(色々端折ってはありますが)した時、例として一文字ずつ「A,A,A,1,2,3」と入力したら、「1,2,3」は文字として扱われていると思っています。しかし「AAA」と「123」という風に数値として表わしたくて、[>>]の部分で変換できるようにしてみたのですが… [x,x,x,9,9,9]と入力→[xxx231]と出力 [x,x,x,3,3,6]と入力→[xxx80]と出力 [x,x,x,4,0,0]と入力→[xxx144]と出力 という風に、全く関係のない数値として出てきてしまいます。 どうしたらいいのかわからなくなってしまったので、どなたかヒントを頂けないでしょうか。お願いします。 while(1){ ____uchar a,c,COM_RW[7],IDall[3]; ____ulong ID2=0; ____for(a=0;a<7;a++){ ________c=getc(); ________printf("%c",c); ____} ____switch(COM_RW[0]){ ________case 'W': //WRITE Command ____________if(COM_RW[2]=='I'){ ____________COM_RW[6]='\0'; ____________if(isxdigit(COM_RW[3])){ ________________for(i=0,j=3;j<6;j++,i++) ____________________IDall[i]=COM_RW[j]; ________>>______if(!isdigit(IDall[2])){ ________>>__________ID2=(IDall[0]-'0')*10; ________>>__________ID2+=IDall[1]-'0'; ________>>______}else{ ________>>__________ID2=(IDall[0]-'0')*100; ________>>__________ID2+=(IDall[1]-'0')*10; ________>>__________ID2+=IDall[2]-'0'; ________________} __以下略。

  • EXCELのVBAで半角数字を全角数字へ変換

    EXCEL2007を使用しております。 VBAにて半角数字を全角数字へ変換したいと思っております。 最初にStrconv (cells (i 、j ) 、vbwide ) としていました。セルには数字が入っていますが、これで実行しても半角のままでした。 これは数字を文字列に変えないとだめなのでは思い、Cstr ( cells ( i 、j ) としてそれをstring として定義した項目へ送ってからStrconv で変えようとしたのですが、これでも半角のままでした。 何か勘違いをしているように思うのですが、アドバイスいただければ幸いです。 宜しくお願い致します。

  • EXCELで文字を数字に変換したい

    お世話になります。 エクセルシート上の見た目数字、実は文字列という値を、数字に変換したいのですが、EXCEL-VBAでどのように処理すればいいのでしょうか? 1.セルから文字列型の見た目数字の値をとってくる。 2.VBAで文字列型から整数型に変換する。 3.元のセルに貼り付ける。 4.セル書式を数字のカンマ形式にする。 リンクではなくこのような処理をしたいのですが、どうすればいいのでしょうか?

  • 数字と数字のー(ハイフン)は消去しないVBA

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myAsc As Integer, InSP As Integer, myFlag As Integer Dim myStr As String If Intersect(Target, Range("B4:CH4")) Is Nothing Then Exit Sub If Application.CountBlank(Target) > 0 Then Exit Sub Application.EnableEvents = False Target = StrConv(Target, vbUpperCase + vbNarrow) myStr = Target.Value InSP = 0: myFlag = 0 For i = 1 To Len(myStr) myAsc = Asc(Mid(myStr, i, 1)) If Not (myAsc >= 65 And myAsc <= 90) Then If Not (myAsc >= 48 And myAsc <= 57) Then If myAsc = 32 Then InSP = i Else MsgBox ("-(ハイフン)は使用出来ません。クリアします。" & "" & Mid(myStr, i, 1) & "") Target.Select ' Selection.ClearContents Application.EnableEvents = True Exit Sub End If ElseIf myFlag = 0 And InSP = 0 Then myFlag = i End If End If Next If myFlag <> 0 Then Target.Value = Left(myStr, myFlag - 1) & Mid(myStr, myFlag, 99) End If Application.EnableEvents = True End Sub B4:CH4の範囲で半角英数字の小文字で入力したら自動で大文字となり、-(ハイフン)を入力したら文字がクリアされるVBAがあります。 質問ですが先ほどのVBAで英字と数字の間のー(ハイフン)はクリア対象となり、数字と数字の間にー(ハイフン)の場合はクリアしないVBAはどの様にすれば良いでしょうか? ※「GRE-879」の時は消去対象となり、「GRE868-76」の時は消去しない感じです。

  • VBAでの全角数字と半角数字の判断について

    はじめまして、こんにちは。VBAのプログラムについて教えて欲しいのですが、「ぐう1」のように文字列の一番後ろの数字を削除するプログラムを作成したいです。asc関数を利用して str="ぐう1234" StrLenNum = Len(str) If Asc(Right(str, 1)) >= 48 And Asc(Right(str, 1)) <= 57 Then str = Left(str, StrLenNum - 1) としたのですが、これでは 「ぐう1」という全角数字に対応することができませんでした。 全角文字に対応するにはどうすればよいでしょうか? よろしくお願いします。

  • EXCEL VBA で列の数字のみを修正No.2

    前回の応用の質問になります。 EXCEL VBA で列の数字のみを修正したいのですが 内容としては (1)カッコ内文字はそのまま維持 (2)添付資料のN001から始まっているまたはN001以外の始まる、ある機械加工プログラムに   N053,N054を挿入しプログラム内容はそのまま変更なく使用 ここで始めたいNナンバー数値(例N075からの連番)にマクロで変換したいのですが おすすめのコードを教えてください。 (※SHEET1のA列に記載されているとして) 前回の質問時はN001からの連番を以下のコードでできました。 Sub test() Dim i As Long Dim j As Long Dim str As String i = 1 j = 1 str = Worksheets("sheet1").Range("A" & i).Value Do While str <> "" If Left(str, 1) = "N" Then str = "N" & Format(j, "000") & Mid(str, 5, Len(str) - 4) Worksheets("sheet1").Range("A" & i).Value = str j = j + 1 End If i = i + 1 str = Worksheets("sheet1").Range("A" & i).Value Loop End Sub いろいろコードを触ってみましたが思うように出来ずに困っています。 よろしくお願いします

専門家に質問してみよう