• ベストアンサー

Sub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・ 自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。 ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。 Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか? どなたか説明頂けませんか? よろしくお願いします。

noname#4100
noname#4100

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

  • ベストアンサー
noname#102878
noname#102878
回答No.1

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。 「指定項目」のところに「Public」と「Private」の説明がありますよ。 省略して「Sub hogehoge()」とした場合は「Public」とみなされます。 Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。 Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。 もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。 そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。 ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。 Test1はPublicで、Test2はPrivateだからです。

noname#4100
質問者

お礼

Privateを省略したSubはPublicとして扱われるのですね!(全然知りませんでした・・・) ありがとうございました! (申し訳ありません、もっと自分でヘルプを見てみることを覚えます・・・)

その他の回答 (2)

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.3

予断ですが、趣味でやられてるのか仕事なのかはわかりませんが、 ただ単にSubと記述するのではなくて、明確にPublicとPrivateを 記述するように心がけた方がいいですよ。 VBの関数名等は、英語の単語そのものが多いですのでその単語を 和訳して、解釈するのも間違いではないですよ。 ただ、全てがそうとはいえないですけどね。 Private → 個人 Public → 共有

noname#4100
質問者

お礼

お礼が遅くなりまして申し訳ありません。 私もここで伺ってから、きちんと書くようにしました(^^) ありがとうございました。

noname#4564
noname#4564
回答No.2

  ついでですので、Friendスコープもいっしょに憶えておきましょう。

noname#4100
質問者

お礼

Friendというのは初めて聞きました・・・ クラスモジュールのメソッドを外部から使える・・・とこの回答を拝見してからWebで見ました。 クラスモジュールはまだ使った(作った?)ことがありません。 確か他のプロジェクトからも使えるのですよね・・・ そういうのをいつか効率よく作れるようになりたいです(^^) ありがとうございました。

