今仕事でExcelでVBAを使って物を作っているのですが、コードはどこに書くのが一番よいのでしょうか?。たとえば、本を見ると標準モジュールに書いていっているのですが、自分は今ユーザーフォームでコマンドボタンを作ったりコンボボックスを作って、そのボタンをクリックすると自然とPrivate sub オブジェクト名_Click()と出て、その中に書いているのですが、そうすると標準モジュールに書く必要がなくなってしまう気がするのですが・・・。なので一応標準モジュールに内容を移して、フォームのところで関数として呼び出すようにしたのですが、どのように書くのがよいのでしょう?長々すいませんわかりづらかったら後で補足します。
後、今までCを勉強していたのでオブジェクト?メソッド?プロパティ?の書き方が今ひとつ覚えづらいのは慣れでしょうか?

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

A 回答 (3件)

次ぎのような実験が参考になりませんか。

基本的なことだと思うのですが、初等解説書2冊を読み返しましたが載っていませんでした。
ただし下記は理解のため実験的なもので、Module1に書くべきものは、既にご回答があるように、ルールがあり、それに従うべきはいうまでもありません。
(参考までにエクセル95時代はModule1,2、・・が
Sheetになっていて、それにコーディングをして、各コントロールのイベントの呼び出しは、OnAction=”プロシジィヤー名”を使っていました。
(1)
Form1-1 'このSub ProcedureをAと名づける
Private Sub Form_Click()
Msgbox "form1"
aaa
End Sub
Private Sub aaa()       'このSub ProcedureをBと名づける
Msgbox "mod1"       ’Form1のコードWindowに記述する
End Sub
実行-開始をクリックすると「form1」がでて、OKで「mod1」のメッセージが出る。
そのルーチンを通ったことの証です。
-----
(2)
上記のBの部分をModule-1のコードWindowに切り取り-貼りつけ
して移す。実行-開始をクリックすると「aaaがSUBまたは・・定義されていません」とエラーが出る。(Privateになっているためが原因)
-----
(3)
上記のBの部分をModule-1のコードWindowに切り取り-貼りつけ
して移す。BのPrivateをPublicに変えて、実行-開始をクリックすると
(1)と結果は同じで上手く行く。Privateを消してしまっても結果は同じ。
----
(4)
AとBを両方ともModule-1のコードWindowに切り取り-貼りつけして
移す。実行-開始をクリックすると、エラーは出ないが、Form1のClickイベントが効いてないようである。Form1実物とForm_Click()のイベントプロシジャー(Module1にある)が関連付けされてないようである。
-----
(5)
Form1に
Sub Form_Click()
bbb
aaa
End Sub
Module1に
Sub aaa()
MsgBox "mod1"
End Sub
Sub bbb()
MsgBox "form1"
End Sub
に記述して。実行-開始をクリックすると上手く行く。
------
(4)に対する対処方法がわたしはわかりません。
お分かりの方は教えてください。これが分かれば、Form1でもModule1でもどちらででも出来ますと納得できると思います。
    • good
    • 0
この回答へのお礼

例まで出していただいて大変参考になりました。わかりやすかったです。
ありがとうございました

お礼日時:2002/02/11 15:03

Privateで宣言された関数は、同じモジュールシート内から呼び出すことができません。



ちょっと愚痴を言うようですが、、、
結構前に、出向に出向して、人の作成したプログラムを見たことがあります。
仕事内容は、すでに作成してあるプログラムのバグ修正でした。

それが、とにかくプログラムが汚い!!

プログラムにはコーディング規約という物があります。変数やコマンドボタンの名前の付け方にも規約があります。これにぴったり沿わなくてもいいとは思うのですが、それでも統一された名前をつけなければ、他の人が見て解読ができません。
プログラムをみて、「ピクチャボックスを制御している/コマンドボタンの機能」と人目でわかるようにすべきです。

そして、各ボタンなどの機能は共通の処理を行う部分があるのであれば、関数化しておくと便利です。他のフォームからも呼び出すのであるのであれば標準モジュール、そうでなければ同じフォーム内のモジュールに書きます。
プログラムを作成する前に「機能分割」を行い、それに沿ったコーディングをしなければ、誰にも相手をしてもらえないプログラマになります。
最近そういった人が多く見られます。特に会社に就職をしたことが無いSOHOの人に多いです。プログラムを他の人に見られることが無いので、ベタ書きをしているからです。
(先に挙げた出向先のプログラムは、アルバイトのSOHO君が書いた物でした。。。)
そういった人は、別のプロジェクトを作成するときも、きっとベタ書きするのでしょうね。
標準モジュールには、「パーツとして扱える関数だけ書いてあり、コピペで他のプロジェクトに引用できるもの」「現在のプロジェクトでしか使わないプロジェクト内部での共通関数や変数」と分けておくと、別のプロジェクトでも、パーツとして扱った関数郡のあるモジュールは、全部使えてしまえます。

これらのことは、VBとかCとかそういう本ではなく、アルゴリズムの本を読んで学ぶことではないかと思います。

(この書き込みは、独自の殻にこもっているSOHOが最近は多く見られるということを言っているので、SOHOの人をけなす意味で書いたものではありません。ぼくも一応SOHO予備軍をしております。。。)

http://search.microsoft.com/default.asp?qu=%83R% …
↑参考URLが長すぎて、リンクが辿れないと思うので、ここに書きます。

以前
    • good
    • 0
この回答へのお礼

基本的な考えがわかりました。ありがとうございます。

お礼日時:2002/02/11 15:04

どこでもいいと思います.


ただ,標準モジュールは同じ操作をする場合に
何度も同じことを書くのがめんどくさいのであるものと私は思っています.
引数だけちゃんと渡す事ができれば
標準モジュールがあればものすごく楽にプログラムできますよ!

この回答への補足

早速のお返事ありがとうございます。
理解できたのですが、ということはフォームに書いてあるコードはPrivate sub ()で書いてありますよね?それは他のところ(たとえば標準モジュール)からは参照(呼び出せない)できないのでしょうか?

補足日時:2002/02/11 00:17
    • good
    • 0

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

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

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

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

Q掃除機のコードをまとめる

事務所で使用している掃除機(業務用)の電源コードをまとめることができる商品を探しています。
最近の掃除機はほとんどが電源コードは中に収納(?)できるようになっていますが、使用している掃除機は電源コードが出たままになっています。
そこで電源コードをまとめることができる商品をさがしているのですが名前がわかりません。
少し前にテレビで見たのですが、巻尺を大きくしたようなものに電源コードをいれてコードの長さの限界がきたらそこから少しずつ長さを伸ばしていくような商品が良いです。
掃除機はけっこう使用するので輪ゴムのようなもので束ねるという方法はなしでおねがいいたします。

説明がわかりにくくなってしまいましたが商品の名前などがわかる方、情報おねがいいたします。

Aベストアンサー

業務用掃除機は、本体に巻きつけることを基本にしています。掃除機を縛るようにまきつけてください。

業務用の掃除機は大電流をつかいますのでコードリール形状のものが使用できません。過熱や火災の原因になりますのでそのまま使用することをお薦めします。

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

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

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

Aベストアンサー

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

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

Q電気コードのまとめ方

パソコン、プリンター、テレビ、FAX、電話ゲームなど家電が多くて、コンセントが蛸足状態です。
それぞれのコードが邪魔でしょうがいないのですが、いくつかはある程度束ねてテープで軽く巻いてあります。
ちなみに、電気コードをまとめる為に、一回結ぶのは大丈夫でしょうか?
蝶結びとか、固結びでは無いです。
軽く一度だけ結ぶだけです。
どなたかアドバイス下さい。

Aベストアンサー

No.6の方の言われる事は、電気コードと使用電流に関する重要な基本的な事項ですので、一部重複しますが、補足させてください。

電気コードに電流が流れるとコードの電気抵抗と電流の2乗に比例して熱を発生しますが、この熱は、コードの表面から放熱され、ある温度で安定します。
電気コードに安全に流せる電流は、上記により専門家で決められていますが、規格の基準が、コードを束ねたり、丸めたりせず、ばらけてコードの表面の空気への放熱を妨げない条件になっています。
束ねたり、丸めたりすると放熱面積が不足し温度が上昇するということです。
カバーやパイプのようなものにいれても、かなりの電流の低減が必要です。

普通は、機器の設計者も安全を見てはいますが、更に取扱説明書に「束ねないで使用するよう」に注意書きを入れるのが一般です。
一例として掃除機の巻き込み式のものには、赤と黄色のマークがあり、黄色までは必ず引き出して使用するようになっています。

電子機器では、使用電流がそれほど多くはないので、問題ないものもあるには違い無いのですが、見分けられるかが問題です。

便利グッツなどには、この辺の検討が不十分なものもありますから、自己責任でお願いします。
発生熱量と放熱と上昇温度について、自信が無ければ、ばらけたままでの使用をお勧めします。
あるいは、束ねた中に温度計を仕掛けて、最悪条件で1昼夜程度の温度試験をなさるのが良いでしょう。

No.6の方の言われる事は、電気コードと使用電流に関する重要な基本的な事項ですので、一部重複しますが、補足させてください。

電気コードに電流が流れるとコードの電気抵抗と電流の2乗に比例して熱を発生しますが、この熱は、コードの表面から放熱され、ある温度で安定します。
電気コードに安全に流せる電流は、上記により専門家で決められていますが、規格の基準が、コードを束ねたり、丸めたりせず、ばらけてコードの表面の空気への放熱を妨げない条件になっています。
束ねたり、丸めたりすると放...続きを読む

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電気コードをまとめる良い方法。

 電気コードをまとめる良い方法はありませんか?。
 とにかく、ぐちゃぐちゃでそのうち絡まって解くのが大変ですし。

Aベストアンサー

以下のページの、「 ケーブル整理用品 」 の類などはいかがでしょう。

ELECOM - ケーブルアクセサリ
http://www2.elecom.co.jp/cable/accessory/index.asp

参考URL:http://www2.elecom.co.jp/cable/accessory/index.asp

Qユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列

ユーザーフォームのリストボックスの設定を標準モジュール内で取得した配列にしたい。

題名のままの説明ですが、ユーザーフォームのリストボックス値を配列にして動的に動作させるようにしたいのですが、標準モジュールでPublicで配列を宣言しているのですが、うまくユーザーフォームモジュールに渡っていないというか、その配列変数をユーザーフォームモジュール内に書くと配列が存在しません。
というエラーが出てしまいます。

かといってユーザーフォームでPublicで配列を宣言することもできないのでどうやってリストボックスに
配列を設定すればいいのかわかりません。

配列は2次元配列で視覚的に説明するとは列数が3行、行数は標準モジュール内でRedimにより可変します。この配列をそのままレコードセットみたいにリストボックスに設定したのですが、
なにか良い方法はありますでしょうか?

Aベストアンサー

補足してください。
この質問内容で読者にわかるかな。
(1)使用ソフトはExcel、アクセスVBAか(VB6系統、VB6かVBAか)。VB.NETか
(2)
A.リストボックスの項目(アイテム)のワンセットを
B.何かの機会に(きっかけにして)、
C.プログラムで
D.別の項目(アイテム)のワンセットに切り替えたいということか。
1次元で言うが、神奈川県と指定されれば、神奈川県内の市区町村名のリストをリストボックスのアイテムとして表示し、
、千葉県と指定されれば、千葉県内の市区町村コードを表示して、選択の選択肢(内容・数)を、少なく適切にしたいという事か。

Q電化製品のコードをまとめるもの!

パソコンや家電の配線コードが長くて、見た目にもジャマです!!

で、コレをまとめるものを購入しようと思ったのですが、検索しようにも名前が分かりません!!(>_<)

誰か、製品の名前を教えてください!!

Aベストアンサー

コルゲートチューブかスパイラルチューブはどうでしょうか。

コルゲートチューブは蛇腹上のチューブに切れ目が入っているので切れ目からコードを入れます。中のコードの太さに限界があります。ですが外しやすいです。

スパイラルチューブはらせん状になったチューブをコードに巻き付けるような感じです。巻き付けるので中のコードが多少太くても対応できます。ですが外す時にちょっとめんどうです。

どちらも100円ショップやホームセンター、大型の電気店などで売っています。

QVBAです。ユーザーフォームの表示させ、標準モジュールを読み込ませる方法について

こんばんわ。

教えていただけないでしょうか。。。

ワークシート上にコマンドボタンがあり、それを押すと集計を始めます。
その際にユーザーフォームで「集計中」と書いたものを表示させ、バックで集
計したいと思っておりますが、うまくいっておりません。

流れとしては、
ワークシート上に、コマンドボタンをクリックさせユーザーフォームを表示さ
せる「***.show」を記述し、集計するためのコードが書いてある標準モジュー
ル「module2」へ移動させる書き方をしたら、
***.show
の部分で止まってしまいました。
***.showから集計のコードへ移すには何かコツがいるのでしょうか???

恐れ入りますが、ご教示のほど宜しくお願いします。

Aベストアンサー

ANo2の方のを少し改良すると
'シートモジュール----------------------------------------------
Private Sub CommandButton1_Click()
 Call Test
End Sub

'標準モジュール----------------------------------------------
Sub Test()
Dim i As Long
 UserForm1.Show vbModeless
 DoEvents
 For i = 1 To 2000
  ActiveSheet.Range("A" & i) = i

  'ここを改良
  If i mod 10 = 0 then
   UserForm1.Caption = "ただいま処理中・・・・" & i
   DoEvents
  End if

 Next i
 Unload UserForm1
End Sub

ウィンドウズの処理(メッセージキュー?)の中では、画像処理の優先度が低いのです。
なので、表示を更新したい場合はDoEventsを入れて、表示をリフレッシュさせるのです。

ANo2の方のを少し改良すると
'シートモジュール----------------------------------------------
Private Sub CommandButton1_Click()
 Call Test
End Sub

'標準モジュール----------------------------------------------
Sub Test()
Dim i As Long
 UserForm1.Show vbModeless
 DoEvents
 For i = 1 To 2000
  ActiveSheet.Range("A" & i) = i

  'ここを改良
  If i mod 10 = 0 then
   UserForm1.Caption = "ただいま処理中・・・・" & i
   DoEvents
  End if

 Nex...続きを読む

Qコードをまとめるチューブの名前

電源などのコードをまとめる透明か半透明のチューブみたいな
たぶんみためストローの太いのみたいなものの名前はなんですか?
名前がわからないので調べようがないです。

Aベストアンサー

スパイラルチューブです。

QVB.netで標準モジュールからフォームを呼び出す

お世話になります。
標準モジュールから以下のようにフォームを呼び出しているんですがうまく表示されません。
どこが悪いんですか?

標準モジュール内----------------------

  Public Sub Main()
    Dim frm1 As New Form1
    frm1.Show()
  End Sub

Aベストアンサー

変わりに

Public Sub Main()
 Application.Run(New Form1)
End Sub

を使うと幸せになれるでしょう。

 原理が知りたいなら軽く解説を。君の書いたそれでは、Mainはフォームを作って表示さしたあとすぐ終了してしまう→frm1インスタンスは消滅+メインスレッドの停止でプログラムは終わりなんだな。これを回避するには、ApplicationシェアードオブジェクトのRunメソッドでForm1インスタンスの面倒を最後まで見てあげないといけない。


人気Q&Aランキング

おすすめ情報