VBで理解ができないところがあります

このQ&Aのポイント
  • VBで理解ができないところがあります。サンプルプログラムを打ち込んでも実行ができない問題が発生しています。
  • また、SubやModuleの意味や役割についても明確に認識することができません。
  • VBの参考書には解説が省かれる傾向があり、途中から出てくる単語の解説が無くなってしまうことが多いです。おすすめの参考書を知りたいです。
回答を見る
  • ベストアンサー

VBで理解ができないところがあります

初めまして、Y-Kobayashiです。 私はVisualBasicを勉強しているのですが、行き詰っております。 なぜかと言いますと、サンプルプログラムを打ち込んでも、そのままでは実行ができないからです。 使用している書籍は「かんたんVisual Basic(技術評論社)」というものです。 以下が、そのサンプルです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Module Module1 Private mName As String = "YOSHI" Sub Main() Dim SUJI As Integer = 3 If SUJI = 3 Then Console.WriteLine(mName) End If '-> Console.ReadLine() End Sub Sub DispMsg() Console.WriteLine("Hello {0}", mName) End Sub End Module ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub Main()内のmNameは表示されるのですが、Sub DispMsg()内のものが表示されないのです。 一応、「'->」のある位置に「DispMsg()」と入れれば実行されるのですが、書籍にはそういった記載がありません。 どうすれば良いのでしょうか? 他にも、Subとはどういう意味なのか、Moduleとはどういう意味なのか、それらはどの様な働きをするのか等、最初から使う物にも関わらず記載がなされていないので、明確に認識ができない状態です。 SubはC言語でいうところの、関数の様なもの。 Moduleはそれらをまとめるグループ(?)もしくは関数の様なもの。 NameSpeaceはModuleをまとめるグループ(?)もしくは関数の様なもの。 という認識を持ちつつありますが、これで合っているのでしょうか? VBの参考書はこういった説明が省かれる傾向があるのでしょうか? 図書館で何冊か見ましたが、途中から出てくる単語の解説が無くなって行きます。 それらは大抵自動で入力されるのですが、意味が分からないと気持ち悪いです。 おすすめの参考書があれば教えてください。 よろしくお願いします。 乱文失礼しました。

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

  • ベストアンサー
  • ReiReiCha
  • ベストアンサー率49% (63/127)
回答No.2

実行結果は正しいです。 サンプルプログラムを実行すると、最初に処理されるのはMain()という関数です。 ですから、 Sub Main()         <=ここから実行されます Dim SUJI As Integer = 3   <=SUJIという変数を宣言して、3を代入します If SUJI = 3 Then       <=もし、SUJIという変数が3であれば、以下の処理を実行 Console.WriteLine(mName)  <=画面にmNameという変数の内容(YOSHI)を表示 End If            <=ここまで '-> Console.ReadLine()     <=標準入力(多くの場合はキーボード)から1行入力 End Sub          <=Main()関数の終わり Main()関数の処理を終えると、アプリケーションは終了します。 Main()関数以降に書かれているDispMsg()という関数は、上の処理の流れのどこからも呼び出されていないので、実行されることはありません。 '-> という部分にDispMsg()と書けば、DispMsg()という関数を呼び出すことになるので、 Console.WriteLine("Hello {0}", mName) が実行されて Hello YOSHI と画面に表示されるようになると思います。 Sub,Module,NameSpaceの意味がわからないのであれば、Google検索で調べたほうが早いと思います。

Y-Kobayashi
質問者

お礼

回答ありがとうございます。 まずは、お礼が遅れたことを謝らせてください。 すみませんでした。 メールの認証ができていなかった様で、お礼の書き込みができない状況にありました。 関数(メソッドと言うらしいですね)の呼び出しが合っていた様で良かったです。 >Sub,Module,NameSpaceの意味がわからないのであれば、Google検索で調べたほうが早いと思います。 調べてみようとおもいます。

その他の回答 (1)

noname#212058
noname#212058
回答No.1

