Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10043 / 13646 ツリー ←次へ | 前へ→

【24003】画面の解像度、DPI設定の取得 やま 05/4/9(土) 19:22 質問[未読]
【24004】Re:画面の解像度、DPI設定の取得 ちゃっぴ 05/4/9(土) 19:37 回答[未読]
【24009】Re:画面の解像度、DPI設定の取得 やま 05/4/9(土) 22:10 質問[未読]
【24011】Re:画面の解像度、DPI設定の取得 Kein 05/4/9(土) 22:52 回答[未読]
【24013】Re:画面の解像度、DPI設定の取得 Kein 05/4/9(土) 23:05 回答[未読]
【24019】Re:画面の解像度、DPI設定の取得 やま 05/4/10(日) 0:15 お礼[未読]
【24016】Re:画面の解像度、DPI設定の取得 ちゃっぴ 05/4/9(土) 23:12 回答[未読]
【24022】Re:画面の解像度、DPI設定の取得 やま 05/4/10(日) 0:22 お礼[未読]
【24017】Re:画面の解像度、DPI設定の取得 bykin 05/4/9(土) 23:26 回答[未読]
【24021】Re:画面の解像度、DPI設定の取得 やま 05/4/10(日) 0:20 発言[未読]
【24036】Re:画面の解像度、DPI設定の取得 bykin 05/4/10(日) 16:08 発言[未読]
【24024】DPI設定の取得 やま 05/4/10(日) 1:04 質問[未読]
【24025】Re:DPI設定の取得 ちゃっぴ 05/4/10(日) 1:24 回答[未読]
【24026】Re:DPI設定の取得 やま 05/4/10(日) 1:40 発言[未読]
【24028】Re:DPI設定の取得 やま 05/4/10(日) 2:06 発言[未読]
【24029】Re:DPI設定の取得 Kein 05/4/10(日) 10:40 発言[未読]
【24039】Re:DPI設定の取得 やま 05/4/10(日) 19:01 お礼[未読]
【24054】OSに依存 やま 05/4/11(月) 9:35 質問[未読]
【24057】Re:OSに依存 Kein 05/4/11(月) 11:38 発言[未読]
【24063】Re:OSに依存 やま 05/4/11(月) 15:10 発言[未読]

【24003】画面の解像度、DPI設定の取得
質問  やま  - 05/4/9(土) 19:22 -

引用なし
パスワード
   VBAからウィンドウズの画面プロパティにあるの画面の解像度および、詳細設定にあるDPI設定(文字の大きさ)を取得する方法はありますでしょうか?
現在、画面の解像度が1024×768と1280×1024の2種類、DPI設定が通常のサイズ(96DPI)と大きなサイズ(120DPI)の2種類の4種類の組み合わせのPCで運用しており、画面表示を設定にあわせてズームで調節したいと思っています。
よろしくお願いします。

【24004】Re:画面の解像度、DPI設定の取得
回答  ちゃっぴ  - 05/4/9(土) 19:37 -

引用なし
パスワード
   > VBAからウィンドウズの画面プロパティにあるの画面の解像度および、
> 詳細設定にあるDPI設定(文字の大きさ)を取得する方法はありますでしょうか?

以前、同様の質問(ここではないですが)があり、WMI使ってやった記憶があります。

Win32_DisplayConfiguration
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_displayconfiguration.asp

Sample Sourceについては、下記からDLしたものを使ってお調べください。

ScriptOmatic 2.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=09dfc342-648b-4119-b7eb-783b0f7d1178&DisplayLang=en

【24009】Re:画面の解像度、DPI設定の取得
質問  やま  - 05/4/9(土) 22:10 -

引用なし
パスワード
   ちゃっぴ さん こんばんは

早速の回答をありがとうございました。
当方、英語もほとんどできず、またWMIも全く使ったことがありません。
ご指摘のhpも見たのですが、残念ながらよくわかりませんでした。
申し訳ありませんが、サンプルコードをアップしていただけませんでしょうか?

【24011】Re:画面の解像度、DPI設定の取得
回答  Kein  - 05/4/9(土) 22:52 -

引用なし
パスワード
   解像度については

Declare Function GetSystemMetrics Lib "user32.dll" _
(ByVal nIndex As Long) As Long

Const SM_CXFULLSCREEN = 16
Const SM_CYFULLSCREEN = 17

Sub Command()
  Dim lngMetricsX As Long, lngMetricsY As Long
  lngMetricsX = GetSystemMetrics(SM_CXFULLSCREEN)
  lngMetricsY = GetSystemMetrics(SM_CYFULLSCREEN)
   
  MsgBox lngMetricsX & " * " & lngMetricsY
End Sub

で、どうかな ?

【24013】Re:画面の解像度、DPI設定の取得
回答  Kein  - 05/4/9(土) 23:05 -

引用なし
パスワード
   ごめん、こっちの方が正しい値になります。

Declare Function GetSystemMetrics Lib "user32.dll" _
(ByVal nIndex As Long) As Long

Const SM_CXSCREEN = 0
Const SM_CYSCREEN = 1

