• ベストアンサー

Access VBA でForm位置を参照するプロパティ?

Access 97 VBAでプログラムを作ってます。 Accessウインドウ内のForm又はForm内のControlをクリックした時に、Accessウインドウ左上隅からFormの左上角までの位置(Left、Top)を参照するためのプロパティを教えて下さい。 CurrentSectionLeftとCurrentSectionTopは、Form内での位置参照です。Formそのものの位置を参照する方法は無いのでしょうか?

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

プロパティは、ちょっとすぐには思いつきません。(無いかもしれません。) 私がやったときは、Windows APIを使いました。 'フォームの宣言部 Option Explicit Type RECT     Left As Long     Top As Long     Right As Long     Bottom As Long End Type Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long 'コマンド1押下時 Private Sub コマンド1_Click()   Dim RectFrm As RECT   Dim RectAcc As RECT   Call GetWindowRect(Me.hwnd, RectFrm)   Call GetWindowRect(Application.hWndAccessApp, RectAcc) End Sub こんな感じで分かりますか? RectFrm構造体には、フォームの位置情報が入っています。 RectAcc構造体にはAccessのウインドウの位置情報が入っていると思います。 ってことで、Accessのウインドウ位置からフォームのウインドウ位置を引き算すれば、相対位置が求まるような… (実はこの辺、試したのはかなり昔の話です。VBAコード自体には問題は無いはずですが、「引き算すれば」とかのお部分に関しては、それほど自信は無いです。 ってことで、申し訳ないですが、詳細な部分についてはご自身で確認してくださいませ。) ちなみに、単位はTwipsではなくて、ピクセルです。(Windows APIを使っているので。)

kurichanchi
質問者

補足

ARCさん へ  回答文に書いて戴いた[Windows API]が何の事だか全く理解出来ないまま、取り敢えず、回答ステートメントをそっくりそのまま実行して見ました。見事に位置情報が参照でき感激しました。大変感謝しております。  教えてGooに質問した位置情報参照については解決致しました。でも、ARCさんの回答にある[Declare Function...LIb...]なるモノを知りませんでした。ハンドブック(ナツメ社「Access97VBA」)には、「ダイナミックリンクライブラリー(DLL)の外部プロシージャへの....」と説明がありました。位置情報を参照出来る以外にも色々便利な機能が有るように思いますので、是非詳しく知りたいと思います。 そこで、素人が理解出来る範囲で「外部プロシージャ」なるモノを使用する方法を知る(勉強する)手がかりを教えて下さい。 厚かましいお願いですか、ご教授願えれば幸いです。 

その他の回答 (1)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

APIってのは、あるソフトを外部から制御できるように、公開されている関数のことです。 Windows APIはWindowsの様々な機能を制御するためのものです。 今回使用した「GetWindowRect」という関数もその一つで、その名の通り、ウインドウの矩形範囲(RECT)を取得するための関数です。 で、これらのAPIは通常、DLLやOCXといった形で提供されます。 Declare ステートメントは、「このDLLに収録されているこの関数をVBから使用する」っていうことを宣言するための命令です。 今回の場合、Windowsが提供する「User32.DLL」に含まれる「GetWindowRect」という関数を使用することを宣言しています。 hWndっていう引数を宣言して、フォームのhWndプロパティを渡していますが、これは、「ウインドウハンドル」といって、個々のウインドウに設定されたIDのことです。 Windowsはこの「hWnd」の値を使って、ウインドウの管理を行っています。 WindowsAPIを使用法を知るには、まずは本屋さんでWindowsAPIをVBから使うことについての本をご購入ください。(各社から多数出版されています。) それを見ながら、実際に使ってみると、ある程度の規則性があることが分かると思います。(C言語の若干の知識があると尚いいのですが…) 規則性がつかめたら、そのうちにまったく知らない関数であっても、関数名と引数を見るだけで使い方が見えてきたりします。 あと、VBから使用可能なWindowsAPIについては Win32API.Txtというファイルにまとめられています。 Visual Basicなどの開発言語や、Officeのディベロッパ エディションなどに付属しています。

