• ベストアンサー

サブルーチンの処理

すみませんが教えてください。 往年のF-BASICやN88などでは 10 INPUT A 20 IF A=1 then gosub 100 ELSE PRINT "Aは1ではありません!" 30 END 100 PRINT A 110 RETURN こんなふうだったかサブルーチンが使えたかと思います。 これをVB.NETでかくと Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer A = TextBox1.Text If A = 1 Then ここにどういれたらいいでしょう Else MsgBox("Aは1ではありません") End If End Sub End Class になるとおもうのですが、Thenのあとサブルーチンへ飛ばせるのでしょうか? それとも根本的に考え方が違うのでしょうか? 初歩的な質問ですみませんが、Timer1.Enable = Trueを使った処理以外 入門書に載っていないので、どなたかお教えいただけませんでしょうか。

  • denza
  • お礼率80% (647/806)

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

  • ベストアンサー
回答No.3

#1 Wizard_Zeroです。 If A = 1 Then Hoge(A) Else MsgBox("Aは1ではありません") End If 失礼しました。 こう書かないとダメでしたね。Σ(; ̄□ ̄A アセアセ > ところで、一体どうやってVB.NET覚えたのでしょうか? 私の場合 N88-BASIC → VBScript → VB6.0 → VB2005 と段階を踏んで覚えてきたのですが、それでもそれぞれの段階で覚えることや考え方を変えなければならない点は数が多く、使いこなせるようになるには時間がかかりました。書籍は何冊か持っていますが、分からないところはMSDNやネットで調べています。

denza
質問者

お礼

いやぁ年季(失礼)が入ってますね。 MSDN見てもさっぱりです。 大体 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click なんてクリックイベントのときだけの処理だなんて最近知りました。 別の処理もたくさんありますよね。この一行だけでこの量。 N88と比べ物にならないとおもいます。 今はめちゃくちゃなポログラムを書いていますが、一体いつまともなプログラムが書けることやら。命のほうが短いかも。 参考になりました。どうもです。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

#2です。 >簡単な処理だとSELECT CASEで処理できるとおもいますが 論点が違う(変えている)のではないですか。 >だとSELECT CASEで処理できるとおもいますが は場合分けが、ある変数しか見ていない場合などSELECT CASEが適している。 しかしそれも場合の数が多いと、SELECT CASEでは無くループを使わざるを得ない場合があるかも 数ならCase 14, 20 To 30, Is >= 100のような使い方も出来るが、文字列等なら表引きをしなくてはならない場合もあろう。 >各処理を部品としてサブルーチン(いやsubプロシージャですね)で処理するほうがいいと思っていたのですが 2つの問題を混ぜて議論しないほうが良い。 subプロシージャに分けられるなら、分けたほうがよいわけで、 Case 1  SUB1 SUB3 Case 2  SUB2 Case 3  SUB2 SUB3 ・・ と言う風に(取り合わせで解決出きるよう各SUBに分解可能なら)出来る場合ならラッキーでしょうが。

denza
質問者

お礼

リンク先に On…GoToにせよ、On…GoSubにせよ構造化構文ですらない構文なので、これに直接対応する機能は存在しない。強いて対応するものを挙げれば“Select Case”文だろう。 とかいてあったので、そんなものかなと思ってしまいました。 っていうか リンク先のいみがなんとなくわかるような状態なので上手く理解できていない。 でもご回答のケースごとにサブルーチンを(いやプロシージャー) 組み合わせるというのはなるほどと思いました。 私の勘違いか妄想でなければ。 いずれにしてももう少し勉強してみます。 プログラムのセンスがないのはわかっていますが、昔は電子部品だけで結構何とかなったりしましたが、昨今のマシンはプログラムがないとどうにも動かないので。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

subプロシージャ名を書けばよい。引数が有る場合は()内に指定して。 「ここにどういれたらいいでしょう」の場所が質問の行では、ダメでしょう。 If A = 1 Then  subプロシージャ名 Else MsgBox("Aは1ではありません") End If ーーー >A = TextBox1.Text はテキストで応答が返る。 If A = 1 Then は不適当と思う。 If A = "1" Then 。 GOSUBはなくなった。 http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet06/vb6tonet06_02.html

denza
質問者

お礼

回答ありがとうございます。 簡単な処理だとSELECT CASEで処理できるとおもいますが、 各処理を部品としてサブルーチン(いやsubプロシージャですね)で処理するほうがいいと思っていたのですが、考え方としてどうなんでしょうか。

回答No.1