関連するQ&A

  • Private Subについて

    VB初心者ですが質問させていただきます。 現在 Private Sub CommandButton1_Click() で呼び出されている処理を、 コマンドラインからstart~.exeと入力して呼び出される(実行される)ようにするにはPrivate Subにてどのように記載してexeファイルを作成すればよいでしょうか?? 何分初心者な者ですので概念に間違いがありましたら申し訳ございません。 よろしくお願いいたします。

  • Private Sub内でSubをCallしたい

    Excel 2007でVBAを組もうとしています。 ユーザーフォームのコマンドボタンをクリックすると動く処理を Private Sub 内に書きましたが、処理が長くなりましたので、 Subに分けたいと思います。 Private subからSubプロシージャをCallすることはできますか? またどのSubでも同じ変数を使う場合、定義は、各Sub内で 毎回行う必要がありますか? 引数渡しのところがよく分からないので、すみませんが よろしくお願い致します。

  • コンボボックスについて

    コンボボックスでドロップダウンメニューが押された場合の処理は Private Sub ComboBox1_DropButtonClick() 処理 End Sub リスト項目がクリックされた時は Private Sub ComboBox1_Click() 処理 End Sub 上記の関数を組み合わせるにはどうすればよいでしょうか?用はComboBoxのドロップダウンメニューが押されて さらにリストの項目が選択してクリックした時はなんらかの処理を行うようにしたいのですがうまくいきません。よろしくお願い致します。

  • 別のプロシージャに変数を渡したい

    別のプロシージャに変数を渡せなくて困っています。 下記の内容を実行させようとしています。 1.command1ボタンをクリックして計算を終えて 2.command2ボタンをクリックすると計算結果をクリップボードに入れてメモ帳に貼り付ける コードの概要は下記です。 【1.】////////////////////////////////////////////////////////////// Private Sub Command1_Click() Dim final as String 'いろいろと計算して最終的にfinalというstring型変数に文字列を得る。 final=計算結果 End Sub 【2.】////////////////////////////////////////////////////////////// Private Sub command2_click() Clipboard.Clear Clipboard.SetText final Dim memo As Long memo = Shell("Notepad.exe", vbNormalFocus) AppActivate memo, True 'アプリをアクティブにする SendKeys "^v" End Sub ////////////////////////////////////////////////////////////////////// 調べた結果,ByValがキーワードではないかと思い,Private Sub Command1_Click(ByVala final as string)など試してみましたができませんでした。 [余談] 1.のプロシージャ内で,クリップボードに入れてしまえばよいのですが,そうすると,1.の処理が終わってから,command2を押すまでの間にユーザがクリップボードを利用したら,このプログラムが成立しなくなるので,それは避けたいと思っています。

  • 不要なイベントを削除したい

    フォームにコマンドボタン(名前:コマンド0)を置いて、 [イベント プロシージャ]にしてクリックするとVBE画面にプロシージャーが作成されますよね。 しかしそのコマンドボタンの名前を変更して(新しい名前:新コマンド0)、さっきと同じように [イベント プロシージャ]にしてクリックすると新たなプロシージャの型が作成されますよね。 Private Sub コマンド0_Click() End Sub Private Sub 新コマンド0_Click() End Sub こんなかんじで。 そんな事を一杯やり過ぎて、 Private Sub コマンド0_Click() End Sub の方がいっぱい余ってる?浮いてる?イベントに紐づいてない状態なのですが、 量が多すぎてどれが不要なプロシージャーなのかわからないのですが、 一気に削除する方法はありますか? 別にほっといても問題ないとは思うのですが、不要なものは削除したいです。

  • マルチスレッド処理?

    例えば、次のようなコードがあるとします。 Private Sub Command1_Click() i = 0 Do While (1) a = i i = i + 1 Loop End Sub このとき、Command1をクリックしても反応しないと思います。 ここで、Command1をクリックすれば反応してa = 0にリセット できるというような割り込み処理?を行えるようにするには どうすればよいですか? ご存知の方お願いします。

  • Access VBA Sub のパラメーター

    フォームに作ったボタンのイベントとして、 「イベント プロシージャ」→「クリック時」→ 「・・・」で サブルーチンを作ろうとしています。 「・・・」で Private Sub 名前_Click() が出ますが、パラメターを、例えば「名前_Click(p1)」と付けると 「イベントプロパティに指定した式 クリック時 でエラーが発生しました: ・・・」 が出ます。 (1)_Click()には、パラメターを設定できないのでしょうか? (2)もし、付けられるのでしたら、付ける方法を教えて下さい (3)もし、_Click()には、パラメターを設定できないのでしたら、代替え方法を教えて下さい よろしくお願いします。

  • ビジュアルベーシックのお絵かき掲示板

    まったくの初心者です。初歩的な質問で申し訳ありません。 カラーのところでクリックが実行できません。 なぜなのかよくわかりません。お暇なときご教授下さい。  そしてもう一つ質問ですが以下のコードを追加したいの ですがどこに挿入すればいいのですか。 →private sub image_click() ccolor = 7 end sub ここまでのコードを追加したいです。 ーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Command1_Click() Form1.Cls End Sub Private Sub Command2_Click() End End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Form1.DrawWidth = 3 If Button = 1 Then PSet (X, Y), QBColor(ccolor) End If End Sub Private Sub Label1_Click() cccolor = 14 End Sub Private Sub lavel2_click() cccolor = 0 End Sub Private Sub label3_click() ccolor = 9 End Sub Private Sub label4_click() ccolor = 12 End Sub Private Sub label5_click() ccolor = 10 End Sub

  • Private Sub UserForm_Init

    いつもお世話になります。 Windws7 excell2010 です。 同一のシートに二つの「Private Sub UserForm_Initialize()」があるときにどう名前を変えればまたはどうすればいいかご指導願えませんか。 「Private Sub UserForm_Initialize()」が一つの時はE5のようにうまく作動してくれます。 E列に 売上の 「回収」のリスト Private Sub UserForm_Initialize() F列に 何時の 「売掛月」のリスト(1~12の数字) Private Sub UserForm_Initialize() A列に =IF(B2="","",TEXT(B2,"mm")) 参考に下記します。 ~1 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "振込" .AddItem "現金" .AddItem "小切手" End With End Sub ~2 Private Sub UserForm_Initialize() With ComboBox2 .AddItem "10" .AddItem "11" .AddItem "12" End With End Sub '**************** '設定 '**************** Private Sub CommandButton1_Click() y = 2 Do While Cells(y, 2) <> "" y = y + 1 Loop Cells(y, 2) = TextBox1.Text Cells(y, 3) = TextBox2.Text Cells(y, 4) = TextBox3.Text Cells(y, 5) = ComboBox1.Text Cells(y, 6) = ComboBox2.Text UserForm2.TextBox1.Text = "" UserForm2.TextBox2.Text = "" UserForm2.TextBox3.Text = "" UserForm2.ComboBox1.Text = "" UserForm2.ComboBox2.Text = "" UserForm2.TextBox1.SetFocus End Sub

  • マクロでフォーム処理の繰り返し

    よろしくお願いします。 マクロでフォームを作成したとき同じような処理がたくさんある時、繰り返し処理は可能でしょうか? 例えば以下のような処理をループ処理できないでしょうか? Private Sub Label1_Click() Label1.BackColor = RGB(255, 0, 0) End Sub Private Sub Label2_Click() Label2.BackColor = RGB(255, 0, 0) End Sub Private Sub Label3_Click() Label3.BackColor = RGB(255, 0, 0) End Sub   ・   ・   ・ Private Sub Label100_Click() Label100.BackColor = RGB(255, 0, 0) End Sub

専門家に質問してみよう