> 一応、「'->」のある位置に「DispMsg()」と入れれば実行されるのですが、 > 書籍にはそういった記載がありません。どうすれば良いのでしょうか? 書籍の誤りだと思いますね。初心者向けの書籍ではままあることです。出版社のHPに正誤表が出てないか確認したほうが良いかもしれません。 > VBの参考書はこういった説明が省かれる傾向があるのでしょうか? 初心者向けの、特にステップ・バイ・ステップでコードを作りながら学ぶ形式の書籍ではそのような傾向があります。いちいち説明していたら紙面が足りませんからね。こういう疑問点はネットで検索して調べたほうが、はるかに速く解決できますよ。VB.NET の開発元の Microsoft も資料や解説をたくさんネット上に公開してますしね。 例えば、"VB.NET Namespace" などで検索すれば、Namespace に関してのいろんな解説が出てきます。それを渡り歩いて、自分が納得できる説明を探したほうが良いかと。 > SubはC言語でいうところの、関数の様なもの。 そうですね。VB.NET では関数とは言わず、メソッドと言います。Sub は「戻り値のないメソッドの宣言」です。戻り値のあるメソッドは Function を使います。 > Moduleはそれらをまとめるグループ(?)もしくは関数の様なもの。 遭えて言うなら「Moduleはそれらをまとめるグループ」です。本来は先に Class というものを学習して、『Module は Shared Class と同じもの』と覚えたほうが良いのですがね。…というか、Module なんてカビが生えたような古い文法、実際には滅多に使わないです。 > NameSpeaceはModuleをまとめるグループ(?)もしくは関数の様なもの。 遭えて言うなら「NameSpeace は Module などをまとめるグループ」です。 なお、一口に Visual Basic と言っても、VB.NET、VBA、VBScript、VB6 と色々と種類があります。質問などをされる場合は明示的に VB.NET と言ったほうが良いかと。

Y-Kobayashi
質問者

お礼

細やかな回答ありがとうございます。 まずは、お礼が遅れたことを謝らせてください。 すみませんでした。 メールの認証ができていなかった様で、お礼の書き込みができない状況にありました。 >書籍の誤りだと思いますね。 やはりそうでしたか。 正誤表の方は確認できませんでしたので、ないものと思われます。 >初心者向けの、特にステップ・バイ・ステップでコードを作りながら学ぶ形式の書籍ではそのような傾向があります。 そうですか。 頑張って調べながらやっていこうと思います。 メソッドに関する解説ありがとうございます。 認識がある程度合っていた様で良かったです。 Moduleはカビが生えるほど古いのですか・・・ ちょっと残念です。 >なお、一口に Visual Basic と言っても、VB.NET、VBA、VBScript、VB6 と色々と種類があります。 Visual Basicにはそれだけの種類があるのですか。 驚きです。 これからは、正確な表記をしていきます。

