• ベストアンサー

エクセルVBAで画面の大きさを取得する方法!

現在、パソコンで2画面表示で仕事をしています。フォームの表示位置を記憶させて前回、表示されていた場所と同じ位置に表示させるようにしています。通常は問題ないのですが、別のパソコンでエクセルのブックを使う場合に画面の枠外にフォームが表示されます。範囲を超える場合に表示位置を修正させたいのですが、画面の大きさを取得する方法が解りません。どなたか?詳しい方がいらっしゃいましたら教えて頂けないでしょうか?2画面のプライマリー、セカンダリなどの情報と、左右などの情報も取得できるのでしょうか?(もしかして?APIが関係しますか?) あわせて、強制的に画面の範囲内で一番近い位置に表示させるような命令があるのでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 こういうことですか? '標準モジュール Declare Function SystemParametersInfo Lib "user32" _   Alias "SystemParametersInfoA" ( _   ByVal uAction As Long, _   ByVal uParam As Long, _   ByRef lpvParam As Any, _   ByVal fuWinIni As Long) As Long 'RECT構造体 Public Type RECT   Left  As Long   Top  As Long   Right As Long   Bottom As Long End Type 'モニターの有効なスクリーンサイズを取得 Public Const SPI_GETWORKAREA = 48 Sub Sample()   Dim typRect As RECT   Call SystemParametersInfo(SPI_GETWORKAREA, 0, typRect, 0)   MsgBox "Screen Width :=" & typRect.Right & vbCrLf & _       "Screen Height:=" & typRect.Bottom End Sub

vba_minarai
質問者

補足

いつも、いつも本当に有難う御座います。 ご指導頂いた内容を完全に理解することは、もう少し時間がかかりそうですが、今作成中のマクロには即使えていつもながら感服いたします。私は、まだまだ、自動記録の拡張の域を脱していませんので、単にコピペをしたら動くようなマクロを組むことは出来ません。本当に、感激の限りです。 特に、私の質問の不備を汲んで、有効範囲の取得を教えて頂いたことなど、感謝の限りです。間違いなく、次の質問で、スタートバー?の幅を取得する方法を聞くことになっていたでしょう?本当に有難う御座います。今回の2つのご指導を踏まえがんばります。 今後ともよろしくお願いいたします。 有難う御座いました。

その他の回答 (2)

  • e10go
  • ベストアンサー率38% (47/122)
回答No.3

No.1のe10goです。 ディスプレイのウインドウサイズ取得方法がやっと解かったので、答えようと思ったら、もう他の人が答えてる^^;。 他にも方法があると言うことで、とりあえず解答します(笑)。 '-------標準モジュールのコード-------始まり Option Explicit Public Declare Function GetDesktopWindow Lib "USER32" () As Long Public Declare Function GetWindowRect Lib "USER32" (ByVal hWnd As Long, lpRect As RECT) As Long Public Type RECT   Left As Long   Top As Long   Right As Long   Bottom As Long End Type Private Sub sub_WindouSize()   Dim Ret As Long   Dim nRect As RECT   Ret = GetDesktopWindow   Call GetWindowRect(Ret, nRect)   MsgBox "左上のx座標は" & nRect.Left & vbCrLf & _     "左上のy座標は" & nRect.Top & vbCrLf & _     "右下のx座標は" & nRect.Right & vbCrLf & _     "右下のy座標は" & nRect.Bottom End Sub '-------標準モジュールのコード-------終わり

vba_minarai
質問者

補足

本当に、本当に有難う御座います。 単純にコピペするだけで、画面の表示の大きさが表示されました。 このマクロの中にも一杯まだ知らないことがありますので、自己研鑽に励みたいと思います。 特に、KenKen_SPさんのは、画面の有効範囲なのに対し、e10goさんのは、画面の大きさが表示されます。初心者にとってこのように微妙な違いを克服することは凄く困難なので、たとえ、時間的に前後があったとしても、ご指導願えたことは凄く、凄く助かります。よく、2つのご指導を比較して自分のものにして行きたいと思います。有難う御座いました。今後ともよろしくお願いいたします。

  • e10go
  • ベストアンサー率38% (47/122)
