• 締切済み
  • すぐに回答を!

【EXCEL VBA】Visual Basic Editorについて

お世話になります。 EXCELで「Visual Basic Editor」を開くと、 左側に下記が表示されます。 Microsoft Excel Objects > Sheet1、Sheet2、Sheet3、ThisWorkBook フォーム > UserForm1 標準モジュール > Module1 クラス モジュール > Class1 Sheet1やUserForm1、Module1、Class1にそれぞれコードを 入力できますが、違い、使い分けについて教えてほしいです。 どれにコードを書いていけばいいか分からず困っています。 よろしくお願いします。

noname#59735

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数771
  • ありがとう数1

みんなの回答

  • 回答No.3
  • Wendy02
  • ベストアンサー率57% (3570/6232)

こんばんは。 一応、前のご質問からすると、「マクロの入門者」ですとなっていましたが、私も、入門時にはさっぱり分かりませんでしたね。 大きく別けると、三つに分かれると思います。 ・標準モジュール ・クラスモジュール ・ローカルモジュール(≒オブジェクトモジュール)  (シート, UserForm, ThisWorkbook) となっています。 「標準モジュール」に書いておくと、ちょうど、家の中で、家族全員が集まるような居間で、そこで声を掛けると、一通り、どこにでも声が届くようになっています。つまり、どこか特定のオブジェクトに関連付けられておりません。個々のオブジェクト(シートやUserForm)からでも、自由に取り出しが利きます。Excelでは、基本的には、「標準モジュール」に書いてください。時々、シートモジュールなどに、ごちゃごちゃ書く人がいますが、それは間違いです。 「標準モジュール」に書けば、シートを転々と動かしても、その親オブジェクトは、指定しなければ、ActiveSheet になっています。「ローカルモジュール」では、違う場所の場合は、シートなどを指定しなくてはなりません。そうしないとは、エラーが出ることが多いです。 そういう点で、「標準モジュール」は、ローカルに対して、「グローバル」だと思ってよいと思います。共通する定数や変数を置く場合も、そこに書きます。(厳密な意味での「グローバル」というのは、また違いますから、いずれ、あのとき、掲示板の回答者の言ったことはウソだったなんて思わないでください。「グローバル」というのは、本当に、どこからでも、ということになるのですが、一般的な方法では、同じブック内だけしか呼び出しが利かないと思ってください。) 「ローカルモジュール」は、その親オブジェクトが、シート(Sheet1)だったり、UserFormだったりします。ThisWorkbook というのは、そのブック全体の入り口のような場所です。多くは、その親オブジェクト固有のコードが多く、イベント・ドリブン型と言って、オブジェクト自体を操作したときに起動することで動かすマクロのために使います。 UserForm も同じです。UserForm のそれぞれのコントロール(ボタンやテキストボックスなど)を動かすときに起動するマクロを書き込みます。 「クラスモジュール」は、それ自身が、固有のオブジェクトとなり、プロパティやメソッドを記述することが可能です。オブジェクトの設計図のような場所で、オブジェクトの動作をコントロールすることが出来ます。例えば、新しいブックを開いたときに、デフォルトをユーザーの思うような仕様にしたいというようなことも、機能的に許されれば可能です。 しかし、「クラスモジュール」は、Excelでは多くは、上記のローカルモジュールと同じようなイベント・ドリブン型の、ユーザー設定したものを、コントロールに付け加えるときが多いです。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • VBAでマルチページの表示

    エクセル2002使用です。 ユーザーフォーム(オブジェクト名:UserForm1)に、マルチページ(オブジェクト名:page1)を配置してフォームを作成しました。 Sheet1にコマンドボタンを貼り付け、コマンドボタンをクリックして、標準モジュールを呼び出し、マルチページを標準モジュールから呼び出せるようにしたいのですがうまくいきません。 ’Sheet1 Private Sub CommandButton1_Click() Call フォーム表示 End Sub ’標準モジュール Sub フォーム表示() UserForm1.Show ’?ここのコードをいろいろ試したのですがわかりません。 End Sub この他 UserForm1.ShowPages "page1" とか 変数を入れてみたりしたのですが、うまくいきません。 すいませんが、よろしくお願いします。

  • 実行時エラー'424':オブジェくトが必要です

    いつもお世話になります。 WIN7 EXCELL2010 です。 ユーザーフォームを作成中です。 ユーザーフォームを開きたいのですが 「実行時エラー'424': オブジェくトが必要です。」が出ます。 Module1のコードを出し「実行」→「Sub/ユーザーフォームの実行」をすると、 下記の1)は上手くゆくのですが2)は上記のエラーが出ます。 何がいけないのかわかりません。 なにか考えられることはありますか。 ご指導ご指摘をいただけないでしょうか。 1)Module1 (Sheet17 / UserForm1)は Sub FormSample() Do UserForm1.Show Loop End Sub 2)Module2 (Sheet20 /myForm)は Sub FormSample() Do UserForm2.Show Loop End Sub UserForm2 の名前でユーザーフォームは作成してあります。

  • VBAについて教えて頂けませんか?

    昨日から、エクセル2003を使ってVBAを、勉強している者です。 ネット上で調べながら、取合えず簡単なVBAを入れる事が出来ました、ですがエラーばかりで、どうしても先に行けず困っています。 ネット上で参考になる、VBAなどを見て思ったのですが エクセルのVisual Basicを開くと、左側に「Sheet1」とか「Module1」等があります。 参考になるVBAでは、「Sheet1」に書かれているのがあれば、「Module1」に書かれているのもあります。 VBAは「Sheet1」に、書き込まれるべきなのでしょうか?それとも 「Module1」に、書き込まれるべきなのでしょうか? 私の場合、例えば「1」「2」「3」と数字を打ってマクロの記録をして、Visual Basicを開くと、すべて「Module1」に書き込まれます。 すみませんが、教えて頂けませんか?

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

