質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

17815閲覧

VBAでユーザーフォームを最大化ウインドウで表示する方法

giftend

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/01/18 06:48

###前提・実現したいこと
VBAでユーザーフォームを表示するプログラムを作成しています。
ユーザーフォームに最大化、最小化ボタンを付属させるため
http://propg.ee-mall.info/プログラミング/vba/「excel-vba-ユーザーフォームをリサイズ可能にする/
こちらのサイトに掲載されているコードを参考に(というより丸パクリ)してプログラムを作成しました。

ここで質問なのですが、ユーザーフォームが表示されるときすでに最大化されているようにするためにはソースコードにどのようなプログラムを追加すれば良いのでしょうか?

UserForm.Width = Application.Width
UserForm.Height = Application.Height

というのではなく、最大化ボタンをクリックしたときの状態にしたいです。

拙い文章で申し訳ありませんが、回答よろしくお願いいたします。

###該当のソースコード

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare PtrSafe Function WindowFromAccessibleObject Lib "oleacc" ( _
ByVal pacc As Object, _
ByRef phwnd As Long) As Long
Private Const GWL_STYLE = (-16) 'ウィンドウスタイルを取得
Private Const WS_THICKFRAME = &H40000 'ウィンドウのサイズ変更
Private Const WS_MINIMIZEBOX = &H20000 '最小化ボタン
Private Const WS_MAXIMIZEBOX = &H10000 '最大化ボタン

Private Sub UserForm_Initialize()
Dim fStyle As Long
Dim hwnd As Long
'ユーザーフォームのハンドルを取得する
WindowFromAccessibleObject UserForm, hwnd
'ウィンドウに関する情報を取得する
fStyle = GetWindowLong(hwnd, GWL_STYLE)
'Min,Maxメニューボタンを付加する
fStyle = (fStyle Or WS_THICKFRAME Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
'ユーザーフォームのボタンを再設定する
SetWindowLong hwnd, GWL_STYLE, fStyle
'ユーザーフォームのメニューバー外枠を再描画する
DrawMenuBar hwnd
UserForm.Show
End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

同じ質問で解決されている方がいます。

ユーザーフォームの最大、最小化コード

投稿2018/01/18 08:51

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

giftend

2018/01/18 09:16

回答ありがとうございます。そちらの質問者様のコードも試してみたのですが、拡大縮小ボタンが表示されなかったため質問した次第です。 CustomizeFormの最後にUserForm.Showと書いたのですがそこが間違っているのでしょうか。
guest

0

ベストアンサー

ShowWindowでできたかと
宣言はこんな感じです。

vba

1Const SW_SHOWNORMAL = 1 2Const SW_SHOWMINIMIZED = 2 3Const SW_SHOWMAXIMIZED = 3 4 5private Declare Function ShowWindow Lib "User32" (ByVal Hwnd As Long, _ 6 ByVal nCmdShow As Long) As Long

呼ぶ時はcall ShowWindow(Me.hwnd, SW_SHOWMAXIMIZED)
みたいな感じで。

#追記
ExcelにHwndないんですね。追加します

vba

1Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, _ 2 ByVal nCmdShow As Long) As Long 3Private Declare Function WindowFromAccessibleObject Lib "oleacc.dll" _ 4 (ByVal IAcessible As Object, ByRef Hwnd As Long) As Long 5 6Public Property Get Hwnd2() As Long 7 WindowFromAccessibleObject Me, Hwnd2 8End Property 9

呼ぶ時はcall ShowWindow(Me.Hwnd2, SW_SHOWMAXIMIZED)
みたいな感じで。

#追記

vba

1Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ 2(ByVal hwnd As Long, _ 3ByVal nIndex As Long) As Long 4Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ 5(ByVal hwnd As Long, _ 6ByVal nIndex As Long, _ 7ByVal dwNewLong As Long) As Long 8Private Declare PtrSafe Function DrawMenuBar Lib "user32" _ 9(ByVal hwnd As Long) As Long 10Private Declare PtrSafe Function WindowFromAccessibleObject Lib "oleacc" ( _ 11ByVal pacc As Object, _ 12ByRef phwnd As Long) As Long 13Private Const GWL_STYLE = (-16) 'ウィンドウスタイルを取得 14Private Const WS_THICKFRAME = &H40000 'ウィンドウのサイズ変更 15Private Const WS_MINIMIZEBOX = &H20000 '最小化ボタン 16Private Const WS_MAXIMIZEBOX = &H10000 '最大化ボタン 17 18'↓ここ################################## 19Const SW_SHOWNORMAL = 1 20Const SW_SHOWMINIMIZED = 2 21Const SW_SHOWMAXIMIZED = 3 22 23private Declare PtrSafe Function ShowWindow Lib "User32" (ByVal Hwnd As Long, _ 24 ByVal nCmdShow As Long) As Long 25'↑ここ################################## 26 27Private Sub UserForm_Initialize() 28Dim fStyle As Long 29Dim hwnd As Long 30'ユーザーフォームのハンドルを取得する 31WindowFromAccessibleObject UserForm, hwnd 32'ウィンドウに関する情報を取得する 33fStyle = GetWindowLong(hwnd, GWL_STYLE) 34'Min,Maxメニューボタンを付加する 35fStyle = (fStyle Or WS_THICKFRAME Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX) 36'ユーザーフォームのボタンを再設定する 37SetWindowLong hwnd, GWL_STYLE, fStyle 38'ユーザーフォームのメニューバー外枠を再描画する 39DrawMenuBar hwnd 40UserForm.Show 41'↓ここ################################## 42call ShowWindow(hwnd, SW_SHOWMAXIMIZED) 43'↑ここ################################## 44End Sub

投稿2018/01/18 07:00

編集2018/01/18 09:20
sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

giftend

2018/01/18 07:49

回答ありがとうございます。sousuke 様の回答を試してみたところ、 .hwndのところを指して、「メソッドまたはデータメンバーが見つかりません。」というエラーメッセージが表示されました。 自分はVBAも初歩的な知識で、APIに関してはまったくの無知でただサイトのコードをコピー&ペーストしているような状態です。無知で申し訳ありませんが、どこをどのように書き直せばよいでしょうか。
sousuke

2018/01/18 07:57

HwndはExcelのフォームに無いようなので代わりの方法で取得しましょう。 追記しておきました。
giftend

2018/01/18 08:47

再び回答ありがとうございます。試したところ先ほどと同じ「メソッドまたはデータメンバーが見つかりません。」というエラーメッセージが.Hwnd2の所で表示されました。 自分がプログラムを実行するとき「Meキーワードの使用方法が不正です。」というエラーが出るため、Meの部分をフォームのオブジェクト名に置き換えているのが何か起因しているのでしょうか。 何度も申し訳ありませんがぜひご教示ください。 ※また、書いていなかったのですが自分は今PowerPointでマクロを作成しています。もしかしてそこが原因でExcelで実行したらうまくいくのではと試してみたのですが同様のエラーが出てしまいました。
sousuke

2018/01/18 08:56

現状のコードを確認するとhwnd は既に取れているのでそれを使って下さい。
giftend

2018/01/18 09:12

回答ありがとうございます。.Hwndの所を.hwndに書き換えるという解釈でよろしいでしょうか?試したところ先ほどと同じエラーメッセージが出てきました。定義、宣言の所ではなくプログラムにどこか問題があるのでしょうか。
sousuke

2018/01/18 09:21

追加した部分よく見てください。最初のコードに追加しています。.hwndとかMeは忘れてもらって結構です。
giftend

2018/01/18 09:32

回答ありがとうございます。追記していただいた部分を見落としていました。申し訳ありません。 sousuke様の追記してくださったプログラムをコンパイルしたところ見事成功いたしました。無知な自分に何度も親切に回答していただき本当にありがとうございます。ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問