kurichanchi
質問者

お礼

ARCさん へ 早々に回答を戴き感謝致します。大変分かり易い説明です。一読しただけで、API・Declare・ウインドウハンドルの概略の概念が理解出来ました。 早々に「WindowsAPI」をキーワードにして書店で解説書を探してみます。 「ウインドウ内の位置情報を知りたい」と云う単一的な疑問解決だけで無く、新たな道具となるAPIと云うモノの存在を教えて戴いた事、深謝致します。 趣味の範囲(一部は生活実用)でVBプログラミングを楽しんでおりますが、これからはAPIでその範囲が広がりそうです。 何時かまた、質問投稿をした時には宜しくお願い致します。有り難う御座いました。

関連するQ&A

  • Accessでバーコードコントロールの移動

    Access2000のレポートにバーコードコントロールを貼り付け、 VBAのレポートOpenイベントでLeftやTopプロパティを設定して バーコードコントロールの位置を調整しようとしましたが、 なぜかコントロールの大きさが変わってしまいます。 widthやHeightで元の大きさに戻そうとしても、無視されてしまいます。 VBAでバーコードコントロールの位置の調整はできないのでしょうか? よろしくお願いいたします。

  • コントロール名とそのプロパティー名を取得したい

    Form の Top/Left の位置を INI ファイルから取得しようと思います。 INIファイルの構造は   [コントロール名]   プロパティー=Value つまり   [Form]   Top=300 という感じです。 WritePrivateProfileString に "Form","Top" というパラメータを送りたいのですが、 この場合のオブジェクト名である"Form"、プロパティ名である"TOP"はどこで取得できるのでしょうか?

  • access2007 プロパティシート 表示されない

    動作環境: OS:WINXP sp2,sp3 OFFICE VER:ACCESS 2007 ACCESS2007を使用し、CSVデータ取り込み、CSVデータ出力の プログラムをVBAで記述しました。 作成したものは テーブル1、フォーム1、モジュール1のみです。 プログラムは完成し、コマンドボタンや画面サイズの変更を行うと デザインビューでフォームを開き、左上の■をクリックしても プロパティシートが表示されません。(プロパティシートボタン、フォーム右クリックのプロパティも反応なし。) 作成したプログラムに問題があるかと思い、サンプルでaccessのデータを作成しましたが、こちらも反応がありません。 再インストールでも改善せず。 ↓ レジストリ:ACCESSと記述されているものを削除し 再インストールすれば、再びプロパティ表示されます。 ですが、再度、別ファイルなどVBAの作業を行いしばらく行うと また表示されなくなります。 レジストリを操作するようなプログラムではありません。 microsoftのバグですか? ご教授お願い申し上げます。

  • ユーザーコントロールの座標

    コントロール名がHogeのユーザーコントロールを作成します。 Form1にHogeを貼り付けHoge1とする。 どのようなユーザーコントロールに対してもForm1.Hoge1.Leftのような書き方ができますが、 Dim UC As Hoge UC.Leftのような書き方ができません。 後者のような参照ができないプロパティは、自分で定義したのではない、元からあるLeftとTop、Indexなどです。 このようなプロパティは、コントロールの参照の変数から、アクセスできないのでしょうか? オブジェクトはこのプロパティおよびメソッドをサポートしていませんと言われます。 オブジェクト変数が宣言されていないわけではありません。

  • ユーザーフォームのプロパティをVBAで設定したい

    いつも楽しく勉強させていただいております。 Excelのユーザーフォームを使い始めたところです。 コントロールのプロパティの設定を細かいVBAで行いたいのですが、方法がわかりません。 たとえばラベルの位置をそろえたいので 黒いラベル2.Left = 黒いラベル1.Left 黒いラベル3.Left = 黒いラベル1.Left といったコードを書いてUserForm_Initialize()で実行してみたのですが、フォームを閉じると元の値に戻っています。 どうすれば黒いラベル2と黒いラベル3の左端を黒いラベル1と同じにできますか。

  • VBA 写真の挿入 回転

    お世話になります。 工事写真を("工事写真台紙")シートに挿入するVBAを組みました。 アクティブセルの Left Top と写真の Left Top を合わせて 所定の位置に貼り付ける事が出来ています。 ところが1つ問題が出てきました。 デジカメを横(右90度)にして撮影した写真(縦長の写真)を貼り付ける必要が出てきたので VBAで貼り付ける際、Rotation = 90# で回転させましたが アクティブセルの Left Top と写真の Left Top を合わせても セルと写真の左上は合いません。 写真を回転させても、位置情報としての写真の Left Top は変らないみたいです。 見た目の左上を合わす事が出来ません。 座標を取得すれば・・?sin.cos.tan・・? セルの width と 写真の width・・? Increment で移動して・・? 煮詰まってどうにもなりません。 どなたかご教授下さい。

  • Form1にForm2を作る

    c++BuilderXE2です。 Vclフォームアプリケーションで作ったForm1に、更にForm2を作ることはできるのでしょうか。 プロジェクトマネージャーにFormコントロールが無いのでできないのでしょうか。 Form2を作る目的は、Form2とForm1はそれぞれ別プロセスで動作させ、かつForm2は子ウインドウのように動作させる、すなわち、Form1の位置を変えると、Form2も移動し、かつForm2はForm1より常に前面に置くためですが、このようなことができるかどうかを確かめたいのです。 他にもっとスマートな方法があればご教示願えれば幸いです。 まったく別のexeのウインドウ(Form2に対応)をForm1からspawn関数により立ち上げることは、テストしているのですが、両者の位置関係が連動しない問題があるのです。SetWindowRectは目的が違うようです。

  • Access起動中にExcelで参照

    AccessのVBAで、インターネットを検索してデータを収集中に、Excelでそのデータベースを参照するようなことってできるのですか? 別の言い方をすると、Accessであるデータベースのデータを絶えず更新しながら、別のソフトでそのデータベースのデータを利用することってできるのでしょうか? よろしくお願いします。

  • VBA 参照設定について

    Windows7 Access 2013です。 以下サイトを参考にして、VBAに貼り付けたところ ”ユーザー定義型は定義されていません” というコンパイルエラーが出ました。 http://gdipluscode.sakura.ne.jp/gdip/resize_save_jpeg.html 引っかかっている部分は Optional ByVal InterpolationMode As InterpolationMode の部分のようです。 参照設定で、不足があるのではないかと思うのですが、 ネット検索をかけても、参照設定に関するヒントが、見つかりませんでした。 GDI+を使ったほかのプログラムでは、参照設定に引っかからなかったので 今回どうすればよいか、わかりにくく困っております。 解決方法について、ご教授願います。

  • accessからのデータ参照について

    ご存知の方がいたら教えて下さい。 【動作環境】 OS:WINDOWS SERVER 2003,WINDOWS XP ACCESS:ACCESS2000 ORACLE:9i(9.2.0.1.0) 1つのACCESSファイルにシステム部分とデータ部分が存在しているACCESSのシステムを「システム部分はACCESS」「データ部分はORACLE」という形にしました。 ACCESSで管理していたデータをORACLEへ移行して、データ自体は簡単に移行が行え、ODBCでリンクをしてデータを参照できる状態にしました。 ここまでは、良かったのですが移行を行ったACCESSのテーブルに1レコード240ぐらい項目のあるテーブルが存在してリンクテーブルを開くことができません。 クエリーでも項目を選択した場合は参照できますが、全てを表示させようとするとダメです。 パススルークエリ等も試してみたのですが、いまいちうまくいきません。 どうにかして、1レコード240ほどのORACLEデータをACCESS側で参照することができないでしょうか? 説明が分かりずらく申し訳ありません。ご質問いただければ補足を致しますので、よろしくお願いします。

専門家に質問してみよう