はじめまして。

クラスモジュールと標準モジュールの大きな違いは何なんでしょうか?基本的な質問で申し訳ありません。どなたか教えてください。

ma-ki

このQ&Aに関連する最新のQ&A

A 回答 (4件)

乱暴な言い方をすれば、「オブジェクトとして使用するモジュール」ってことになるのかな?



例えば、標準モジュールから、Formオブジェクトを呼び出して、プロパティやメソッドを操作しますよね?
それと同じように、標準モジュールからクラスモジュールを呼び出して、(クラスモジュールに実装されている)プロパティやメソッドを操作するわけです。

使いこなすにはちょっとコツが要りますが、再利用性の高いクラスモジュールを作成すればアプリケーションの開発効率が大幅にアップします。
(ただし「何でもクラス主義(=クラス猿)」に陥らないように注意。標準モジュールとうまく使い分けることが重要です。)

月並みな回答ですが、実際に使ってみれば何となく理解できると思います。

'**** Hello.cls (クラスモジュール,オブジェクト名:Hello) ******
Option Explicit

Dim mTarget As String

Property Let Target(Target_ As String)  'プロパティの実装
 mTarget = Target_
End Property
Property Get Target() As String
 Target = mTarget
End Property

Public Sub SayHello()  'メソッドの実装
 MsgBox "Hello " & mTarget & "!!"
End Sub
'*********** ここまで ************


'****フォームにボタン(Command1)を貼っ付けて…******
Private Sub Command1_Click()
 Dim Hello1 As New Hello
 Dim Hello2 As New Hello
 
 Hello1.Target = "World"
 Hello2.Target = "Everyone"
 
 Hello1.SayHello
 Hello2.SayHello
End Sub
'****ここまで****
    • good
    • 0

まず、拡張子の違い


標準モジュール(*.bas)、クラスモジュール(*.bas)

次に、呼び出し方法の違い
標準モジュールではPublic変数やプロシージャの名称を記述するだけでしたが、クラスモジュールでは、
クラス名.プロシージャ(変数/プロパティ)
としなければなりません。

さらに、標準モジュールは同一プロジェクトからしか呼び出せませんでしたが、クラスモジュールは、ActiveX DLL/EXEとして、つまり、1つのオブジェクトとして、プロジェクトの外から呼び出すことができるという、大きな特徴があります。
    • good
    • 0

詳しくは正しいか分かりませんが自分はこのように認識しています。



クラスのメリット
1)DLLを作成したときにインターフェイスとなる。
2)オブジェクト化できる。
  例えばclsTestというクラスファイルを作成し、
  そのメンバとしてValueという変数を持っている時、
  Dim CLS1 As clsTest
  Dim CLS2 As clsTest
  Set CLS1 = New clsTest
  Set CLS2 = New clsTest
  CLS1.Value = "Test1"
  CLS2.Value = "Test2"
  という感じでオブジェクトとして
  同じ変数でも別物として保持できる。
  見た目のないコントロールのような感じです。
  またValueという変数をプロパティとして持てば、
  取得のみ可能とか設定のみ可能という風にもできます。

自分の知っているのは以上です。
参考になれば幸いです。
    • good
    • 0

VBのバージョンは?



ヘルプにそのまんまの項目があります。

『クラス モジュールと標準モジュール』を読んでみて下さい。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q私を見下す夫

先日、「君なんかに比べると俺の方が賢い」と平然と言われました。
仕事(結婚前同僚でした)にしろ、性格にしろ、知識量にしろ、すべて私は自分より劣っていると夫が思っていることはわかっていましたが、こうもはっきり言われると驚きました。
昨夜も食事中に、「99+88は?」と聞いてきました。
私は暗算が苦手なのですが、夫が何をしたいのかわかったので私は無視しました。
すると、やはり得意満面に計算の仕方を説明しようとしたので怒りました。

こんな夫を無邪気とかアホだなとか思って流した方がよいのかとも思いますが、こう何度も繰り返すと本当に腹が立ちます。

夫は意志が弱く、根気もなく、目標を決めて努力することができない人です。
人種差別的発言も平気でします。
それなのに、根拠はわかりませんが、自分には相当自信をもっているみたいです。
だから余計に夫がレベルの低い、浅い人間に見えて仕方ない時があります。

こんな夫の性格を治すことなんてできるとは思っていませんが、こういう人を選んで結婚してしまった自分を責める他ないのでしょうか。

Aベストアンサー

どうもコンプレックスがあるようですね、この旦那さん。
会社でストレスを溜めて帰ってきても、本来癒してくれるはずの奥様に劣等感を感じてしまって、
それが裏目に出ているようにも思えます。

本当は奥さんに思い切り甘えたいのに出来ないんでしょうね。家にいて素の自分が出せないのは苦しいですよ。奥さん何でもテキパキやる方じゃないですか?甘えにくいのかもしれませんよ旦那さん。もうちょっとソフトな雰囲気を作るようにしたらいいんじゃないかな。

例えば何を決めるにしても旦那さんにちょっと相談するようにすればいいです。二人の力で何事も成し遂げたよう見せれば、かけがえのないパートナーだと再認識させることが出来るかもしれませんよ。まずそんなにカリカリしないで、奥さんの方から少し歩み寄ってみましょうよ。

