こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

「コンパイルエラー 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

投稿日時 - 2017-09-07 01:02:58

QNo.9371784

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

No4です。言葉の変換で変な変換になっていました。

>ウィンドウの変化を悪人するか、あるいは、

は、

ウィンドウの変化を確認するか、あるいは、

です。「確認」のつもりが「悪人」になっていました。

投稿日時 - 2017-09-07 15:46:52

お礼

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

投稿日時 - 2017-09-09 05:13:51

ANo.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

これを標準モジュールの実行で確認すればいいかと。

投稿日時 - 2017-09-07 15:41:23

お礼

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

投稿日時 - 2017-09-09 05:09:44

ANo.3

>今度はマクロ名を入力する画面が出てきます。
その画面を出しているのがなにかわからないことには。
別のコードが出しているのか、Accessが出しているのか・・・

Breakキーを押してVBAを一時中断してコードのその部分を実行しているときにその画面が出てきたのか調べましょう。

AccessのVBAだと1ステップ実行が出来るのは知ってますよね?
ブレークポイントを設定して普通に実行し、設定したポイントのコードを実行する前にプログラムが一時中断されます。
デバッグウィンドウで「print <変数名>[Enter]」とすると、変数に格納されている値を知ることが出来るし、ウォッチリストに観察したい変数を設定するとプログラムの実行位置がどこであろうと変数が格納している値を観察することもできます。

VBAで開発する時のデバックテクニックなので覚えておくと便利ですよ。

私はすでにAccess VBAは現役じゃないので具体的な方法はヘルプで探してください。
私がその方法を知ったのはVisual BasicのテクニックがAccessでもそのまま使えたので流用しただけです。
VBのヘルプを見たり市販の書籍を買って勉強しました。

投稿日時 - 2017-09-07 12:00:28

お礼

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

投稿日時 - 2017-09-07 13:13:47

ANo.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()を削除すればいいと思う。

投稿日時 - 2017-09-07 04:32:38

お礼

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

投稿日時 - 2017-09-07 11:28:39

ANo.1

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

投稿日時 - 2017-09-07 01:34:05

お礼

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

投稿日時 - 2017-09-07 11:28:18