とりあえずコードを。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer A = TextBox1.Text If A = 1 Then Hoge(A) Else MsgBox("Aは1ではありません") End If End Sub Private Sub Hoge(ByVal intA As Ineteger) MsgBox(intA) Return End Sub End Class BASICのサブルーチンは.NETで言えばSubプロシージャに相当します。「Gosub 行番号」は「Subプロシージャ名(引数)」という書式に変わります。注意点は、変数のスコープですね。 「Dim A As Integer」は「Private Sub Button1_Click(...」の中でのみ利用可能な変数ですので、これをSubプロシージャに引き継がせるには、Subプロシージャ側で値を受け取れるようにする必要があります。 Private Sub Hoge(ByVal intA As Ineteger) 「Hogeという名のSubプロシージャで、引数にInteger型がひとつ必要」という宣言になります。 Hogeが呼び出されたら、渡された引数をintAに格納して使います。 > Timer1.Enable = Trueを使った処理以外入門書に載っていない ( ̄◇ ̄;) 独自メソッドや独自関数の書き方・呼び出し方とかも載ってないですか??? あと余計なツッコミで・・・ A = TextBox1.Text TextBox1に数字以外の文字が書かれていたら、ここでエラーが出ます。 If Integer.TryParse(TextBox1.Text, A) = False Then MsgBox("数値ではありません。") Return End If とすると、数値に変換できない場合に対処することが出来ます。

denza
質問者

お礼

とてもよくわかりました。 ありがとうございます。 ところで、一体どうやってVB.NET覚えたのでしょうか? VB.NETになってからとてつもなく難しく感じるのです! いまだに一つのフォームの中での簡単な処理しかできません。

関連するQ&A

  • サブルーチン

    下は身長の平均を求めるプログラムですけど、身長の高い順、低い順に並び替えしたいんですがどうしたらいいかわからないので、よかったら誰か教えていただけませんか                   REM プログラム     10            DIM A(12) 20 PRINT "メニュー” 30 PRINT "身長入力...1" 40 PRINT "身長出力...2" 50 PRINT "終了" 60 PRINT "どれにしますか" 70 INPUT B 80 IF B=1 THEN GOSUB300 ELSE 110 90 GOTO 30 100 IF B=2 THEN GOSUB500 ELSE 130 110 GOTO 30 120 IF B=3 THEN GOSUB700 ELSE 30 130 END 140 A(11)=B 300 FOR I=1 TO 10 310 PRINT i;: PRINT "人目" 315 INPUT C 320 A(I)=C 330 PRINT "これでいいですか?" 340 PRINT "1.YES 2.NO" 345 INPUT D 350 IF D=1 THEN 380 ELSE 370 360 IF D=2 THEN 315 ELSE 340 370 A(11)=A(11)+A(I) 380 NEXT I 390 RETURN 400 IF C=1 THEN 520 500 PRINT "先に入力してください" 510 GOTO 30 515 FOR I=1 TO 12 520 PRINT A(I) 530 NEXT I 540 RETURN 550 PRINT "これで身長の平均を求めるのを終わります"700 RETURN 710  

  • Visual Basicがわかりません。

    Public Class Form1 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim GraphicsFun As System.Drawing.Graphics GraphicsFun = Me.CreateGraphics Dim PenColor As New System.Drawing.Pen _ (System.Drawing.Color.Black) GraphicsFun.DrawRectangle(PenColor, 30, 30, 450, 300) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If PictureBox1.Left < 480 - PictureBox1.Width And PictureBox1.Top + 31 Then PictureBox1.Left = PictureBox1.Left + 1 Else If PictureBox1.Top < 330 - PictureBox1.Height Then PictureBox1.Top = PictureBox1.Top + 1 Else If PictureBox1.Left > 30 Then PictureBox1.Left = PictureBox1.Left - 1 Else If PictureBox1.Top > 30 And PictureBox1.Left + 31 Then PictureBox1.Top = PictureBox1.Top - 1 End If End If End If End If End Sub End Class ピクチャーボックスを四角形の中で右周りに枠の中をボタンを押すと回るようにしたいんですけど、2回目の動作と3回目の動作がかぶってしまい、うまくいきません。4回目の解決策を教えてください。また、ボタン2を押すと反対周りにピクチャーボックスが回る、コマンドを 教えてください。

  • 時間の処理方法

    VB2008 ユーザーフォーム上に 時刻Label(現在時刻表示) ボタン1 時刻dgv DataGridViewを配置しています DataGridViewの列は一列で、文字列の時刻を表示させています(12:00) 行の時刻が現在時刻よりも以前の場合、セルに色を つけたいのですがうまくいきません Public Class 時刻一覧表Form Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If  Me.時刻dgv(0, 0).Value < 時刻Label Then         Me.時刻dgv(0, 0).BackColor = Color.Yellow End If End Sub End Class

  • 標準モジュールからフォームをコントロールしたい

    こんにちは。 標準モジュールからフォームのリストボックスに文字を追加したいんですが、うまくいきません。 まず、button1をクリックすると、共通モジュールのサブルーチンを呼び出します。そして引数"0"を渡すと、Form1のListBox1に"hello"を追加したいのです。 実行させると、エラーはでないのですが、追加されるはずの"hello"がListBox1に追加されません。 たぶん     frm1.ListBox1.Items.Add("hello") あるいは    Dim frm1 As New Form1() あたりの宣言の仕方がまずいのだと思うんですが... どなたか、ご教授よろしくお願いします。 ■共通モジュール Module Module1 Dim frm1 As New Form1() Sub PC(ByVal PCrecieve As String) If PCrecieve = "0" Then frm1.ListBox1.Items.Add("hello") End If End Sub End Module ■フォーム Public Class Form1 Inherits System.Windows.Forms.Form Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call PC("0") End Sub End Class

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • エラー時に処理を戻したい。

    VB2005環境です。 ボタンをクリックした時、条件によってエラーを出し、処理を ボタンが押される前に戻すようなプログラムを作りたいと思っています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try Dim test As Integer test = 5 If test > 1 Then Throw New IndexOutOfRangeException("エラー") Else MsgBox("エラーではない") End If Catch aex As IndexOutOfRangeException MsgBox(aex.Message) End Try End Sub 例えば上のようにした場合は、もうボタンが押された後にメッセージを 表示するだけになってしまいます。 例えば、テキストボックスにフォーカスした時に戻すとか、フォームロードの 状態に戻すとかいうことをしたいのですが…。 処理を戻す方法を教えていただけないでしょうか?

  • 無限ループからの脱出用の文について

    **************************************************************** Button2がクリックされたらButton1の中のwhileの無限ループから抜け出すようにしたいのですが、どのようにすればよいのでしょうか。プログラミング初心者な為、初歩的な質問で申し訳ありません。 **************************************************************** Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click   質問1:Button2がクリックされた時のプログラム End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click While True   If 質問2:(Button2がクリックされたとき)Then Exit While End While End Sub

  • VB.NETで素因数分解のプログラムを作成する

    2以上の整数が与えられたとき、それを素数の積に分解するプログラムを作成したいのです。 例えば、TextBox1に24と打ち込んで、Button1をクリックすると、TextBox2に2×2×2×3が表示されるといった具合です。 ↓ここからどうすれば良いか、ご教授お願い致します。 Private Sub IntegerButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, a As Integer n = TextBox1.Text Do back: If n Mod 2 = 0 Then n = n Mod 2 = 0 Else n = n Mod 3 = 0 End If GoTo back Loop Until n = n + 1 TextBox2.Text = n & "×" End Sub End Class

  • 漢数字に変換するプログラム

    入力した数字を漢数字に変換する例題なのですが、回答のサンプルコードは以下になっています。 number = Math.Abs(number)以下のコードの意味が分かりません。詳しく教えていただけませんでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim kanji() As String = New String() {"○", "一", "二", "三", "四", "五", "六", "七", "八", "九"} Dim number As Integer Dim kansuji As String = "" Dim sign As String = "" If Integer.TryParse(TextBox1.Text, number) Then If number < 0 Then sign = "-" End If number = Math.Abs(number) Do kansuji = kanji(number Mod 10) & kansuji number \= 10 Loop Until number < 1 Label2.Text = sign & kansuji Else Label2.Text = ("整数を入力してください") End If End Sub End Class

  • Form間のデータ渡しについて

    申し訳ありません。VB.NET初心者です。 Form1から、ボタンAをクリックするとForm2がオープンします。 Form1から、ボタンBをクリックするとForm3がオープンします。 Form1では、Form2またはForm3で設定した値をそれぞれ演算に使おうとしています。 MicrosoftのHPからパクってForm1 - Form2間のデータの引渡しを行うことはできたの ですが、新規でForm3を作成して、Form1 - Form3間のデータの引渡しを行おうとする とForm3の立ち上がり時に "NullReferenceException はハンドルされませんでした"となり、 困ってしまいました。 使われている方から見ると簡単かもしれず 申し訳ありませんが、どなたか教えていただけないでしょうか。 ==================== Form1.vb ======================= Form1には、Label1、Label2、Button1、Button2があります。 Public Class Form1 Inherits System.Windows.Forms.Form Private m_form2 As Form2 Private m_form3 As Form3 Public Property LabelText() As String Get Return Label1.Text End Get Set(ByVal Value As String) Label1.Text = Value End Set End Property Public Property LabelText2() As String Get Return Label2.Text End Get Set(ByVal Value As String) Label2.Text = Value End Set End Property Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleYokusou.Click m_form2 = New Form2(Me) m_form2.ShowDialog() m_form2.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ScaleHikito.Click m_form3 = New Form3() m_form3.ShowDialog() m_form3.Dispose() End Sub End Class ==================== Form2.vb ======================= Form2には、TextBox1、Button1があります。 Public Class Form2 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText = Me.TextBox1.Text End If End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If m_form1 Is Nothing = False Then Me.TextBox1.Text = m_form1.LabelText End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class ==================== Form3.vb ======================= Form3には、TextBox1、Button1があります。 Public Class Form3 Inherits System.Windows.Forms.Form Private m_form1 As Form1 Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged If m_form1 Is Nothing = False Then m_form1.LabelText2 = Me.TextBox1.Text End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.TextBox1.Text = m_form1.LabelText2 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub End Class

専門家に質問してみよう