[[20210115164908]] 『スピンボタンでアプリケーションウィンドウを上下』(カエムワセト) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『スピンボタンでアプリケーションウィンドウを上下左右に移動』(カエムワセト)

 お世話になります。

 ユーザーフォームに配置した二つのスピンボタンでエクセルの
 ウィンドウを上下左右に移動させようとしています。

 ウィンドウが最大化していたら一旦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.