• ベストアンサー

アプリケーションの横幅の値を取得したい vba

アクセスのアプリケーションの横幅の値をvbaで取得する事は可能でしょうか? Sub サンプル() Debug.Print Application.Width End Sub はエラーになっちゃいました。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

#1です。 こっちの、なんちゃってバージョンの方が良いかも? Sub fff() Dim frmName As String Dim frm As Form frmName = "f_dmy" '適当なダミーフォーム Application.Echo False '画面の描画をしない、ちらつき防止 DoCmd.OpenForm frmName Set frm = Forms(frmName) 'フォームオブジェクトをセット DoCmd.Maximize '最大化 Debug.Print frm.InsideWidth 'フォームのサイズ取得 Twip単位 DoCmd.Restore 'なくても構いません DoCmd.Close Set frm = Nothing '後始末 Application.Echo True '後始末、無いとAccessがだんまりに End Sub 適当な空っぽのフォームを作り、名前を仮に、f_dmy にします。 このフォームを最大化してそのサイズを取得する流れです。 前回回答のAPIを使用した値は画面のピクセル数ですので RightとLeftを引き算してそれを96で割って1440を掛けます。 なお、96dpi は規定値ですが変更が可能なので このなんちゃってバージョンが簡単ですね (^^ゞ 1cm は約567Twipです。

hhfncatw
質問者

お礼

最大化した値を取得するのですね。たくさんの案、ありがとうございました。

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

作業領域のサイズはAccess2010で試したところ以下で取得できました。 標準モジュールにて Public Declare Function FindWindowEX Lib "user32.dll" _ Alias "FindWindowExA" _ (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, ByVal lpszWindow As String) As Long 'ウインドウ全体のサイズを取得 Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long '構造体 Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Sub ww() Dim myHd As Long Dim Rc As RECT Dim Ret As Long myHd = Application.hWndAccessApp myHd = FindWindowEX(myHd, 0, "MDIClient", vbNullString) Ret = GetWindowRect(myHd, Rc) 'イミディエイトウィンドウに出力 Debug.Print "TOP: " & Rc.Top & " LEFT: " & Rc.Left & " RIGHT: " & Rc.Right & " BOTTOM: " & Rc.Bottom End Sub 解説できるだけのスキルは持ち合わせていないのでご勘弁を。 参考になったところ http://www.vbstation.net/sample/0207.htm 何に使うのかな?

hhfncatw
質問者

お礼

取得できました! 何に使うか・・・横幅に対してフォームのサイズを決めたいのです!うまくできるかな。