それから、もし馬鹿にされても悔しそうな素振りを見せないことです。そうなれば馬鹿にした甲斐がありますからね。表情に出さずスーッと流しなさい。
間違っても『私のような馬鹿な女と結婚したあなたは何なの!』なんていっちゃダメですよ(笑)

Q標準モジュールとクラスモジュールについて

標準モジュールでType型を使用しています。
この標準モジュールをクラスモジュールに置き換えて、Formから呼び出すCOMに作り変えたいのですが、引数ってどう設定したらよいのでしょうか?
今は標準モジュールなので、こんな感じで呼んでいるのですが・・・

例)
Private Sub Command1_Click()

Dim in_b As IN_PARA
Dim out_b As OUT_PARA

in_b.Name = "山本太郎"
in_b.Seikaku = "優しい"
in_b.Syumi = "釣り"
in_b.Tokugi = "野球"

Aベストアンサー

VBのCOMでは、Typeで宣言したものは公開できません。
公開可能なものは、Variantに格納できるもののみです。

対応としては、それぞれの項目を別々のプロパティにするしかないです。

QVBのフォームモジュールと標準モジュールの使い分け

VBのフォームモジュールと標準モジュールの使い分けが今一つわかっていません。
フォームモジュールとは、フォーム(画面)上で起こったイベント(例えば、ボタンをクリックした時とか、ユーザーが行を選択したりだとか)の処理を、記述するところと解釈しています。
標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり、フォームが1つでも、同じ処理を繰り返す場合、その処理を標準モジュールに書いたり・・・・という解釈をしています。
あってますでしょうか?

フォームが一つしかない場合、もしくは2つあっても、あまり共通する処理がない場合、なんかは標準モジュールはあまり使わないのでしょうか?
それとも、フォームが1つとかでも、今後のメンテの事など考慮して、標準モジュールを作ってそこにグローバル変数なんかで処理を書いた方がよいのでしょうか?
どなたか、教えてくださいませんか?
いろいろBBSなどで見てみるんですが、いろいろ書いてあって、どれが理想か
わかりません。よろしくお願いいたします。

Aベストアンサー

>標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり
で良いと思いますよ。
逆に
>フォームが1つでも、同じ処理を繰り返す場合
は、フォームモジュールの中に関数を作ってしまうので良いのでは?

参考になるかわかりませんが、私はDBとの接続や、起動時の全フォームのロード、定数やプロジェクトレベルでのグローバル変数の宣言等に使用しています。
そういえばMain関数は標準モジュールにしか書けませんでした…っけ?
メッセージボックスを表示する際の関数を自分で定数とMsgBox()を組み合わせて使い勝手の良い物にする…というのもよくやります。

QPublicステートメントと標準モジュールについて

標準モジュールを挿入して、変数の前にPublicを宣言してあげると、
どのモジュールからも参照が可能になるのは、本を読んでよく分かったのですが、
「Function」などで関数プロシージャの定義を標準モジュールでする時に、
「Public」があると、なしでは、どういった効果がでるのでしょうか?
本には、ほとんどPublicが宣言されていました。

関数プロシージャを定義する場合は、Publicを付けなくても、
他のモジュール(例えばフォームなど)から参照可能ですよね?

今一、標準モジュールと関数定義、Public変数の関連がわかっていません。

良かったら、アドバイスお願いします。m(__)m

Aベストアンサー

>関数プロシージャを定義する場合は、Publicを付けなくても、
>他のモジュール(例えばフォームなど)から参照可能ですよね?

それは関数プロシージャの場合、Publicが規定値だからです。
だから関数名にPublicやPrivateを付けないとPublicとみなされます。
逆に変数はPrivateが規定値になります。

しかしながら規定値に頼ってPublicやPrivateを省略すべきではありません。
なぜなら今のバージョンではこの規定値でも、将来のバージョンでは変わるかもしれません。
そうなるとプログラムが動かなくなるかもしれません。

また、プログラミング技術の面からも関数や変数の有効範囲(スコープ)は小さいほうが良いので、PublicやPrivateで有効範囲を指定すべきです。

この当りのことは、ヘルプでスコープを調べると良いです。

QExcelVBA 標準モジュール内関数の呼出し

VB6.0からExcelの標準モジュール内のパラメータ付関数を呼出すにはどうしたらよろしいでしょうか?
Dim app As Excel.Application
Dim wb As Workbook

Set app = CreateObject("excel.application")
Set wb = app.Workbooks.Open("TestXl.xls")

Set app = Nothing

以上のように記述し指定のエクセルファイルをオープンすることはできたのですが
ここからどうやって標準モジュールを参照し、その中の関数を実行するかがわかりません。

Aベストアンサー

Runメソッドを使います。
app.Run "xxx",aaa,bbb,・・・
"xxx"は関数名、それ以降はパラメータの並びです。

QUserFormから標準モジュールのIEを制御

VBAで、標準モジュールにて呼び出したIEオブジェクトをUserForm上から
制御する方法があればご教授願います。