関連するQ&A

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • vb2005でXmlReaderの使い方

    xmlファイルの読込がうまくいきません。どこが間違っているでしょうか。 参考にしたページ http://msdn.microsoft.com/ja-jp/library/ayf5ffy5(v=vs.80).aspx -----xmlファイルここから----- <root> <parentnode1> <childnode1>100</childnode1> </parentnode1> <parentnode2>20</parentnode2> </root> -----xmlファイルこまで----- -----コードここから----- Sub Main() Dim b As Boolean Dim objXmlR As XmlReader = XmlReader.Create("c:\temp\sample.xml") objXmlR.MoveToContent() b = objXmlR.ReadToDescendant("parentnode1") Console.WriteLine(objXmlR.Name) '「parentnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力 b = objXmlR.ReadToDescendant("childnode1") Console.WriteLine(objXmlR.Name) '「childnode1」を出力 Console.WriteLine(objXmlR.Value) '「」を出力。ここで「100」が出て欲しい End Sub -----コードここまで----- 基本的なことだと思いますがよろしくお願いします。

  • VB.NETSystem.Xml 要素数を得るには

    VB.NETでSystem.Xmlを参照設定して以下のXMLファイル(test.xml)のsub4_9のtestの個数を得たいのですが domNode = domDoc.SelectSingleNode("top/sub4_9/test") Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????) というようにしましたが?????の部分にLengthやCountがありません。 また、 rootElement = domDoc.DocumentElement domNodeList = rootElement.GetElementsByTagName("sub4_9/test") Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count) というようにもしてみましたが個数は誤った0が返されます。 どのように記述すればsub4_9のtestの個数を得ることができるでしょうか。 ----test.xml------------- <top>  <sub1_1>   <test>123</test>   <test>451</test>    :  </sub1_1>    :  <sub4_9>   <test>432</test>   <test>123</test>   <test>745</test>    :  </sub4_9>    :  <sub9_5>   <test>222</test>    :  </sub9_5> </top> --VB.NET------------------------ Imports System.Xml Imports System.IO Module Module1  Sub Main()   Dim domDoc As New XmlDocument   Dim domNode As XmlNode   Dim domNodeList As XmlNodeList   Dim rootElement As XmlElement   domDoc.Load("test.xml")   rootElement = domDoc.DocumentElement   domNode = domDoc.SelectSingleNode("top/sub4_9/test")   Console.WriteLine("Count of top/sub4_9/test = " & domNode.?????)   domNodeList = rootElement.GetElementsByTagName("sub4_9/test")   Console.WriteLine("Count of top/sub4_9/test = " & domNodeList.Count)  End Sub End Module ----------------------------------- よろしくお願いします (WindpwsXP,VisualStudio2010)

  • 【VB2005】windowsアプリ初心者の素朴な質問

    23歳男性です。 visual studio 2005を使用して開発を行っております。 今まではコンソールアプリを開発してました。今後はwindowsアプリもやることになると思います。そこで前準備としてwindowsアプリについて色々と質問します。 【質問】コンソールアプリでは、例外処理は最上位で行っていました。windowsアプリでも同様のことができると考えていました。しかし、windowsアプリのほうには「main」がないように思います。 これはイベント毎にtry~catch文を記述するしかないのでしょうか?これだと極めてメンテナンスしにくくなっちゃうのですが・・・・・・ --console----------------------------------------------------- Module Module1 Sub Main() Try Process() Catch ex As Exception Console.WriteLine(ex.Message) End Try End Sub Sub process() (処理) End Sub End Module --windows----------------------------------------------------- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click (try~catch文) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click (try~catch文) End Sub   ・・・・・・・・(イベントが増える毎にtry~catch文記述?) End Class

  • コールバックでイベントを使うメリットは何でしょうか

    コールバック関数を実行するのに、わざわざイベントを使う利点は何でしょうか。 下記のコードでは、どちらでも大して変わらないように見えますが・・・ Module modMain Sub Main() Dim myRaise As clsMyRaiseEvent = New clsMyRaiseEvent 'イベントを使った使用法 AddHandler myRaise.MyEvent, New clsMyRaiseEvent.dlgMyEvent(AddressOf MyCallBack) myRaise.Test1() '関数ポインタ的な使用法 myRaise.callback = New clsMyRaiseEvent.dlgMyEvent(AddressOf MyCallBack) myRaise.Test2() Console.ReadLine() End Sub 'コールバック関数 Private Sub MyCallBack(ByVal aEx As Exception) Console.WriteLine("Called") End Sub End Module Public Class clsMyRaiseEvent Public Delegate Sub dlgMyEvent(ByVal aEx As Exception) Public Event MyEvent As dlgMyEvent 'デリゲート型のイベント Public callback As dlgMyEvent Public Sub Test1() RaiseEvent MyEvent(New Exception) End Sub Public Sub Test2() callback(New Exception) End Sub End Class

  • VB.2005でXMLを読み込む時のパス設定

    Javaで作成されたXMLをVB.net2005で読み取る際にVBでのXMLへのパス指定に関する質問です。開発環境はVisualStadio2005です。 javaで「D\Sample.xml」(適当なフォルダーに)を吐き出し。 ***VB***↓ Imports System.Xml Module Module1 Sub Main(ByVal args() As String) 'XMLファイルの読取り Dim xmlRdr As New XmlTextReader(args(0).Trim()) xmlRdr.Read() Console.WriteLine("タグ名:" + xmlRdr.LocalName) Console.WriteLine("値:" + xmlRdr.ReadString()) xmlRdr.Close() EnD Sub End Module プロジェクトのプロパティページのデバッグでコマンドライン引数指定で「D\Sample.xml」を指定。 しかし、読み込まれるのは\objの\Releaseと\のDebug上のxmlを読み込んでしまいます。しかも自動バックアップ?の関係で上記コードに無い作動(上記だと読み込みだけだが、先に作ったXML作成モジュールを実行してしまう)でXMLを自動作成してしまいます。 好きな場所のファイル名を指定させる方法を教えて下さい。 普段はEclipse+Javaで開発を行っていてEclipseのパス設定感覚ではうまくいかないのですか?

  • VB6構造体をVB2008クラスで行う場合

    何方かの質問「VB6構造体をVB2008クラスで行う場合」 の回答プログラムにて参考とさせて頂きましたが 申し訳ありません、初心者しにて・・・・・教えてください。 値を「登録、参照部分」のクラス(抜粋) Public Class Program   Public Shared Sub Main()    (省略)   End Sub End Class 上記部分なのですが (1)Sharedを使用する訳はなんでしょうか?(省いても問題ありませんか?) (2)登録、参照部分のクラスPublic Shared Sub Main()を「登録のメソッド」と「参照のメソッド」に   分けたいのですがどうしてもうまくいきません。   何方か御教授願えないでしょうか? よろしくお願いします。 「以下何方かの質問の回答プログラム」 ■クラス+コレクションクラス Public Class Group   Public MainID As Integer   Public SubID As Integer   Public Value1 As Integer   Public Value2 As Integer End Class Public Class GroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Group)   Public Shadows Sub Add(ByVal Item As Group)     MyBase.Add(Item.SubID, Item)   End Sub End Class Public Class Program   Public Shared Sub Main()     Dim DataDict As New GroupCollection     Dim NewGroup As New Group     NewGroup.MainID = 1     NewGroup.SubID = 101     NewGroup.Value1 = 123     NewGroup.Value2 = 234     DataDict.Add(NewGroup)     Console.WriteLine(DataDict.Item(101).Value2) ' 出力 234   End Sub End Class

  • VB2008: 独自例外とは?

    独自例外の確認ための質問をします。 独自例外の発生をキャッチして表示する術がわからなくて苦肉の策でエラートラップを利用。 しかし、こういう事であれば何も独自例外を設定する必要がありません。 と思ったり、「スルーだからテストに<0除算>を選んだのが悪いのか?」と考えたり。 ともかく、判っているのか判っていないのかが判らない状態に陥っています。 そういうことで、独自例外について少し教えて頂ければ幸いです。 ' ============================== ' クラスプログラミング; 演習2 ' ============================== Module theClass   Sub Main()     On Error GoTo Error_Main     Dim T1 As New TEST1     Debug.Print(T1.MembersLengthAverage.ToString) Exit_Main:     Exit Sub Error_Main:     ErrorMsg(Err.Description & "(Main)")     Resume Exit_Main   End Sub End Module ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _MemberCount As Integer   Private _Member1 As String   Private _Member2 As String    ReadOnly Property MembersLengthAverage() As Integer     Get       If _MemberCount <> 0 Then         Return (_Member1.Length + _Member2.Length) \ _MemberCount       Else         Throw New System.Exception("TEST1: 除算エラーが発生しました。" )       End If     End Get   End Property   Public Sub New()     _Member1 = ""     _Member2 = ""   End Sub End Class

  • VBA クラスにプロパティが実装できません

    VBA初心者です。 現在、Excel2003-VBAでクラスにプロパティの実装を試みていますが、うまくいきません。 Publicで宣言する方法は問題なく出来たのですが…。 勉強用のため、敢えて簡単なサンプルを自分で作っています。 【状況】 下記プログラムで、メッセージを「20」と表示させたいのですが、 「スタック領域が不足しています」エラーにより、実行できません。 また「Atai」を「Suji」にかえると、メッセージとして「0」と出てきます。 あるいは、「Suji = Atai + 5」を消してみても「15」ではなく「0」と出ます。 【質問】 どちらでもうまくいかないのですが、これは (1)このコードがおかしいのか、それとも (2)単純なプログラムであるのに領域不足と出るところから、 VBA特有の不具合でどうしようもない物なのでしょうか? ご意見お待ちしています。 ===通常Module(呼び出し側)=== Option Explicit Sub 実行() Dim Haichi As New Class1 With Haichi .Suji = 15 .MSGクラス End With End Sub ===クラスMODULE(Class1)=== Option Explicit Sub MSGクラス() MsgBox Suji End Sub Public Property Let Suji(Atai As Double) Suji = Atai + 5 End Property Public Property Get Suji() As Double End Property

専門家に質問してみよう