[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『スピンボタンでアプリケーションウィンドウを上下左右に移動』(カエムワセト)
お世話になります。
ユーザーフォームに配置した二つのスピンボタンでエクセルの ウィンドウを上下左右に移動させようとしています。
ウィンドウが最大化していたら一旦Normal(元のサイズに戻す) にしてからウィンドウを移動させます。
手動又は他のプロシージャでウィンドウサイズをNormalにしてお いたら With Application If .Left < 20 Then Exit Sub .Left = .Left - 20 End With だけでいけるのですが、最大化した状態ですと↑のコードだけでは エラーになるので Application.WindowState = xlNormal DoEvents DoEvents
を前に入れてみましたが、ウィンドウサイズはNormalにならず With Application If .Left < 20 Then Exit Sub .Left = .Left - 20 End With の部分でエラーになります。
コードをどのように書き換えたらいいでしょうか? ご教示お願いします。
'エクセルアプリケーションウィンドウを↓へ動かす Private Sub SpinButton1_SpinDown() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application .Top = .Top + 20 End With End Sub
'エクセルアプリケーションウィンドウを↑へ動かす Private Sub SpinButton2_SpinUp() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application If .Top < 20 Then Exit Sub .Top = .Top - 20 End With End Sub
'エクセルアプリケーションウィンドウを←へ動かす Private Sub SpinButton2_SpinDown() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application If .Left < 20 Then Exit Sub .Left = .Left - 20 End With End Sub
'エクセルアプリケーションウィンドウを→へ動かす Private Sub SpinButton2_SpinUp() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application .Left = .Left + 20 End With End Sub
< 使用 Excel:Excel2007、使用 OS:Windows10 >
スピンボタンのオブジェクト名が一か所間違ってましたので コードを修正したものをアップします。 よろしくお願いします。
'エクセルアプリケーションウィンドウを↓へ動かす Private Sub SpinButton1_SpinDown() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application .Top = .Top + 20 End With End Sub
'エクセルアプリケーションウィンドウを↑へ動かす Private Sub SpinButton1_SpinUp() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application If .Top < 20 Then Exit Sub .Top = .Top - 20 End With End Sub
'エクセルアプリケーションウィンドウを←へ動かす Private Sub SpinButton2_SpinDown() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application If .Left < 20 Then Exit Sub .Left = .Left - 20 End With End Sub
'エクセルアプリケーションウィンドウを→へ動かす Private Sub SpinButton2_SpinUp() 'If Application.WindowState = xlMaximized Then Exit Sub Application.WindowState = xlNormal DoEvents DoEvents With Application .Left = .Left + 20 End With End Sub (カエムワセト) 2021/01/15(金) 16:54
>ユーザーフォームに配置した
これが問題なのでは? どうやって、アプリケーションウインドウをアクティブにするのかが味噌では? 標準モジュールからでは動きました(2007) それで、モードレスでユーザーフォームを起動すると動きました。 最大化と標準サイズしかやってませんけど。
DoEvents無し
Private Sub CommandButton1_Click() Application.WindowState = xlNormal End Sub
Private Sub CommandButton2_Click() Application.WindowState = xlMaximized End Sub (why) 2021/01/15(金) 21:07
whyさんと同じですが、モダールなら、window指定をする必要があるということだと思います。 With Application.ActiveWindow .WindowState = xlNormal .Top = .Top + 20 End With
(kazuo) 2021/01/15(金) 21:22
因みにフルスクリーンって事は無いですよね?
Application.DisplayFullScreen = True
(why) 2021/01/15(金) 21:39
whyさん、kazuoさん、ご回答ありがとうございます。
ユーザーフォームはモードレスになっております。
私が少し調べた限りではExcel2010までと2013以降では Window.WindowState の対象が違ってくるようです。 当方Excel2007です。
↓を実行したらアプリケーションウィンドウは最大化のままで ブックのウィンドウのみがNormalになりました。
With Application.ActiveWindow .WindowState = xlNormal .Top = .Top + 20 End With
↓に書かれてました。
https://www.vba-ie.net/operation/windowstate.php
https://vbabeginner.net/maximize-minimize-window-display/
結果としましては、下記のようにアプリケーションウィンドウが最大化している場合は アプリケーションウィンドウにフォーカスを当てて3000ミリ秒ほど待ってアプリケーション ウィンドウをNormalにする、としてみました。 スピンボタンをクリックする前に手作業かコマンドボタンなどでウィンドウをNormalに しておくようにしたら3秒ほど待つ必要はなくなります。
下記のコードで様子を見てみます。ありがとうございました。
'標準モジュール Public Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
'ユーザーフォーム Private Sub SpinButton1_SpinDown() If Application.WindowState = xlMaximized Then AppActivate Application.Caption Sleep 3000 Application.WindowState = xlNormal End If With Application .Top = .Top + 20 End With End Sub
Private Sub SpinButton1_SpinUp() If Application.WindowState = xlMaximized Then AppActivate Application.Caption Sleep 3000 Application.WindowState = xlNormal End If With Application If .Top < 20 Then Exit Sub . Top = .Top - 20 End With End Sub
Private Sub SpinButton2_SpinDown() If Application.WindowState = xlMaximized Then AppActivate Application.Caption Sleep 3000 Application.WindowState = xlNormal End If With Application If .Left < 20 Then Exit Sub .Left = .Left - 20 End With End Sub
Private Sub SpinButton2_SpinUp() If Application.WindowState = xlMaximized Then AppActivate Application.Caption Sleep 3000 Application.WindowState = xlNormal End If With Application .Left = .Left + 20 End With End Sub (カエムワセト) 2021/01/16(土) 10:28
Sleep 3000 を Sleep 100 にしてもエラーにならなかったので Sleepの部分をコメントアウトして実行しても エラーになりませんでした。
その代わり、ユーザーフォームのスピンボタンから アプリケーションウィンドウの方にフォーカスが行く せいかスピンボタンを押しっ放しでもスピンボタンの イベントが連続して発生しなく、アプリケーションウィ ンドウが連続して移動しませんでした。
一旦スピンボタンを押すのを止めて再度スピンボタン を押したら連続して移動してくれます。
If Application.WindowState = xlMaximized Then Exit Sub
を入れておいて、手動かコマンドボタンなどでウィンドウをNormalに するようにしておけばストレスがなくなります。
解決です。ありがとうございました。
(カエムワセト) 2021/01/16(土) 10:40
ユーザーフォームを表示するときにウィンドウを操作しておくのはダメなんでしょうか?
そうすれば、
DoEventsや
Sleepは要らないと思います。
あ、こちらは2019で試しました。
Option Explicit
Private Sub UserForm_Initialize()
Application.WindowState = xlNormal End Sub
Private Sub UserForm_Terminate()
Application.WindowState = xlMaximized End Sub
Private Sub SpinButton1_SpinDown()
With Application .Top = .Top + 20 End With End Sub
Private Sub SpinButton1_SpinUp()
With Application .Top = .Top - 20 End With End Sub (まっつわん) 2021/01/16(土) 11:04
ユーザーフォームに色んなコントロール類を配置しており、
様々な作業を行っております。
作業に応じてアプリケーションウィンドウを最小化したり
最大化したりNormalにしたりしております。
また、作業に応じてウィンドウを上下左右に移動しており
ます。
このウィンドウを上下左右に移動する際に、アプリケーション
ウィンドウが最大化していたら移動する際にエラーになります。
ユーザーフォーム起動時にウィンドウをNormalにしておいても、
他の作業でウィンドウサイズを変える場合がありますので、
ウィンドウを上下左右に移動したいときにウィンドウのサイズ
がどうなってるかは未確定です。
(カエムワセト) 2021/01/16(土) 11:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.