回答No.1

フォームとは、VBAにある「UserForm?」のことですよね。 それであれば、フォームのプロパティにある「SpecialUpPosition」で設定できると思います。 選べる値に、下の4つがありますが、 「0 - 手動」、「1 - オーナーフォームの中央」、「2 - 画面の中央」、「3 - Windows の既定値」 「1 - オーナーフォームの中央」は、Excelウインドウの中央、「2 - 画面の中央」は、文字通り画面の中央です。 「0 - 手動」は、プロパティ「Top」、「Left」に入れた数字の位置です。 「Top」に「100」、「Left」に「200」と入れると、画面の上から「100」、左(Top)から「200」の位置にフォームの左上が表示されます。 (注)ここに数字を入れると、微調整のため、自動的に数字が変ることがあります。 ここの数字は、恐らく画面のピクセル単位と思います。 「3 - Windows の既定値」は、詳しくは判りません。

vba_minarai
質問者

補足

早速のご指導有難う御座います。 ご指導頂いたように、TopとLeftの値を保存読み出しして前回と同じ位置にフォームを再表示させています。再表示させるときに現在、ブックが開こうとしている環境で画面の範囲からはみ出す位置なのかどうかを判断し、はみ出すならば位置の補正をかけたいと考えています。その補正のためには、画面のサイズを取得する必要があるのでは?と思い質問致しました。 説明が悪くてすみません。 重ね重ねご指導願えないでしょうか? よろしくお願い致します。