Sub MyWindow_Num()
  Dim lngMetricsValueCx As Long, lngMetricsValueCy As Long
 
  lngMetricsValueCx = GetSystemMetrics(SM_CXSCREEN)
  lngMetricsValueCy = GetSystemMetrics(SM_CYSCREEN)
  MsgBox lngMetricsValueCx & " * " & lngMetricsValueCy
End Sub

【24016】Re:画面の解像度、DPI設定の取得
回答  ちゃっぴ  - 05/4/9(土) 23:12 -

引用なし
パスワード
   >申し訳ありませんが、サンプルコードをアップしていただけませんでしょうか?

Sample Codeを示すのは簡単ですが・・・それでは後々の役に立たないと思いますので・・・

Linkを示しましたが、ScriptOmaticをDownLoadして、
調べることをお勧めします。(ほかにもいろいろ役に立つはずです。)

DownLoadしたら、解凍(exeを実行するだけ)し、解凍された
[ScriptomaticV2.hta]を実行してみてください。

しばらくたつと、WMI ClassというComboBoxが表示されますので、
そこで「Win32_DisplayConfiguration」を選択。

それでSample Sourceが手に入ります。
VBSですが、ちょこっと改造してやるだけでVBAでも使用できます。

わからない点があれば、わからない点を明確にした上で
再度ご質問ください。

【24017】Re:画面の解像度、DPI設定の取得
回答  bykin  - 05/4/9(土) 23:26 -

引用なし
パスワード
   こんばんわ。

いろいろ方法出てるみたいやね。
で、わても一案。レジストリからデータ取得する方法を考えてみました。

Sub test()
  Dim WSH As Object
  Dim DPI As String
  Dim RSL As String
  
  Set WSH = CreateObject("Wscript.Shell")
  DPI = WSH.RegRead("HKEY_CURRENT_CONFIG\Display\Settings\DPILogicalX")
  RSL = WSH.RegRead("HKEY_CURRENT_CONFIG\Display\Settings\Resolution")
  RSL = Replace(RSL, ",", " * ")
  MsgBox "DPISetting : " & DPI & vbCrLf & _
      "Resolution : " & RSL
  Set WSH = Nothing
End Sub

詳しくはWSH(WindowsScriptingHost)をネット検索してみてください。
試してみてな。
ほな。

【24019】Re:画面の解像度、DPI設定の取得
お礼  やま  - 05/4/10(日) 0:15 -

引用なし
パスワード
   Kein さん ありがとうございました。

ちょうど入れ違いで、別サイトで下記コードをみつけて
とりあえず解像度は解決しました。

 Type RECT
     x1 As Long
     y1 As Long
     x2 As Long
     y2 As Long
    End Type
    Declare Function GetDesktopWindow Lib "User32" () As Long
    Declare Function GetWindowRect Lib "User32" _
        (ByVal hWnd As Long, rectangle As RECT) As Long


   Function GetScreenResolution() As String
     Dim R As RECT
     Dim hWnd As Long
     Dim RetVal As Long
     hWnd = GetDesktopWindow()
     RetVal = GetWindowRect(hWnd, R)
     GetScreenResolution = (R.x2 - R.x1) & "x" & (R.y2 - R.y1)
    End Function

GetSystemMetrics Lib と GetDesktopWindow Lib、GetWindowRect Lib と
いろいろとあるのですね〜 ちゃっぴさんに教えて頂いた方法でいろいろ
と調べてみようと思います。 ありがとうございました。

【24021】Re:画面の解像度、DPI設定の取得
発言  やま  - 05/4/10(日) 0:20 -

引用なし
パスワード
   bykin さんこんばんわ。

すいません、エラーが出て実行できませんでした。

エラーは
レジストリキー"HKEY_CURRENT_CONFIG\Display\Settings\DPILogicalX"の
ルートが無効です。
とでます。

この方法で取得できれば解像度、DPIの両方取得できて良さそうなのですが・・

【24022】Re:画面の解像度、DPI設定の取得
お礼  やま  - 05/4/10(日) 0:22 -

引用なし
パスワード
   ちゃっぴ さん こんばんは

上にも書きましたが、とりあえず別サイトでサンプルコード見つけました。
でも、おっしゃるとおり内容はさっぱり??なのでご指摘のhpから
Downloadしていろいろと調べてみようと思います。
また、わからないことが出ましたら質問させて頂きますのでよろしく
おねがいします。

【24024】DPI設定の取得
質問  やま  - 05/4/10(日) 1:04 -

引用なし
パスワード
   いろいろと探してみたのですが、やはりDPIの取得は
わかりませんでした。

GetSystemMetricsについては下記hpで確認したのですがDPIは
無いようでした。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpsysinf/html/_win32_getsystemmetrics.asp

ちゃっぴさんに教えて頂いた、ツールですが、VBA、それもエクセルの
初歩しか知らないので、やはり手に余るようです・・・
ソースのリストは出てくるようになりましたが、さっぱりわかりません。
(DPI設定の取得するためには何を質問していいのやらも・・・)
こちらの方はぼちぼちと見ていきたいと思いますがどうなることやらです。

