重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ご回答者様

いつもお世話になっております。
表題の件、VBA Val 関数 文字列形式の数値についての質問です。
下記ソースを作成しております。

Sub val2()

Dim i As Integer



For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row



Cells(i, 2).Value = Val(Cells(i, 1))

Next i

End Sub

B列にVal関数で文字列系形式の数値を表示させています。

2点、質問が御座います。

1点目

No40
500円
1000*2
とA列に記載しておりますが500円しか反応しません。
(検索結果が0になってしまいます。500円は思惑通り500と表示されます。)

こちらにつきましては何故でしょうか。

2点目
Val関数を用いて足し算が可能か
例えば500円+500円=1,000円のように計算が可能かどう


Sub val3()

Dim i As Integer


For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row



Cells(i, 2).Value = Val(Cells(i, 1)+Val(Cells(i, 3))

Next i

End Sub

上記ソースですとコンパイルエラーと表示されてしまいます。

お忙しい所、大変お手数をお掛け致しますが宜しくお願い致します。

A 回答 (7件)

余計なことをいうようですが、こういうものは、質問の内容のバリェーションの解決方法を教わるよりも、Val()の使い方そのものを覚えたほうが良いと思うのです。

ここの掲示板には、VBAのベテランもいらっしゃるようなので、ご存知の方もいるはずなのですが。

> Cells(i, 2).Value = Val(Cells(i, 1))
> Cells(i, 2).Value = Val(Cells(i, 1)+Val(Cells(i, 3))
> Val関数を用いて足し算が可能か
> 例えば500円+500円=1,000円のように計算が可能かどう

VBAで、Val には、こういう使い方というのはほぼありえないです。

500円+500円というような文字列は、"円"など、単位は書式で表し、数値のみにする、というのはEXCELの基礎知識です。それを、Val関数で可能かどうか、というのは、方向性が違っています。

VBAを利用する上で疑問を生じた場合でも、それを実務に持ち込むことは避けることと、そういう疑問は、あくまでも自分の中で結論(可能か不可能か)を出したほうが良いと思うのです。回答者の中には、自分の技を見せたいという人もあるにはちがいないのですが、Val関数のような基本的な範疇で、他人に聞いても、また同じ疑問が湧いてきてしまいます。また、実務に持ち込むと、いつまでも完成できません。

ちなみに、私のVBAの経験では、Val関数を使う場合は
16進で書いてあるものを、あえて10進に直す場合と、UserForm のテキストボックスの文字を数字に直す時などに利用します。それ以上に、それほど使わないのです。VB5 の時代は、Val()関数は、Val関数にバグがあったので、仲間内では、使うなと言われてきたのですが、その後、VB6以降はバグは直りましたが、かといって、Val関数の有用性が上がったわけではないのです。
    • good
    • 1

ユーザー定義関数「StrToDig」を作成してみました。



Function StrToDig(対象 As String)

Dim 位置 As Long
Dim 途中 As Boolean
Dim 点有 As Boolean
Dim 文字 As String
Dim 結果 As String
 If 対象 <> "" Then
  For 位置 = 1 To Len(対象)
   文字 = Mid$(対象, 位置, 1)
   Select Case 文字
    Case "0" To "9"
     If 位置 = 1 Then
      結果 = 文字
      途中 = True
     Else
      If 途中 Then
       結果 = 結果 & 文字
      Else
       If Mid$(対象, 位置 - 1, 1) = "-" Then
        結果 = "-" & 文字
        途中 = True
       Else
        結果 = 文字
        途中 = True
       End If
      End If
     End If
    Case "."
     If 位置 = 1 Then
      結果 = "0."
      途中 = True
      点有 = True
     Else
      If 点有 Then Exit For
      If 途中 Then
       結果 = 結果 & "."
       点有 = True
      End If
     End If
    Case Else
     If 途中 Then Exit For
   End Select
  Next
 End If
 If 結果 = "" Then
  StrToDig = ""
 Else
  StrToDig = CDbl(結果)
 End If

End Function

※ 以下のような結果が返ります
No400 ⇒ 400
500円 ⇒ 500
1000*2 ⇒ 1000
No.40 ⇒ 40
0.40 ⇒ 0.4
No.4.1 ⇒ 4.1
0.4.2 ⇒ 0.4
.42 ⇒ 0.42
No.50-60 ⇒ 50
abc-60+50 ⇒ -60
2019/12/22 ⇒ 2019

・「.」は最初に有る時と数字の間に有る1個目だけが「.」と判断されます。
    • good
    • 0
この回答へのお礼

お世話になります。
表題の件、ありがとうございます。
確認いたします。

お礼日時:2019/12/25 18:25

①について


Val 関数は、数値の一部として認識できない最初の文字で、文字列の読み取りを中止します。

1000*2が0と言う結果はおかしいと思われます。もしかすると"1000*2"などになっていませんか?

②について
可能です。
ただし、算術式が成り立たない場合などを想定しエラー処理をする必要があります。

コンパイルエラーは、実行時エラー出ないので 文法などをデバッグして正しく直してください。
直し方が分からず質問をする場合は、エラーになった部分を示しましょう。
(これについては、以前のスレッドで理解されているかと思います)

以前のスレッドで理解されたと思いますが、シートオブジェクトなど明示的にコードに入れましょう。
質問が謎解きゲームにならないように、情報を省略するのはやめましょう。
開示できない場合は、省略でなく代替えコードを示してください。
    • good
    • 0

>No40


>500円
>1000*2
>とA列に記載しておりますが500円しか反応しません。
>(検索結果が0になってしまいます。500円は思惑通り500と表示されます。)

この個所の画像を提示してください。
そして、B列にあなたが望む結果を打ち込んで、その画像も含めて、提示してください。
    • good
    • 0

今夏は該当しませんが、


「No.40」は何と認識させたいのですか?
① 40
② 0.40
③ その他(具体的に説明して下さい)
「0.40」は何と認識させたいのですか?
④ 0
⑤ 0.40
⑥ その他(具体的に説明して下さい)
「No.4.1」は何と認識させたいのですか?
⑦ 4
⑧ 0.4
⑨ 4.1
⑩ その他(具体的に説明して下さい)
    • good
    • 0

>Cells(i, 2).Value = Val(Cells(i, 1)+Val(Cells(i, 3))


↓カッコが足りない。
Cells(i, 2).Value = Val(Cells(i, 1))+Val(Cells(i, 3))
    • good
    • 0

「1000*2」は何と認識させたいのですか?


① 1000
② 2000
③ その他(具体的に説明して下さい)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!