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

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

ただいまの
回答率

91.01%

  • VBA

    1420questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 319

giftend

score 3

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

Const SW_SHOWNORMAL = 1
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMAXIMIZED = 3

private Declare Function ShowWindow Lib "User32" (ByVal Hwnd As Long, _
    ByVal nCmdShow As Long) As Long


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

追記

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

Private Declare Function ShowWindow Lib "User32" (ByVal hWnd As Long, _
    ByVal nCmdShow As Long) As Long
Private Declare Function WindowFromAccessibleObject Lib "oleacc.dll" _
    (ByVal IAcessible As Object, ByRef Hwnd As Long) As Long

Public Property Get Hwnd2() As Long
    WindowFromAccessibleObject Me, Hwnd2
End Property


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

追記

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   '最大化ボタン

'↓ここ##################################
Const SW_SHOWNORMAL = 1
Const SW_SHOWMINIMIZED = 2
Const SW_SHOWMAXIMIZED = 3

private Declare PtrSafe Function ShowWindow Lib "User32" (ByVal Hwnd As Long, _
    ByVal nCmdShow As Long) As Long
'↑ここ##################################

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
'↓ここ##################################
call ShowWindow(hwnd, SW_SHOWMAXIMIZED)
'↑ここ##################################
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 16:49

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

    キャンセル

  • 2018/01/18 16:57

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

    キャンセル

  • 2018/01/18 17:47

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

    ※また、書いていなかったのですが自分は今PowerPointでマクロを作成しています。もしかしてそこが原因でExcelで実行したらうまくいくのではと試してみたのですが同様のエラーが出てしまいました。

    キャンセル

  • 2018/01/18 17:56

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

    キャンセル

  • 2018/01/18 18:12

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

    キャンセル

  • 2018/01/18 18:21

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

    キャンセル

  • 2018/01/18 18:32

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 18:16

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

    キャンセル

  • 2018/01/19 16:48

    最大化や最小化ボタンはまた別のAPIを使って表示してやらないといけないはずです。

    https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1026716545

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    VBA google画像検索 画像表示

    エクセルのVBAで文字列に対する画像が表示されるマクロを作成したいです。 やりたいこととして例えば、 A列に5つワードが書かれており、 そのワードをひとつずつgoogleで画像検

  • 解決済

    VBA タイマー機能をつける

    文字の意味とフォントの色が一致しないようなテスト(ストループカラーワードテスト;例 あかという文字が緑色で書かれている)を作りたいです. 現在,問題は画像で表示して,その回答が下

  • 解決済

    VBAのShell関数で起動したアプリの終了方法について

    質問内容 VBA(Access) Shellで起動したアプリケーションを終了させるサンプルソースを作成したのですが上手く動作しません。 Shellでの起動までは動作するのです

  • 解決済

    ADODB.Stream 保存時エラー

    ADODB.Streamでファイルを作成していてSaveToFileで保存する際に、 ’アプリケーション定義またはオブジェクト定義のエラーです’とエラーが発生します。 変数SA

  • 解決済

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

    VBAのユーザーフォームに最大化、最小化ボタンを付けたくてネットを調べたところ コードが記載されていました。 コードを転記したところ、ユーザーフォームに最大最小ボタンが追加され

  • 受付中

    WEBサイトからファイルのダウンロード動作が不安定

    EXCEL VBAでWEBサイトからCSVファイルをダウンロード、名前を付けて保存させる処理をさせたいと思っています。 具体的には、①CSVダウンロードボタンをクリックした後、②フ

  • 解決済

    VBAで日付の検索して表示させる

    社内ツールを作成しています。 今日の日付から計算を行い、契約終了日から決められた日数を切っている契約案件を表示させようと思っています。 例:契約終了日が2017年9月20日だとして

  • 解決済

    VBA ユーザーフォーム内でコマンドボタン等を移動させる方法

    PowerPointのVBAでユーザーフォームを作成しています。 そこで以下のようなプログラムを作成しています。 ①フォーム内のコマンドボタンをクリックすると新たなコマンドボタンを

同じタグがついた質問を見る

  • VBA

    1420questions

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