質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3965閲覧

VB.NETの型変換について

Nendo

総合スコア2

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/05/14 13:36

編集2020/05/14 13:46

前提・実現したいこと

VB.NET初心者です。
テキストボックスに値を入力しボタンを押すと、その値に1足された値がメッセージボックスで表示されるというプログラムを作成中です。
※ShowMsgの引数msgはInteger型で。

以下のエラーメッセージが表示されます。
教えていただけますと幸いです。

発生している問題・エラーメッセージ

Integer型からString型への暗黙の変換は許可されていません。

該当のソースコード

Public Class F1 Private Sub ShowMsg(msg As Integer) 'この部分でエラー MessageBox.Show(msg) End Sub Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click Dim u As String = TB1.Text Dim i As Integer = CInt(u) If IsNumeric(i) Then i += 1 ShowMsg(i) Else End If End Sub End Class

試したこと

MessageBox.Show(msg)をMessageBox.Show(CType(msg, String))と型変換したところ、数値は表示されましたが、文字列を入力するとSystem.InvalidCastException: 'String "入力した文字列" から型 'Integer' への変換は無効です。とエラーが発生してしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/14 13:47

質問する前に「型」について勉強しましょう。
guest

回答1

0

ベストアンサー

MessageBox.Showメソッド
こちらにある通り、引数はString型です。
ですので、msgをString型に変換する必要があります。
試されたようにCType(msg, String)でも変更は可能ではありますが
CTypeよりはmsg.ToStringといった感じでToStringメソッドを使用された方がいいかと思います。

また、StringからIntegerへ変換できるか確認する場合は
Integer.TryPerseメソッドを利用してください。

投稿2020/05/14 13:56

YAmaGNZ

総合スコア10288

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nendo

2020/05/14 14:09 編集

ありがとうございます。 ToStringメソッドを使用しました。 さらにテキストボックスに文字列を入力したら、何も表示されないという機能を実装したいのですが、 文字列を入力しボタンを押すとSystem.InvalidCastException: 'String "入力した文字列" から型 'Integer' への変換は無効です。とエラーが発生いたしました。 こちらの対処法を教えていただけますでしょうか。
YAmaGNZ

2020/05/14 14:12

回答に書いてある通り、TryParseを利用してください。
Nendo

2020/05/14 14:23

ご教示頂きありがとうございました。
Nendo

2020/05/14 23:18

度々申し訳ございません。 教えていただいたように、TryParseを利用してIf文にElseIfを追加しInteger.TryParse(u, i) = True Then と書いたのですが、テキストボックスに文字列を入力したところ、エラーが発生しました。 ご教示頂ければ幸いです。
YAmaGNZ

2020/05/15 00:14

どのように書いてどこでどういうエラーが出たのか提示していただけませんか? こちらでは貴方がどのようにソースを修正され、その修正が正しいのか判断できません。 そもそも、私は「StringからIntegerへ変換できるか確認する場合」と書きました。 これを行うべきタイミングはStringのものをIntegerに代入する前です。 「Integerに変換できるか確認する」ということを行う前にIntegerに変換してしまうのはおかしいですよね?
Nendo

2020/05/15 00:23

このように書き、System.InvalidCastException: 'String "入力した文字列" から型 'Integer' への変換は無効です。'とエラーが発生しました。 Public Class F1 Private Sub ShowMsg(msg As Integer) MessageBox.Show(msg.ToString) End Sub Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click Dim u As String = TB1.Text Dim i As Integer = CInt(u) If IsNumeric(i) Then i += 1 ShowMsg(i) ElseIf Integer.TryParse(u, i) = True Then End If End Sub End Class
YAmaGNZ

2020/05/15 00:29

ご提示ありがとうございます。ただ、「どこで」エラーが発生したのかという情報がありません。 想像ですが Dim i As Integer = CInt(u) ここでエラーが発生しているのではありませんか? エラーが発生する前にIntegerに変換できるか確認しなくてはならないということは分かりますか?
Nendo

2020/05/15 00:42

ご指摘いただきました通り、Dim i As Integer = CInt(u)の部分でエラーが起こります。 エラーが発生する前にIntegerに変換できるか確認しなくてはならないということは分かりました。 このように記述するのでしょうか。 Dim u As String = TB1.Text Integer.TryParse(u, i) Dim i As Integer = CInt(u)
YAmaGNZ

2020/05/15 00:46

変数の宣言方法と変数の初期化についての理解が完全に出来ていないようですね Dim i As Integer と i = CInt(u) と分けて書くことができます。 iへの代入はTryParseを使用してIntegerに変換できるか判断してから行うようにしてください。 また、判断するということはIf文で行います。
Nendo

2020/05/15 01:21

ご指摘いただいたように、Dim i As Integerと i = CInt(u)と分けて書きデバッグをしたところ、以下のように実装できました。 ありがとうございました。 Public Class F1 Private Sub ShowMsg(msg As Integer) MessageBox.Show(msg.ToString) End Sub Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click Dim u As String = TB1.Text Dim i As Integer If Integer.TryParse(u, i) Then i = CInt(u) IsNumeric(i) i += 1 ShowMsg(i) Else End If End Sub End Class
YAmaGNZ

2020/05/15 01:48

IsNumericも数字に変換できるか確認するものです。 今回の場合ですとTryParseで判断していますのでIsNumericは必要ありません。 また、なぜIsNumericではなくInteger.TryParseを勧めたのかというと IsNumericでは少数表現や指数表現、16進表記など数字として変換できると判断する範囲が広いのです。 例えば、”123.45”という文字列を変換できるか判断する場合 IsNumericではTrueとなり、Integer.TryParseではFalseとなります。 引数がIntegerですので、Integerとして変換できないものは省くと考えた場合、Integer.TryParseのほうが適切ですのでこちらをお勧めしました。
Nendo

2020/05/15 02:35

ご丁寧にご教示いただきまして、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問