Sub SampleModule()

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "http://www.yahoo.co.jp"

UserForm1.Show

~~~~~~~~~~

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Module1.SampleModule.objIE.Navigate "http://www.google.co.jp"
↑こういう感じの解をイメージしてます。

End Sub

つまり、標準モジュールでセットしたオブジェクトを、呼び出した
フォーム上から参照したいわけです。宜しくお願いします。

Aベストアンサー

Dim objIE As Object

を削除して、

Public objIE

として、標準モジュールに登録し、

Module1.SampleModule.objIE.Navigate "http://www.google.co.jp"

を、

objIE.Navigate "http://www.google.co.jp"


にすればいいのでは。
リストボックスのダブルクリックでリストボックスの
アイテムの中のURLを選択するというように見えますが、
そのあたりはいかがですか。そのような場合は、

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
objIE.Navigate ListBox1.Text
End Sub

でもよろしいかと。

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

こんにちは。
標準モジュールからフォームのリストボックスに文字を追加したいんですが、うまくいきません。
まず、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

こんにちは。
標準モジュールからフォームのリストボックスに文字を追加したいんですが、うまくいきません。
まず、button1をクリックすると、共通モジュールのサブルーチンを呼び出します。そして引数"0"を渡すと、Form1のListBox1に"hello"を追加したいのです。
実行させると、エラーはでないのですが、追加されるはずの"hello"がListBox1に追加されません。
たぶん
    frm1.ListBox1.Items.Add("hello")
あるいは
   Dim frm1 As New Form1()
あたりの宣言の仕方がまずいのだと思うんですが....続きを読む

Aベストアンサー

あまり気にしないでほしい出んけども、
Dim frm1 As New Form1()
としているだけで、
実体の
frm1 = Form1.ActiveForm
を関連付けていないからではないでしょうか?
たびたびすみませんでした。
自身なしです。
Sub PC(ByVal PCrecieve As String)
frm1 = Form1.ActiveForm
If PCrecieve = "0" Then
frm1.ListBox1.Items.Add("hello")
End If
End Sub

Q標準モジュールから呼び出し元に戻って、入力作業

標準モジュール内でif文を使い、変な文字が入力されると、また呼び出し元に戻り、入力作業させたいのですが、else 以下にどういうコーディングを書けばよいかわかりません。exit function とやると、呼び出し元の次のステートメントが処理されてしまいます。この次のステートメントの処理をさせないで、最初の入力作業をさせたいのですが、わかりません。宜しくお願いいたします。

Aベストアンサー

【呼び出し元】
If モジュール処理 Then
 次の処理へ
Else
 最初の入力作業へ戻る
End IF

【モジュール】
Public Function モジュール処理(引数) As Boolean
モジュール処理 = False
If 引数が正しく無い Then Exit Function
モジュール処理 = True
End Function

こんな感じでしょうか。
質問の意味を取り違えていたらごめんなさい。

Q標準モジュールを共通で使うには?

いつもお世話になります。VB2005です。
ソリューションには最低1個のプロジェクトが存在します。それに複数個の標準モジュールを追加してプログラム全体を構成しています。

ここで、独立した複数個のソリューション(プロジェクト)をつくり、それぞれから共通に利用できる標準モジュールを利用することがあります。この標準モジュールに何か変更が生じたときは、それらを利用しているプロジェクト内へファイルコピーして、後日の不一致を防止しています。

過去の古いVBでは、特定のホルダーに標準モジュールを置いておくことで共用ができていたと記憶しています。ですから、ある編集中プロジェクト内の標準モジュールに変更があっても、他のプロジェヘクトへ自然に反映されていました。
VB2005においても何かの設定で同様のことが可能でしょうか?
よろしくお願いします。

Aベストアンサー

標準モジュール追加するときに、
プロジェクトの右クリックメニューにて「追加」→「既存の項目」
で追加されていると思いますが、
その追加ダイアログのファイル名の右端にある選択ボタンを「リンクとして追加」にすれば、ご希望の方法になるはずです。

ただ個人的にはその様なモジュールは共通クラスライブラリとしてプロジェクト(共通クラスライブラリのDLL)として起こされた方が通常のやり方だと思いますが。

Q標準モジュールが入っているワークブック

Excel VBAです。
二つのワークブックを開いておいた状態で
両方のブック内のユーザーフォームを表示した状態にします。

この時、ある片方のワークブックを表示した状態でもう片方のユーザーフォームを使って
標準モジュールを実行したとします。

すると、当たり前ですが、エラーが出るか、間違った計算を行ってしまいます。

これを防ぐために、
if ActiveWorkbook.Name = xxxxx then

といったものを用いる必要があります。

ワークブックの名称を書き換えるたびに
このxxxxxのところも毎回書き換える必要があり、面倒なのですが、
実行した標準モジュールが入っているワークブック名を
返り値として返す関数ってありますか?

Aベストアンサー

モジュールの入ってるブックは、ThisWorkbook
 if ActiveWorkbook.path = Thisworkbook.path then
でいいと思いますが・・・

ActiveSheetじゃなくて、Thisworkbook.SHeets("xxx")の形で指定した方が良さそうですね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報