関連するQ&A

  • 画面プロパティの表示位置変更について

    マルチモニターを使用しています。 Excelやインターネット画面等は、プライマリーモニター、セカンダリーモニターに関らず移動した位置に変更できますが、画面プロパティ等コンパネの各項目やエラー表示は、プライマリーモニターに移動しても再表示するとセカンダリーモニターに戻ってしまいます。 設定方法があればどなたか教えて下さい。 よろしくお願い致します。

  • CreateProcess API でセカンダリモニタに初期表示するには?

    CreateProcess API でプログラムを実行する時に、引数STARTUPINFO構造体の中で、初期表示位置としてセカンダリモニタ上の座標を指定しても、プライマリモニタ上に表示されてしまいます。 どのようにすればセカンダリモニタに初期表示することができるのでしょうか?

  • EXCEL Form モードレスで開いて

    BookがそれぞれAとBとあります。Book BにBook AとBのデータを絞り込むデータ入力フォームを開くようにしています。 Bを起動するとAのsheetを開き、絞り込みフォームが開きます。 画面上は最背面にB、次にA、最前面にフォームとなります。この状態でAを絞り込む場合には、このままでいいのですが、Bを絞り込んだり、結果を表示すると、「B-フォーム-A」の順序になり、また絞り込むとき、Book Aを選択しなくてはなりません。 フォームを最前面に常に表示するにはどうすれば良いでしょうか? 他の質問で、WindowsのAPIを屈指してでないとだめですか? APIも試してみましたが、うまく行きません。 参考になる回答でもありましたら、お教えください。

  • VB6 自分自身のフォームが移動したことを知る方法

    お世話になります。 VB6でメインフォーム(*.exeで起動されるフォーム)がデスクトップ内で移動したことをそのフォーム自身が知るためにはどのようにすればよいでしょうか。 目的は、移動後のフォームの位置情報の取得です。 フォームのサイズを変更した時は"Resize"イベントが発行されるので、それをきっかけにLeft,Top情報を取得できます。 同じようにフォームが移動した時にLeft,Top情報を取得する方法を知りたいです。 API等の利用で可能になるのであればそれでもかまいません。 よろしくお願いします。

  • エクセルVBAのユーザーフォーム

    こんばんは、エクセルVBAでユーザーフォームを作成しました。 そこに入力したものがブックに反映するわけですが、フォームに0(ゼロ)を入力した場合、ブック上のセルを選択すると0と入っているのですが、表示されません。なぜでしょう???? これができないとせっかく時間をかけて作ったのに、使えません。どなたかご存知の方よろしくお願いします!!!!

  • TextBoxのhWndプロパティVBAでも使えませんか?

    環境 OS:Win2000ProSP4 Excel2000および2002 Excel2000で、テキストボックスのあるフォームを作成しました。 選択したファイルを読み込んでテキストボックスに表示する機能があり それに加えて、テキストボックス中をマウスでクリックした時、その場 所のカーソルの位置(そこの行数と行内で何カラム目か、の2つ)を取得し て同じフォーム上に表示させる機能をつけました(矢印ボタンでカーソ ルが移動しても、位置情報を更新するようにしています)。ただし、 ネットで調べたカーソル位置取得方法はVBAでなくてVBのものなので、 API(SendMessage)に渡すテキストボックスのhWndプロパティはなく、 困ってしまいました。窮余の一策として、普通のテキストボックスの 代わりに、リッチテキストコントロールを使用して、その中にある hWndプロパティを渡して、上の機能を実現していました。ところが、 Excelを2002にアップグレードしたら、リッチテキストコントロール が使えないことが判明しました(MSのサイトによると、セキュリティの ため、とのこと)。 Excel2002で、2000時代につくったフォームを開くと、リッチテキスト コントロールがすっぽり抜け落ちている状態です。こうなれば、普通の テキストボックスのhWndプロパティをAPIで取得できないか、というこ とを調べているところで困っています。あるいは、2002でも使える同じ ようなコントロールがあれば助かります。 長くなりましたが、ご存知の方、アドバイスをお願いします。

  • PC情報の取得について

    VBのプログラムからパソコンのメーカー名、型式、製造番号等の情報を取得する方法ってあるのでしょうか?いろいろなAPI等も調べてみましたが見つける事が出来ませんでした、、何か情報をご存知でしたら是非ご教授下さい。 資産管理等のソフトを実行するとこのような情報を画面表示してくれるので何か方法があると思うのですが行き詰ってしまいました、、どうかよろしくお願いします。 ※VBは6を使用しています。

  • ACCESS VBA ウィンドウを閉じる

    ACCESS VBA の初心者です。 前に進まず困っておりまして申し訳ありませんが教えてください。 フォーム1にボタンをつけそのボタンを押すとフォーム2に画面遷移するように、作っています。 フォーム2に画面遷移した場合、フォーム1は不要になるので、画面遷移と同時にフォーム1を閉じたいのですが、うまく行きません。 docmd.close と言う命令を使うとフォーム1のボタンを押すと画面遷移先のフォーム2の方が一瞬表示されてすぐに閉じてしまいます。 どうしたら、フォーム2が表示されてフォーム1が同時に閉じる事ができるでしょうか?

  • VBAでステータスバーの情報取得(APIで)

    VBA(Excel2003の)でステータスバーに表示されている情報(文字)を APIで取得したいのですが、SendMessageでSB_GETTEXTを使って取得する ことまではわかりましたが・・・ どうにわからず、最終的に↓のアドレスのソースを使ってみましたが、 空白しか取得できませんでした。 (パートの数はあっていそうなのですが、文字列がとれていません。) http://homepage2.nifty.com/nonnon/SoftSample/SampleEnumWindows.html 取得したい対象は、IEとかワードパッドとか秀丸とか、一般的な アプリケーション全般のステータスバーの情報ですのでAPIを使いたいと 思っています。 ご教授いただければ幸いです。

  • EXCEL VBA RANGEオブジェクトの位置情報取得について。

    EXCEL VBA RANGEオブジェクトの位置情報取得について。 下記INPUTBOXでユーザーに任意のセル範囲を選択させます。   Set MyRange = Application.InputBox(prompt:=MyMsg, Type:=8) このMyRangeのセル範囲の位置と行数、列数を取得したいのです。 行数、列数は下記マクロでいいかと思います。   n = MyRange.Rows.Count   m = MyRange.Columns.Count あとは、このMyRangeがどこから始まっているかを取得したいのです。 たとえばMyRangeがB3:D6だとすると、n=4、m=3、左上の位置は3行目、2列目となります。 この「3行目、2列目」という情報を取得したいのです。 ご存知の方、よろしくお願いします。

専門家に質問してみよう