• 締切済み

「コンパイルエラー End Subが必要です。」

Access2016でファイルを作成しているのですが、下記のVBAを実行しようとすると、「コンパイルエラー End Subが必要です。」とエラーメッセージが返ってきてしまいます。 構文の修正が必要であるとお気づきであれば、その箇所を教えていただけないでしょうか。初歩的な質問で恥ずかしい限りですが、何卒よろしくお願い致します。 Option Compare Database Option Explicit Public Declare PtrSafe Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _ ByVal fuFlags As Long) As Long Public Declare PtrSafe Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, ByVal fRever As Long) As Long Public Declare PtrSafe Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal uItem As Long, ByVal fuFlags As Long) As Long Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const HWND_TOP = &H0 Public Const SC_SIZE = &HF000 Public Const SC_MAXIMIZE = &HF030 Public Const SC_CLOSE = &HF060 Public Const SC_RESTORE = &HF120 Public Const MF_BYCOMMAND = &H0& Public Sub test() Private Sub Form_Open(Cancel As Integer) Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No4です。言葉の変換で変な変換になっていました。 >ウィンドウの変化を悪人するか、あるいは、 は、 ウィンドウの変化を確認するか、あるいは、 です。「確認」のつもりが「悪人」になっていました。

yatch1972
質問者

お礼

ご丁寧にありがとうございます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

まず、確認ですが、使用しているAccessは64Bit版ですか。 64Bit版ならば、そのまま使えますが、32Bit版ならば、 Public Declare PtrSafe Function の、PtrSafeを除いてください。 32Bit版でPtrSafeをつけるとエラーになります。 >実行を試みたところ、今度はマクロ名を入力する画面が出てきます。 これは、たぶん標準モジュールに Private Sub Form_Open(Cancel As Integer) -----中略-------- End Sub のコードも貼り付けたまま実行しようとしたのでは。 hWnd = Application.hWndAccessApp となっていますから、Accessのウィンドウを対象にあるフォームを 開くときにサイズを変更するということですから、このコードは 適当なフォームに上記コードを貼り付けフォームを開いてAccessの ウィンドウの変化を悪人するか、あるいは、 Private Sub Form_Open(Cancel As Integer) の行をを消して、 Public Sub test() を残して、 Public Sub test() Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub これを標準モジュールの実行で確認すればいいかと。

yatch1972
質問者

お礼

詳しく解説していただき、ありがとうございます。ご教授を参考に改めて動作を確認してみます。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.3

>今度はマクロ名を入力する画面が出てきます。 その画面を出しているのがなにかわからないことには。 別のコードが出しているのか、Accessが出しているのか・・・ Breakキーを押してVBAを一時中断してコードのその部分を実行しているときにその画面が出てきたのか調べましょう。 AccessのVBAだと1ステップ実行が出来るのは知ってますよね? ブレークポイントを設定して普通に実行し、設定したポイントのコードを実行する前にプログラムが一時中断されます。 デバッグウィンドウで「print <変数名>[Enter]」とすると、変数に格納されている値を知ることが出来るし、ウォッチリストに観察したい変数を設定するとプログラムの実行位置がどこであろうと変数が格納している値を観察することもできます。 VBAで開発する時のデバックテクニックなので覚えておくと便利ですよ。 私はすでにAccess VBAは現役じゃないので具体的な方法はヘルプで探してください。 私がその方法を知ったのはVisual BasicのテクニックがAccessでもそのまま使えたので流用しただけです。 VBのヘルプを見たり市販の書籍を買って勉強しました。

yatch1972
質問者

お礼

いろいろとご教授いただき、ありがとうございます。正直なところ、教えてくださったところまで理解が至っていませんが、私自身でも研究してみます。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.2

最後の行のEnd Subは「Private Sub Form_Open(Cancel As Integer)」のEnd Sub。 Form_Openの直前に記述されている「Public Sub test()」に対するEnd Subがないのが原因。 では、どこにEnd Sub を記述すればいいかというと「Public Sub test()」の直後かな? Form_Openというプライベート関数はこのコードが記述されているフォームが呼び出され開いたときに実行されるプリセット関数なので最後のEnd Subの最後にEnd Subを追加しても意味がない。むしろフォームを開いたときにForm_Openが実行されない可能性もある。 だから質問文にあるコートーだけを見るのであればPublic Sub test()を削除すればいいと思う。

yatch1972
質問者

お礼

回答、ありがとうございました。 ご指摘の箇所を修正したうえで実行を試みたところ、今度はマクロ名を入力する画面が出てきます。これはどのように処理すればよいか、おわかりでしょうか。度々、初歩的な質問で申し訳ございません。

回答No.1

Public Sub test() に対する End Sub が無い。

yatch1972
質問者

お礼

回答、ありがとうございました。 ご指摘の箇所を修正したうえで実行を試みたところ、今度はマクロ名を入力する画面が出てきます。これはどのように処理すればよいか、おわかりでしょうか。度々、初歩的な質問で申し訳ございません。

関連するQ&A