普通初学者はModule1にコードを書く。 イベント(何何した(事象が起こった)ときのチャンスを捉える)場合、はその事象の起こるシートのSheetXを選ぶ。 ユーザーフォーム(台紙)を使う場合はUserForm1 クラス モジュール は当面対象外。

共感・感謝の気持ちを伝えよう!

  • 回答No.1

> どれにコードを書いていけばいいか分からず困っています。 というレベルであれば、標準モジュールに書いておけば間違いないです。 そのうちに、シートモジュールとかのことを徐々に勉強していくことになると男観ます。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • VBAのプロパティウィンドウについて

    VBAでプロパティウィンドウには ・Microsoft Excel Object ・フォーム ・標準モジュール があります。 ところで、下のプログラムですが、(1)の部分を標準モジュールに書き込み、フォームにあるコマンドボタンをクリックしたら、"test.xls"が表示されます。 しかし、(1)の部分をMicrosoft Excel Object のsheet1(sheet1)のコードに書き込み、プログラムを実行させると、フォームのコマンドボタンをクリックしても"test.xls"は表示されません。 これはなぜですか? (1)の部分のコマンドボタン1はsheet1に存在します。 (1)----------------------------------- Private file_name as string Private Sub CommandButton1_Click()   file_name="test.xls" UserForm1.Show End Sub (1)----------------------------------- フォーム Sub CommandButton1_Click() MsgBox file_name End Sub

  • Excelが動作後、ラン状態?

    Excelが動作後、ラン状態? Excel でsheet1の上に、コントロールツールボックスで、処理開始コマンドというのを 作成し、それを押すと(既に作成してある)UserForm1を表示し、そのテキスト入力の値に従ってデータ処理が分岐実行されsheet1に結果が表示されるというようにしました。 データ処理結果はOKなのですが、実行後UserForm1が表示されている間、Excelに対してラン状態のような感じで、どんなキーもカーソル動作も、クリックもきかない状態となっており、そこで後から下記の(UserForm1)のコマンド処理中にUserForm1.Hideを入れたら異常状態はクリアされたのですが、何かそれなりの理由が立つのなら教えていただきたい。 (sheet1) Private Sub CommandButton1_Click() UserForm1.Show End Sub (UserForm1) Private Sub CommandButton1_Click() Dim syorishitei As Integer Dim AA As Integer syorishitei = UserForm1.TextBox1.Value   この途中はいろいろあるが略します。 Call check200 UserForm1.Hide  ‘←ここを後から追加 End Sub

  • ExcelのVBAでフォームが表示されない

    Sub フォーム起動() UserForm1.Show End Sub 上記の内容をModule1にしてショートカットキーをを設定し、いつでも他に作ってあるユーザーフォームが起動するようにしていました。しかし先日、久しぶりに使ってみようと、設定したショートカットキーを押したら、VBAもマクロも全くいじっていないにも関わらず、「UserForm1.Show」の部分で「実行時エラー'380': Valueプロパティを設定できません。プロパティの値が無効です。」とエラーが表示されフォームが起動できません。これはいったい何が原因なのでしょうか。

  • ExcelVBA ユーザーフォーム間の変数について

    UserForm1のコントロールボタンbtn1又はbtn2をクリックするとUserForm2を開く。 UserForm1にはテキストボックスtxtN1、txtN2がある。 UserForm2のテキストボックスtxtN3に入力された値をbtnDecideをクリックすると、 UserForm1に自動入力するようにする。 その際btn1をクリックしてUserForm2を開いた場合はtxtN1に、btn2をクリックして開いた場合は txtN2に自動入力されるようにする。 以下のようにコードを組んでみました。 UserForm1のコード Public Number as integer Private Sub btn1_Click() Number = 1 UserForm2.Show End Sub Private Sub btn2_Click() Number = 2 UserForm2.Show End Sub UserForm2のコード Public Number as integer Private Sub btnDecide_Click() If Number = 1 Then UserForm1.txtN1 = txtN3.Text else:Number=2 UserForm1.txtN2= txtN3.Text End If Unload Me End Sub 以上になります。 どうもpublic 変数NumberがUserForm2を開いた段階でリセットされているようなのです。 何かいい方法はありますでしょうか。 教えていただける方がいましたらよろしくお願い致します。

  • Excelで『Microsoft Excel Objects』でのVBA

    こんにちわ。 早速ですが、Sheet1だけ他のBookでも使用する事があり、 Sheet1を移動した時に、VBAコードも一緒に移動させたいので、 『標準モジュール』ではなく、『Microsoft Excel Objects』の 「Sheet1(Sheet1)」部分にVBAコードを記入したいのですが、 他シートをデータを取得したりする処理が出来ません。 制約等あるのでしょうか? また、Sheet1を移動した時に、モジュールも一緒に移動させる事は 可能でしょうか? 宜しくお願いします。

  • ExcelVBAのユーザーフォームについて

    ExcelVBAのユーザーフォームについて ExcelVBAをゼロから独学で学んでる超初心者です。 ExcelVBAでデータベースを作っています。sheet1に配置してあるコマンドボタンでuserform1を開きそこに配置してあるlistbox1を選択するとuserform2~Xが開く設定にしています。 listbox1の内容はsheet2のデータのタイトルA~X(2列目~X列目)を読みに行っています。 userform2~Xの内容はsheet2のデータのタイトルA~Xのの内容を個別に作成しています。 流れはタイトルA(userform1-listbox1(1列目))を選択するとタイトルAの内容を表示(userform2)するというものです。userform2~Xはsheet2の上から順番に作っています。 sheet2の2列目の内容(タイトルA)→userform2 sheet2の3列目の内容(タイトルB)→userform3 という感じです。この状態だと問題なく開いていくのですが。このデータベースは後からタイトルをどんどん増やしていきます。そして、増やすたびにあいうえお順に並び替えをします。 そうすることによってタイトルと内容が合わなくなっていきます。例えば、 sheet2の2列目の内容が5列目(タイトルD)の内容に変更 sheet2の3列目の内容が2列目(タイトルA)の内容に変更 みたいな感じでバラバラになってしまいます。 流れがタイトルD(userform1-listbox1(1列目))を選択→タイトルA(userform2)を表示となってしまいます。 並び替えを行ってもタイトルとuserformがセットになる タイトルD(userform1-listbox1(1列目))を選択→タイトルD(userform4)を表示 となる様にするにはどうしたらよいのでしょうか? へたくそな説明でわかりにくかもしれないですが一生懸命書き込みました。 宜しくお願い致します。

  • エクセル2007VBAで連続データ(文字列)の入力

    ●質問の主旨 エクセル2007のVBAでマクロを作成して 同じ列に次々と文字を入力していくにはどうすればよいでしょうか? ●質問の補足 ワークシートのA列に文字列を入力していくマクロを 作成しようとしています。コードの概要は以下の通りです。 1.1回目の入力でA1セルには文字列を入力 2.1のあとフォーカスがテキストボックスに戻る。 3.2回目の入力でテキストボックスに文字列を入力 4.2回目の文字列がA2セル入力 5.以下2~5が続く ところが4のところでA1セルの内容を消去して 2回目の文字列をそのままA1セルに入力してしまいます。 コードに問題があると考えられますが、 どこに問題があるでしょうか? 以下のコードと添付画像をご参照の上、 ご教示くだされば幸いです。 なお添付画像の内容は、作成目標である A列に次々と文字列が入力されていく「模範解答」です。 ●コード (General)-連続データ入力 Sub 連続データ入力() UserForm1.Show vbModal End Sub (General)-(Declaration) Dim CelNo As String Dim Pos As Integer (UserForm1:UserForm_Initialize) Private Sub UserForm_Initialize() Pos = 1 CelNo = "A" & Pos End Sub (UserForm1:InputBtn_Click) Private Sub InputBtn_Click() With Worksheets("sheet1") .Range(CelNo) = UserForm1.TextBox1.Text Pos = 1 CelNo = "A" & Pos .Range(CelNo).Activate End With UserForm1.TextBox1.Text = "" UserForm1.TextBox1.SetFocus End Sub (UserForm1:CommandButton2_Click) Private Sub CommandButton2_Click() Unload UserForm1 End End Sub

  • ExcelVBA TextBoxの値を取得できない

    Excel2010です。 2つのUserFormがあり(UserForm1・UserForm2とします)、UserForm1にはTextBox1~100を配置し、UserForm2にもTextBox1~150を配置しています。 それぞれのUserFormにおいて、そのUserForm名を変数に格納しておき、TextBoxの値を取得するコードを別のプロシージャ(「TextBoxチェック」)に書き、それを呼び出してTextBoxの値を格納しようとしましたができませんでした。 該当箇所のコードは以下のとおりです。 Public UFName As String 'UserFormの名前 Sub UserForm1処理() Const Num = 100 UFName = "UserForm1" Call TextBoxチェック(Num) End Sub Sub UserForm2処理() Const Num = 150 UFName = "UserForm2" Call TextBoxチェック(Num) End Sub Sub TextBoxチェック(Num As Integer) Dim i As Integer Dim Con As Control With UserForms.Add(UFName) For i = 1 To Num Set Con = .Controls("TextBox" & i) Debug.Print Con.Name Debug.Print .Controls("TextBox" & i).Value   (その他の処理のコードは省略) Next i End With End Sub 上のコードでは1つ目のDebug.Printの結果(TextBox名)は取得できていますが、2つ目のDebug.Printの結果(TextBoxの値)は空欄になってしまいます。 つまり、 With UserForms.Add(UFName)が、 Set Con = .Controls("TextBox" & i) では反映されているのに、 .Controls("TextBox" & i).Value では反映されていないということだと思います。 また、 Debug.Print .Controls("TextBox" & i).Value を Debug.Print UserForm1.Controls("TextBox" & i).Value とすると、UserForm1の値を取得できます。 また、 With UFName_UF を With UserForm1 にすると、 Debug.Print .Controls("TextBox" & i).Value の値は取得できます。 UserForm1とUserForm2において、TextBoxの値を取得する部分は共通しているため、その部分を別プロシージャにして呼び出して処理したいのですが、うまくいきません。 TextBoxの値を取得できない理由や、対処法が分かれば教えていただきたいです。

  • EXCEL2003VBA 「マクロでモジュール解放」

    質問番号:5548045の関連質問です。 EXCEL2003VBA で、セキュリティ設定で『Visual Basic プロジェクトへのアクセス』にチェックを入れて、Module1に下記のように「モジュール解放」マクロを作成しましたが、Module1が削除されません。(1)を削除して、手動操作で変更を保存でファイルを閉じるとModule1も削除されます。 Module1の削除も全てマクロで行うやり方を教えてください。 With ThisWorkbook.VBProject.VBComponents .Remove .Item("Module1") .Remove .Item("Module2") .Remove .Item("Module3") End With ActiveWorkbook.SaveAs Filename:="D:\TEST" ActiveWorkbook.Close ・・・(1)

  • エクセルVBAでブックを開くとマクロを実行するようにしたいのですが

    ブックを開くと同時に開いたシートを保護するようにしたいのですがうまくいきません。通常(?)ボタンを作っておいて押すと実行すると思うのですが、そうせずにブックを開くと実行するようにならないかと思っています。保護をするコードはわかるのですが、どこにそれを書き込んだらいいのかもわかりません。VBAプロジェクトを見るとSheet1,Sheet2,ThisWorkbook,UserForm1とありますが、そのうちのどこかに置くのでしょうか?