プロが教えるわが家の防犯対策術!

Excelでユーザーフォームを、常にシートの左下隅に表示したいのですが
この位置の座標を取得する方法はありますか?

A 回答 (3件)

>ご教示頂いたコードは、ウィンドウのLeftプロパティを基準に決め打ちで調整しているからです。



ActiveSheet.Application.Windows(1).Left - .Width / 3

このことについて言っていらっしゃるようですが、これが、「決め打ち」のコードなのでしょうか。
「決め打ち」の用語の使い方が変だと思います。シートからというのは、シートのウィンドウのプロパティから取ります。逆に、Sheet から、ウィンドウを経ないで左位置をどうやって取るのですか。シート・オブジェクトそのものに、そんなプロパティがあったのでしょうか。

「決め打ち」というのは、プログラマ側本位の用語で、相手の環境が分からない場合に、その選択権を、プログラマに、予想的な数値などを予めまかせてしまうことです。主に、決まった選択肢がいくつかある場合に行うもので、それを、質問者さんから、こうした可変的な位置に対応しているのに、こちらに「決め打ち」と言われるようなものではないはずです。

そもそも、UserFormは、ある程度の位置に出てくるものを、細かい位置調整は、ユーザーさんが、マウスで決めているはずです。そうでなかったら、埋め込み型のActiveX コントロールなどを使えばよいと思います。

>例えば、シートの見出しを非表示にした場合、左下隅に表示されません。

もし、これが事実だとしたら、一体、どこにUserFormは行っているのか分かりませんが、こちらはそのようなことはありませんから、元のバージョンなどが違って誤動作するのかもしれません。それは、もう対応はしきれません。

もともと、ご質問には、そのようなバージョンや使用している情報やExcelの使い方などがまったくありませんが、Excel 97~2013までは、おそらくは同じ動作だとは思ってはいます。平均的な回答をしていますが、その確認をすべて取っているわけではありません。こちらは、現在、2010で対応しています。

>もしシート領域の左下隅の座標を取得できれば、

シート領域の左下隅というのは、Sheet の高さ(Height)分と左(Left)位置で決まるものですから、アプリケーションに対して、その位置はとれているはずです。もし、まったく左下隅というなら、

ActiveSheet.Application.Windows(1).Height
ActiveSheet.Application.Windows(1).Left

にすればよいです。ただし、UserFormの大きさは考慮していません。UserFormの大きさに、大雑把に、位置調整のために戻してきているのが、気に入らないのでしょうか。それとも、使用中に、シートの動きに合わせるということなのでしょうか?

シートをその都度大きさを換えたり、シート見出しのあるなしの変化などに、調整させるということは現実の使用では、最初にその旨提示していただければ、ある程度は考えました。

プログラミング用語もご存知で、ご自身でVBAの開発もされているようですから、私や、掲示板などに頼らずに、ご自身で研究開発されるのが一番です。私の理解度は、この程度しかありませんし、ご質問者さんが、何をおっしゃっているのか、さっぱり理解できなくなっています。こちらのコードそのものにも、シートからなのに、プロパティがない所から、取得しろと言われると、これ以上は手がつきません。

実際に、#1の回答ぐらいは、たぶんVBAの書籍でも載っているはずで、ほとんどの方は、そのような平均的な回答で満足していただいています。できる見通しが立てば、かなり複雑なものでも開発して差し上げられますが、このように質問で、まったく見通しがつきませんので、これで、私からの対応は終わりにさせていただきます。ご要望には至らず、申し訳ありません。
    • good
    • 0

こんにちは。



#1の回答者です。
>ご教示頂いた方法で、全てのパターンに合わせて調整することもできますが

マクロは、試してみていただけたのでしょうか。どのような状態であれ、Excelのアプリケーション枠の左隅下に行くはずです。ふつう方は、それで問題ないはずです。

>'←位置を(±数字 で)調整してください。
とマクロの中で書いたのは、微調整の意味であって、手作業でその都度調整するという意味ではありません。それは、試していただいた方なら、お分かりになっているはずです。

>表示位置を常にシートの左下隅に表示されるためです。

シートを見えないほど小さい状態から、最大化まであります。

シートの左下隅というのは、何かの間違いではないでしょうか。シートの大きさは、アプリケーション枠一杯(最大化)にしていない状態では、シートの大きさは可変ですから、いろんな状態のシートの左隅下に移動します。つまり、UserFormは、アプリケーションの真ん中もあるということです。常識的には、アプリケーションの左隅下で十分だと思います。

一応直しましたが、「つらいち」にはなりません。まあまあ、シートの左隅下には収まります。これも、やはり微調整は必要ですが、この先は、ご自身で考えてみてください。
よろしくおねがいします。

'// 基本的には標準モジュールですが、シートモジュールでも可
Sub Test2()
'シートの左下隅に
   With UserForm1
    .StartUpPosition = 0
    .Top = ActiveSheet.Application.Windows(1).Height - .Height / 2
    .Left = ActiveSheet.Application.Windows(1).Left - .Width / 3
    .Show 0
  End With
End Sub
'//
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>表示位置を常にシートの左下隅に表示されるためです。
 誤字がありました。正しくは「表示位置を常にシートの左下隅に表示させるためです」
 失礼しました。



>どのような状態であれ、Excelのアプリケーション枠の左隅下に行くはずです。ふつう方は、それで問題ないはずです。
 例えば、シートの見出しを非表示にした場合、左下隅に表示されません。
 ご教示頂いたコードは、ウィンドウのLeftプロパティを基準に決め打ちで調整しているからです。
 見出しの有無はDisplayHeadingsプロパティで確認できますが、やはり都度調整していくしかありません。

 もしシート領域の左下隅の座標を取得できれば、見出しの有無やステータスバーの有無を
 意識する必要がなくなるので、その方法を求めています。

お礼日時:2014/04/10 14:15

こんにちは。


以下のようなことでしょうか。UserFormの座標を取る方法は、Win32APIだったと思いますが、UserFormの表示とは、直接関係がないような気がします。

'//
Sub Test1()
'左下隅に
   With UserForm1
    .StartUpPosition = 0
    .Top = Windows.Application.Height - .Height
    .Left = Windows.Application.Left '←位置を(±数字 で)調整してください。
    .Show 0
  End With
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

座標を取る理由は、全画面表示に切り替えるなど環境が変化しても
表示位置を常にシートの左下隅に表示されるためです。

ご教示頂いた方法で、全てのパターンに合わせて調整することもできますが
なるべく環境に依存しない作りにしたいのです。

お礼日時:2014/04/09 11:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!