ということで、皆さんDPI取得について教えて頂けますでしょうか?

【24025】Re:DPI設定の取得
回答  ちゃっぴ  - 05/4/10(日) 1:24 -

引用なし
パスワード
   >ちゃっぴさんに教えて頂いた、ツールですが、VBA、それもエクセルの
>初歩しか知らないので、やはり手に余るようです・・・

WScript.Echo となっている部分を Debug.Printとしてやることで
とりあえずは動作可能です。

ちなみにDPIは「LogPixels」Propertyになります。

要参照 Microsoft WMI Scripting VX.X Library

Dim objWMIService As WbemScripting.SWbemServices
Dim colItems   As WbemScripting.SWbemObjectSet
Dim objItem    As WbemScripting.SWbemObject

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
  "SELECT LogPixels, PelsHeight, PelsWidth FROM Win32_DisplayConfiguration", _
  "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
  Debug.Print "LogPixels: " & objItem.LogPixels
  Debug.Print "PelsHeight: " & objItem.PelsHeight
  Debug.Print "PelsWidth: " & objItem.PelsWidth
Next objItem

【24026】Re:DPI設定の取得
発言  やま  - 05/4/10(日) 1:40 -

引用なし
パスワード
   ちゃっぴ さん こんばんは、ありがとうございました。

何とかできました。
最初 Microsoft WMI Scripting V1.2 Library の参照が設定していなかった
のでユーザー定義が無いとエラーになったのですが、いろいろと探してるうち
にMicrosoft WMI Scripting V1.2 Libraryの設定をしてうまくいきました。

この参照設定はふつうは設定されてないんでしょうか?
もしそうなら、作ったファイルを不特定のPCで動かす場合に不具合が起きそ
うです。何か方法があるのでしょうか?

【24028】Re:DPI設定の取得
発言  やま  - 05/4/10(日) 2:06 -

引用なし
パスワード
   ちゃっぴ さん こんばんは

すいません、ちゃんとMicrosoft WMI Scripting VX.X Library参照って書いて頂いてましたね。Microsoft WMI Scripting VX.X Libraryについて、HPを検索しろと言うことかと思いこんで勘違いしていました。
通常のエクセルの参照設定のままDPI取得は難しいでしょうか?

【24029】Re:DPI設定の取得
発言  Kein  - 05/4/10(日) 10:40 -

引用なし
パスワード
   変数の型を全て Object で宣言し

Dim objWMIService As Object, colItems As Object

Set objWMIService = _
CreateObject("WbemScripting.SWbemLocator").ConnectServer
Set colItems = Service.ExecQuery _
("SELECT LogPixels, PelsHeight, PelsWidth FROM Win32_DisplayConfiguration", _
  "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

などとする。

【24036】Re:画面の解像度、DPI設定の取得
発言  bykin  - 05/4/10(日) 16:08 -

引用なし
パスワード
   こんにちわ。

>レジストリキー"HKEY_CURRENT_CONFIG\Display\Settings\DPILogicalX"の
>ルートが無効です。

XPマシンではレジストリが大幅に変更されてるみたいやね。
わてのマシンもXPやけど、旧バージョンのOSからのバージョンアップやさかい
レジストリ構成が標準とは違うみたいです。(旧OSを引きずってる)

最初っからXPのマシンで調べたところ、提示したキーや類似のキーは存在せえへんようです。
XPマシンではこの方法は使えんってことやね。

すんまへーん。

【24039】Re:DPI設定の取得
お礼  やま  - 05/4/10(日) 19:01 -

引用なし
パスワード
   Kein さん ありがとうございました。

教えて頂いたコードでエラーがでたので
よくわからなかったのですが、serviceつながりで(^^;)
objWMIService に変えてみたところうまくいきました。
これで何とかなりそうです。
今後ともよろしくお願いします。

【24054】OSに依存
質問  やま  - 05/4/11(月) 9:35 -

引用なし
パスワード
   またまた問題発生です。
おかげさまでとりあえず完成かと思っていたのですが
PCを変えてOS、エクセルのバージョンを変えてテスト
したところうまくいきませんでした。
OSはXPと2000はOKなのですが、Me、98は
ダメみたいです。
Meでは LogPixels がとれないようでNullになってしまいます。
98ではそれ以前に、実行時エラーがでて
オートメーション エラーです オブジェクトライブラリは登録されていません
になってしまいます。
根本的なところが解っていないため、OSが違うとどうしてだめなの
かもよくわかりません。
なにか、対応策はありますでしょうか?

【24057】Re:OSに依存
発言  Kein  - 05/4/11(月) 11:38 -

引用なし
パスワード
   98やMeの場合、レジストリからの情報を得るbykinさんのコードでオッケーなはずです。

【24063】Re:OSに依存
発言  やま  - 05/4/11(月) 15:10 -

引用なし
パスワード
   了解です。まず、OSの種類を取得して分岐させることにします。

10043 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free