関連するQ&A

  • アクセスVBA 一個前や一個後の値を取得するには

    フォームの中にあるサブフォームの現在選択中のレコードの値を取得は出来たのですが 一個前や一個後の値を取得するにはどうすればいいですか? Sub test() Debug.Print Forms("F_Main").Controls("F_SubMain").Form.Filter Debug.Print Forms("F_Main").Controls("F_SubMain").Form.Controls("日付") End Sub で、現在のレコードの情報は取得できましたが 上のレコード、下のレコードを取得するコードを教えてください。

  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • エクセルのフルパスをvbaで取得

    当方エクセル2003で、 エクセルのフルパスは C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE です。 それをVBAで取得するにはどうすればいいですか? Sub サンプル() Debug.Print 'オフィスがインストールされているフォルダのパスの取得 End Sub のようにして、 C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE を返したいです。 VBAコードをご教示ください。

  • BrokenReference

    Sub Sample() Debug.Print Application.BrokenReference End Sub これはアクセスでしかつかないのでしょうか? エクセルで無効な参照設定があるかどうかを 取得したい場合はどうすれば良いですか? このコードをエクセルで実行すると 実行時エラー438になります。

  • 一回のループで次のオブジェクトの値も同時に取得する

    一回のループで次のオブジェクトの値も同時に取得するにはどのようなコードを書けばよいですか? 例えば、 ブックにシートが Sheet1 Sheet2 Sheet3 あり、 Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub のように、全てのシート名を取得する場合、 Sheet1とSheet2を1回のループで同時に取得する方法はありますか? Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name   Debug.Print s+1.Name Next End Sub みたいな方法があるのか知りたいです。 よろしくお願いします。

  • アクセスでApplication.Caption

    アクセスでApplication.Captionに代わるコードはありますか? エクセルでなら Sub test01() Debug.Print Application.Caption End Sub は動きますが、アクセスだとコンパイルエラーになります。 CaptionがApplicationのメンバにないからだと思います。 いくつかのアプリケーションを跨いでVBAを動かしているのですが、 アクセスで自身のアプリケーション名、もしくはファイル名を取得するコードはありますか? ご回答よろしくお願いします。

  • Shをウォッチウインドウに登録して値を確認した時

    vbaの事でよくわからないので教えてください。 エクセルなのですが Private Sub Workbook_NewSheet(ByVal Sh As Object) Debug.Print Sh.Name End Sub で、 End Subの所にブレークポイントを設置して Shをウォッチウインドウに登録して値を確認した時、値に何も入ってないのですがなぜですか? Debug.Print Sh.Name した時にシート名は取得されるのだから値は入ってるべきだと思うのですが 画像のように「変数なし」となります。

  • Randomizeがある時とない時の違いがわからな

    vbaです Sub Sample1() Randomize Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub Sub Sample2() Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub の違いがわからないのですが、 Randomizeはどのような役割をなしてるのでしょうか? Sample1の結果は、 5 3 3 4 3 1 6 5 3 4 で、 Sample2の結果は、 4 5 4 3 4 1 4 1 6 1 5 5 でした。

  • ExcelVBA TextBoxの値を取得できない

    Excel2010です。 2つのUserFormがあり(UserForm1・UserForm2とします)、UserForm1にはTextBox1~100を配置し、UserForm2にもTextBox1~150を配置しています。 それぞれのUserFormにおいて、そのUserForm名を変数に格納しておき、TextBoxの値を取得するコードを別のプロシージャ(「TextBoxチェック」)に書き、それを呼び出してTextBoxの値を格納しようとしましたができませんでした。 該当箇所のコードは以下のとおりです。 Public UFName As String 'UserFormの名前 Sub UserForm1処理() Const Num = 100 UFName = "UserForm1" Call TextBoxチェック(Num) End Sub Sub UserForm2処理() Const Num = 150 UFName = "UserForm2" Call TextBoxチェック(Num) End Sub Sub TextBoxチェック(Num As Integer) Dim i As Integer Dim Con As Control With UserForms.Add(UFName) For i = 1 To Num Set Con = .Controls("TextBox" & i) Debug.Print Con.Name Debug.Print .Controls("TextBox" & i).Value   (その他の処理のコードは省略) Next i End With End Sub 上のコードでは1つ目のDebug.Printの結果(TextBox名)は取得できていますが、2つ目のDebug.Printの結果(TextBoxの値)は空欄になってしまいます。 つまり、 With UserForms.Add(UFName)が、 Set Con = .Controls("TextBox" & i) では反映されているのに、 .Controls("TextBox" & i).Value では反映されていないということだと思います。 また、 Debug.Print .Controls("TextBox" & i).Value を Debug.Print UserForm1.Controls("TextBox" & i).Value とすると、UserForm1の値を取得できます。 また、 With UFName_UF を With UserForm1 にすると、 Debug.Print .Controls("TextBox" & i).Value の値は取得できます。 UserForm1とUserForm2において、TextBoxの値を取得する部分は共通しているため、その部分を別プロシージャにして呼び出して処理したいのですが、うまくいきません。 TextBoxの値を取得できない理由や、対処法が分かれば教えていただきたいです。

  • vbaのFindメソッドで取得するにはどうすれば

    A1に「あ」B1に「い」と入れて、 A2に「=A1&B1」としました。 この時、A2は「あい」と表示されます。 今回やりたいことは、 Sub test() Debug.Print Cells.Find(What:=" あい").Row End Sub で、2を返したいのですが、 実行時エラー91になってしまいます。 セル内に該当の文字列がないからだと思いますが、 数式でつなげた文字列を、 vbaのFindメソッドで取得するにはどうすれば良いでしょうか?

専門家に質問してみよう