[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.017 Val関数で文字列を数値に変換してみた

Val関数で文字列を数値に変換してみた

メルマガ発行内容

<Val関数で文字列を数値に変換してみた>

こんにちは、三流プログラマーKen3です。 今回は、 文字列を数値に変換する関数、 Val関数を使ってみたいと思います。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. Val関数で文字列を数値に変換 */ Val関数で文字列を数値に変換なんですが、 何言ってんだコイツと言う前に、 サンプルを。 Sub test() Dim n As Integer n = Val("1000") '(*1) 文字列"1000"を数値に変換 MsgBox n * 25 End Sub (*1) 普通に、 n = val(変換したい文字列)で数値に変換できます。 なんだぁ、簡単ですね。 Sub test2() Dim n As Long Dim strTANKA As String strTANKA = "120000" '12万 n = Val(strTANKA) '(*2)String型を数値に変換 MsgBox n / 250 End Sub (*2)もちろん、固定じゃなく、 n = Val(strTANKA) と 変数を渡し変換することができます。 Sub test3() Dim lngTANKA As Long '単価 Dim lngKAZU As Long '売上数量 Dim lngKINGAKU As Long '金額 Dim strWORK As String '文字列受け取り用 '単価の入力 strWORK = InputBox("単価を入力して下さい") lngTANKA = Val(strWORK) '入力された文字列を数値に変換 '数量の入力 strWORK = InputBox("販売数量を入力して下さい") lngKAZU = Val(strWORK) '入力された文字列を数値に変換 '金額の計算 lngKINGAKU = lngTANKA * lngKAZU '結果の表示 MsgBox "金額は、" & lngKINGAKU & "円です" End Sub こんな感じで、使用することも出来ます。 通常は、フォームで、 単価:999999 (テキストボックス) 数量:999999 (テキストボックス) 計算実行(ボタン) みたいな感じなので、InputBoxは使いませんが、 Valのサンプルなので、ご勘弁を。 /* * 2.あまり関係無いけど、配列変数の復習も兼ねて */ 前回やってた、グー、チョキ、パーの表示処理で、 配列変数と合わせて、 こんな使い方も出来ます。 Sub test4() Dim strNO As String '(*3)値を受け取るため文字型の変数を宣言 Dim strMSG(3) As String '(*4)結果メッセージの配列 0-3の4つ Dim n As Integer '(*5)番号変換用 '(*6)初期処理で使用するメッセージを代入する strMSG(0) = "正しい値を入力して下さいね" strMSG(1) = "グーを出しました" strMSG(2) = "チョキを出しました" strMSG(3) = "パーを出しました" '(*7) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100とか違う数値が入力された時は0にする If 3 < n Then n = 0 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) End Sub こんな感じにしてみました。 軽く解説すると、 Dim strMSG(3) As String '(*4)結果メッセージの配列 0-3の4つ まず、結果の文字列を配列で用意します。 '(*6)初期処理で使用するメッセージを代入する strMSG(0) = "正しい値を入力して下さいね" strMSG(1) = "グーを出しました" strMSG(2) = "チョキを出しました" strMSG(3) = "パーを出しました" ここで、メッセージを初期化してます。(事前にセットしておきます) '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) で、”1”を1へ”8”なら8へ ふざけたユーザーが”TAKO”と文字列なら0となります。 n = Val("Ken3") とかやると、 数値に変換できないので、nは0となります。 '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100、123とか違う数値が入力された時は0にする If 3 < n Then n = 0 この処理はなぜ?か? 5とか99とか数字に変換可能なので、 3より上は全てエラーとしたいので0を代入してます。 0にしておくと(タネを仕込んでおくと)、 下の配列のn番目のメッセージ表示で、 0番目のstrMSG(0) = "正しい値を入力して下さいね"が表示されます。 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) でn番目(添字のnって言う人が多いかな)を表示してます。 ポイントは、 事前のメッセージのセットで、 strMSG(0) = "正しい値を入力して下さいね" エラーメッセージの処理かなぁ。 /* * 3.プログラムの穴(欠陥)、テストはしっかりと(笑) */ さて、このグー・チョキ・パー入力プログラム、 動いているように見えるけど、実は穴(欠陥)があります さて、どこでしょうか? なんて、読者参加型のメールマガジンだと、これで1つ発行できるんだけど、 待ちきれないKen3は、自分落しネタで攻めてみます。 問題の場所は、 −2とマイナスの数値を入力された時、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '(*7) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") InputBoxは、当然マイナスの数値、例だと−2も入力可能です。 '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) としたら、nは−2ですよね。 まぁ、普通の流れですよね。 '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100とか違う数値が入力された時は0にする If 3 < n Then n = 0 3以上なら0にする、 そりゃぁ、100とか、3以上の数が入力されたら、 0にして、エラーメッセージが表示されるけど、 −2の時は、エラーのチェックにひっかからなく、そのまま通ってしまうよ。 で、 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) ここで、strMSGの−2番目を参照しに行くので、 インデックスの有効範囲エラーでプログラムはストップしてしまう。 あらら、−2なんか、入れんなよ、入力メッセージ見てないのかよコイツら。 頭イテ、ユーザーの入力ミスが悪いのかよ? アナタのチェックが中途半端で、 マイナスの値をエラーで判断できなくて、逃してたんでしょ。 パット見、動いていても、いろいろなデータを想定して、テストしないとダメですよ。 いろいろなデータと言えば、 1.5 と入れても 2.5 と入れると、どうなるか、、、、 あっ、2のチョキが表示される。。。 これもなんか変だよね。 /* * 4.終わりの挨拶 */ 今回は、 Val関数で文字列を数値に変換 と テストをしっかりしないと、バグ発生しますよ(ユーザーのせいにするな) を書いてみました。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]