[[20170302214231]] 『画像位置情報&参照設定』(かぼ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『画像位置情報&参照設定』(かぼ)

こんばんは。お世話になります。

大量の画像をシートの所定の位置に自動で張り付けるマクロを作成したく、
位置指定の為に所定の位置に既に張り付けられている画像の位置情報を
.topと.leftを使い取得したのですが、同じファイルにも関わらず
位置情報を取得するPCによって結果が変わってしまいます。

試してみたのはそれぞれ異なる下記8つのPCです
1.Windows7/Excel2010/ノートパソコンA機種
2.Windows7/Excel2010/ノートパソコンA機種
3.Windows7/Excel2010/ノートパソコンA機種
4.Windows8.1/Excel2010/デスクトップ
5.Windows10/Excel2016/ノートパソコンB機種
6.Windows8.1/Excel2010/ノートパソコンA機種
7.Windows8.1/Excel2010/ノートパソコンB機種
8.Windows8.1/Excel2010/ノートパソコンB機種

結果は、3パターンあり、下記の区分けとなりました。
1 / 2,3,4,5 / 6,7,8
OSの違いやエクセルのバージョンの違い、はたまたモニターの違い?など
色々と考えてみましたが規則性が見つからず、
皆さまなら何か情報をお持ちでないかと思いましてこちらに伺った次第です。

何か条件等ありましたらご教示くださいませ。

もう一つ、
エクセルからパワポ操作をマクロにて行うため、
参照設定でMicrosoft PowerPoint 14.0 Object Libraryにチェックを入れているのですが、
Excel2016で動作させ上書き保存した後にExcel2010で開くと
参照不可となってしまい、手動で設定を戻さなければなりません。
下記サイトにて、参照不可は解除出来ないとありますが、何か方法ありませんでしょうか。
「Office TANAKA - マクロで参照設定を操作する」
http://officetanaka.net/excel/vba/tips/tips100.htm

説明不足等ありましたらすみません。
よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows8 >


 >結果が変わってしまいます。 
 どのような結果なのかを、それぞれ具体的に示さないのは、わざとですか?

 >画像の位置情報を .topと.leftを使い取得したのですが、
 具体的に、どんなコードですか?

 1〜8、を比べたいなら、OSの種類、Excelの種類の他に、
 画面の解像度、せめてOSのbit数、Excelのビット数 も調べてください。

(通りすがり) 2017/03/03(金) 07:21


通りすがり様

申し訳ありません、
データが会社にあり自宅から閲覧できないため詳細が記載出来ませんでした。
本日取得した具体的なデータと、取得するのに使用したマクロをメモして参ります。
また、挙げていただいたPCのより詳細なデータも併せて調べて参ります。

PCに疎いため、調べ方は後ほど調べてみますが、
別業務中の同僚に協力してもらいデータを収集しているため、
マクロ等を利用した簡単な解像度やbit数の判定方法等ご存知でしたらご教示いただけましたら幸いです。

よろしくお願いいたします。
(かぼ) 2017/03/03(金) 08:34


通りすがり様

度々すみません。
調べてみたところbit数等判定出来るコードがヒットしたので
そちらを利用してみます。
検索もせず大変失礼いたしました。
また、アドバイスいただきましてありがとうございます。
今夜改めて詳細を追加させていただきます。
よろしくお願いいたします。
(かぼ) 2017/03/03(金) 08:42


 詳細追加して説明される際には

 ・この場所の確認作業ですけど、画像が貼り付けられている「同じブック」を相手にしておられるんですよね。
  念のため、そこも明確にしてください。
  (同じように貼り付けた別ブックを相手にしているなら、位置情報がかわっても不思議じゃないですので、あくまで念のため)

 ・その時の 各環境での Left/Top のポイント数を(その中の1つの画像でいいので)具体的にアップしてください。

(β) 2017/03/03(金) 09:05


 >かぼ さん

 >マクロ等を利用した簡単な解像度やbit数の判定方法等ご存知でしたらご教示いただけましたら幸いです。 

[[20170116012224]] の(マリオ) 2017/03/03(金) 19:47

 にある■シートレイアウト To Text_To ClipBord_02.xls をご利用ください。
 操作シートの【おまけ】「セル範囲、W2:AD9」にある
 「バージョンを確認_OS及びExcel」と「画面解像度を取得」
(マリオ) 2017/03/03(金) 19:54

皆さま

お世話になります。
詳しいデータを持ち帰って参りました。

1台追加した9台で、3つの画像の位置データを取得しました。
データ取得に利用したファイルはサーバー上に置いてある一つのブックとなっています。
また、データを取得した後は保存せず閉じているため、検証用に作成し保存した時点から上書きされていません。
データの取得に利用したコードは文末にて記載いたします。

■PCデータ
1. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*900
2. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*900
3. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*1200
4. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1280*1024
5. Excel2016 / Windows10(64 ビット) / Windows 32-bit NT 10.00 / 1920*1080
6. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080
7. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080
8. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080
9. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080

■位置データ(数値はLeft, Topと記載しております。)
1. 0 ,0 / 115.892280578613 ,26.9434642791748 / 591.845642089843 ,99.5977935791015
2. 0 ,0 / 115.285751342773 ,25.2857475280761 / 588.206848144531 ,93.7959060668945
3. 0 ,0 / 115.285751342773 ,25.2857475280761 / 588.206848144531 ,93.7959060668945
4. 0 ,0 / 115.285751342773 ,25.2857475280761 / 588.206848144531 ,93.7959060668945
5. 0 ,0 / 120.642913818359 ,25.2857475280761 / 593.564025878906 ,93.7959060668945
6. 0 ,0 / 114.857162475585 ,27.4285831451416 / 585.635437011718 ,101.295906066894
7. 0 ,0 / 114.857162475585 ,27.4285831451416 / 585.635437011718 ,101.295906066894
8. 0 ,0 / 114.857162475585 ,27.4285831451416 / 585.635437011718 ,101.295906066894
9. 0 ,0 / 114.857162475585 ,27.4285831451416 / 585.635437011718 ,101.295906066894

昨日は3パターンと申し上げましたが、改めて実施してみたところ、
1 / 2, 3, 4 / 5(Topのみ左記パターンと異なる) / 6, 7, 8, 9 の4パターンになってしまいました。
画像の貼り付け作業は特定の者が行うため、条件によって貼り付ける数値を変更する等業務上はやりようがあるのですが、
何故座標が違ってしまうのかが分からず、スッキリさせたい気持ちで質問させていただきました。

マリオ様

ご丁寧にありがとうございます。
幸い、検索したところそれらしいコードが見つかったので上記に組み込むことが出来ました。
(WMIを利用したことがなかったため、スマートとは言い難い記述になってしまいましたが…)
ご提示いただいた先のコードは後学の為にじっくり拝見させていただきます。

以下、取得用のコードです。

    Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    Private Const SM_CXSCREEN As Long = 0
    Private Const SM_CYSCREEN As Long = 1

Sub 画像位置情報取得()

    Dim obj As Object
    Dim Ws As Worksheet
    Dim i As Long
    Dim Locator, Service, OsSet, os, oClassSet
    Dim osname As String, osbit As String, model As String

    Set Locator = CreateObject("WbemScripting.SWbemLocator")
    Set Service = Locator.ConnectServer
    Set OsSet = Service.ExecQuery("Select * From Win32_OperatingSystem")
    Set oClassSet = Service.ExecQuery("Select * From Win32_ComputerSystemProduct")

    Application.ScreenUpdating = False

    Set Ws = Sheets(2)

    For Each os In OsSet
        osname = osname & os.Caption
    Next os

    For Each os In OsSet
        osbit = osbit & CStr(os.OSArchitecture)
    Next os

    For Each os In oClassSet
        model = model & os.Name
    Next os

    Ws.Cells(1, 1) = "ユーザー"
    Ws.Cells(2, 1) = "モデル"
    Ws.Cells(3, 1) = "エクセルVer."
    Ws.Cells(4, 1) = "OS"
    Ws.Cells(5, 1) = "OSbit数"
    Ws.Cells(6, 1) = "Office bit数"
    Ws.Cells(7, 1) = "解像度"
    Ws.Cells(9, 1) = "Left"
    Ws.Cells(9, 2) = "Top"

    Ws.Cells(1, 2) = Application.UserName
    Ws.Cells(2, 2) = model
    Ws.Cells(3, 2) = Application.Version
    Ws.Cells(4, 2) = osname
    Ws.Cells(5, 2) = osbit
    Ws.Cells(6, 2) = Application.OperatingSystem
    Ws.Cells(7, 2) = GetSystemMetrics(SM_CXSCREEN) & "*" & GetSystemMetrics(SM_CYSCREEN)

    Set Service = Nothing
    Set OsSet = Nothing
    Set Locator = Nothing
    Set os = Nothing

    On Error Resume Next
    i = 0
    For Each obj In Sheets(1).Shapes
        i = i + 1
        Ws.Cells(i + 9, 1) = obj.Left
        Ws.Cells(i + 9, 2) = obj.Top
    Next
    On Error GoTo 0

End Sub
(かぼ) 2017/03/03(金) 20:42


 >かぼ さん
 Sheets(1)にある画像が、A1セルの左上位置のときは、
 1〜9全てで、Left位置とTop位置は、ともにゼロなのですね!

 それ以外の場合のLeft位置とTop位置のズレが、気になっているの
 ですよね…。考え中です…。
 ***********************************************************
 シート名「Sheet1」に画像が貼り付けてあり、
 シート名「Sheet2」に、Top位置やLeft位置を記述するとして

 Sub 画像位置情報取得() プロシージャの
 〓〓〓変更前〓〓〓〓〓〓〓〓〓〓
 Set Ws = Sheets(2)
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 を次のように変更してみてください。
 〓〓〓変更後〓〓〓〓〓〓〓〓〓〓
 Set Ws = ThisWorkbook.Sheets("Sheet2")
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 また、
 〓〓〓変更前〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 For Each obj In Sheets(1).Shapes
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 を次のように変更してみてください。
 〓〓〓変更後〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 For Each obj In ThisWorkbook.Sheets("Sheet1").Shapes
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 どのブックなのかが、指定されていません。
 複数のブックが開かれていると、取得したいデータ(Left位置、Top位置)
 と異なるデータが取得されるおそれがあります。
(マリオ) 2017/03/03(金) 21:23

 >かぼ さん

 ★画像は、どのようにしてシートに挿入しましたか?

 こちら(Excel2013 32bit,OS Windows10 64 bit,解像度 1366×768)
 では、挿入tab→図→画像→
 jpg画像を選択して「Sheet1」のシートに画像を挿入して、
 Sub 画像位置情報取得()を実行してみましたが、
 そもそも、
 Top位置やLeft位置は、小数点以下2桁までしか表示されません。

 A10=115.500000000000
 B10= 29.250000000000
 みたいな感じで!

 >1. 0 ,0 / 115.892280578613 ,26.9434642791748 / 591.845642089843 ,99.5977935791015 
 ↑かぼさんのデータを見ると、Left位置とTop位置ともに、
 小数点以下12桁まで数字がありますが、そもそもそれが謎です。

 ********************************************************
 ★かぼさんが取り扱った元画像のデータは、どのようなものですか?
 ★どのようにして、シートに取り込んだかも、教えてください。 

 ■取り扱ったjpg画像の詳細データ
 1920ピクセル×1080ピクセル、
 水平方向の解像度96dpi、
 垂直方向の解像度96dpi、
 ビットの深さ24
(マリオ) 2017/03/03(金) 21:54

マリオ様

早速ありがとうございます。
図についてですが、上記データでは検証用として
1. A1セルに貼り付けたもの
2. ↑をコピーし適当な箇所に貼り付け、Ctrl+方向キーでセルの左上から中途半端にズラしたもの
3. 同上
の、3つの図で試しております。

ブックの記述は省いていますが、ボタン設置でマクロ起動しているため
アクティブブックの検証用ファイルで処理されています。
(座標データから見ても他ブックを参照していない事が分かります)
(かぼ) 2017/03/03(金) 22:02


不思議な現象ですね。図形の位置はポイント値によるドキュメント座標ですから、解像度が異なろうと
 エクセル上の表示倍率がどうなっていようと、常に一定のはずなんですが・・・

 もしかしたら、ブックを開いて裏で図形をしかるべき場所に投影する際に、エクセルバージョンやOSや解像度の組み合わせで
 少し位置取りに誤差がでている? そう思わせるような結果ですね。

 関係は薄いと思いますけど、シート上に貼り付けられている画像ってファイルとのリンクありですか?
 それとも、リンクなしの画像ですか?

 そちらの確認作業とかわらないんですが、新規ブックに以下を貼り付け
 まず TestGen を実行して、名前をつけて保存して閉じて、あらためて9台のPCで、このブックを開いて
 Test を実行した時に A1,B1,C1 にセットされる値を教えていただけませんか。

 Sub TestGen()
    Dim L As Double
    Dim T As Double

    ActiveSheet.DrawingObjects.Delete

    L = Range("J30").Left
    T = Range("J30").Top

    ActiveSheet.Shapes.AddShape msoShapeOval, L, T, 72, 72

 End Sub

 Sub Test()
    With ActiveSheet.Shapes(1)
        Range("A1:C1").Value = Array(.Left, .Top, Application.InchesToPoints(1))
    End With
 End Sub

(β) 2017/03/03(金) 22:23


β様

レスありがとうございます。
画像はリンクなしの、ただの画像です。

頂いたコードでの検証作業について一点確認ですが、
まず特定のPC(例えばPC1)でTestGenを実行し、結果のファイルを保存後、
保存したファイルに対して9台それぞれでTestを行う、でよろしいですか?

PC1で指定して張り付けた画像が他のPCで同じ座標,サイズで認識されるかのテスト、と理解しています。

因みに、前述の検証ファイルですが、
一つのファイルで行っているため当然ではあるのですが、
どのPCで開いても表示されている画像の位置には少しも違いがありません。
なので、純粋に各PC毎にものさしの大きさが変わってしまったように思われます…。
(かぼ) 2017/03/03(金) 22:38


当然の事ですが、一応情報を追加させていただきます。

それぞれのPCで各自が取得した座標で図形を張り付けても
座標の数値が違うにも関わらず見た目ではどのPCでも全く同じ位置に画像が貼られます。
逆に、それぞれのPCで同じ座標データで貼り付けを行うと、PCにより画像の位置にずれが生じます。
前述した座標データでご理解いただけているかとは思いますが、念のため。
(かぼ) 2017/03/03(金) 22:52


 >>まず特定のPC(例えばPC1)でTestGenを実行し、結果のファイルを保存後、 
 >>保存したファイルに対して9台それぞれでTestを行う、でよろしいですか? 

 はい、その通りです。

 >>各PC毎にものさしの大きさが変わってしまったように思われます…。 

 私もそのように思っています。で、ものさしがいろいろありますので、念のため PPI もチェックしてみようかなと。

(β) 2017/03/03(金) 23:04


β様

ありがとうございます。
週明け、いただいたコードにて再度データを収集してまいります。

それからすみません、PPIというのが聞き慣れないのですが、
もし他に検証できるものさしがあるようでしたら併せてチェックして参りますので
お知らせいただけましたら幸いです。
(かぼ) 2017/03/03(金) 23:25


 >かぼ さん

 ★下記の追加をした場合、
 ExcelアプリとA1セルについても、
 Left位置とTop位置(ポイント単位)は、小数点以下2桁までじゃなく、
 小数点以下12桁まで取得されるのでしょうか?

 また、下記の2行ですが、画像を貼り付けたシートの倍率が
 100%の場合は、元画像の幅と高さのピクセル値と同じに
 なるはずですが、同じになりますか?
 Ws.Cells(i + 9, 3) = (obj.Width) * (80 / 33)
 Ws.Cells(i + 9, 4) = (obj.Height) * (80 / 33)

  '----- 追加 ----------------------------------------------------
    Ws.Cells(9, 3) = "Width"
    Ws.Cells(9, 4) = "Height"
    Ws.Cells(9, 5) = "オブジェクト名"'●追加
    Ws.Cells(9, 6) = "オブジェクトのタイプ"'●追加
    Ws.Cells(1, 5) = "ExcelアプリのLeft"
    Ws.Cells(1, 6) = "ExcelアプリのTop"
    Ws.Cells(2, 5) = Application.Left 'ポイント単位
    Ws.Cells(2, 6) = Application.Top 'ポイント単位
    Ws.Cells(4, 5) = "A1セルのLeft"
    Ws.Cells(4, 6) = "A1セルのTop"
    Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96 'ポイント単位'◆訂正
    Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96 'ポイント単位'◆訂正

 '----- ★印の行だけ追加 -----------------------------------------
    For Each obj In ThisWorkbook.Sheets("Sheet1").Shapes
        i = i + 1
        Ws.Cells(i + 9, 1) = obj.Left 'ポイント単位
        Ws.Cells(i + 9, 2) = obj.Top 'ポイント単位
        Ws.Cells(i + 9, 3) = obj.Width * (80 / 33) '★ピクセル単位(ただし、Sheet1の倍率が100%のとき)
        Ws.Cells(i + 9, 4) = obj.Height * (80 / 33) '★元画像のピクセル単位と同じになるはずです!
        Ws.Cells(i + 9, 5) = obj.Name'★●追加
        Ws.Cells(i + 9, 6) = obj.Type'★●追加
    Next
 '-----------------------------------------------------------------

(マリオ) 2017/03/03(金) 23:33


マリオ様

ありがとうございます。
検証用コードに「追加」のコードと、「★印の行だけ追加」の2行を追加し、
週明けに再度行ってみたいと思います。

月曜の夜あたりに、β様に頂いたコードの結果と
マリオ様に追加していただいたコードの結果を改めてご報告させていただきます。

色々とありがとうございます。
引き続きよろしくお願いいたします。
(かぼ) 2017/03/04(土) 00:19


 PPI Points Per Inchi で、標準は 72 になっているはずです。

 物さしとしては DPI はすでに調べておられますので、まぁ、これぐらいかなと。

(β) 2017/03/04(土) 00:28


 それと・・・

 マリオさんのコードの中の

    Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(Range("A1").Left) * 72 / 96 'ポイント単位
    Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(Range("A1").Top) * 72 / 96 'ポイント単位

 PointsToScreenPixelsX/Y 、名前がいかにも ポイントをピクセルに変換するような印象ですけど
 引数として与えるものは、『ドキュメント座標としてのピクセル値』です。
 まぁ、A1のLeft/Top は ともに 0 ポイント であり、ピクセル値も したがって(たまたま)0 なので
 結果オーライですけど。

 正確に書くなら

    Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96 'ポイント単位
    Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96 'ポイント単位

 ところで、ここで取得する値は、スクロール無し(A1が左上隅) で、画面が最大化の場合には
 意味ありですけど、スクロールされていたり、通常サイズでウィンドウの場所がかわれば A1 の場所がかわるわけで
 したがって 取得される値も変わってきますね。(念のため)

 でも、誰でも誤解しますよね。このメソッド名は。

 MS も、

https://msdn.microsoft.com/ja-jp/library/cc390345.aspx

 ここで、『こっそりと』名前が適切じゃなかったなぁと懺悔(?)してます。

(β) 2017/03/04(土) 00:38


 >かぼ さん

 検証用コードに、
 2017/03/03(金) 23:33 の
 「追加」のコードと、「★印の行だけ追加」の2行を追加した場合、

 βさんから指摘もありましたが、
 エクセルアプリは◆「最大化表示」、かつ、
 両シートは◆「スクロールしない」(A1セルが左上位置にくるように)で、かつ、
 両シートの◆「倍率を100%」にしてから、
 それぞれのPCで、Sub 画像位置情報取得() プロシージャを実行してください。

 ■下記のように、2行を変更してください。
  Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96 'ポイント単位
    Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96 'ポイント単位

[[20170302072133]]の 2017/03/03(金) 09:35 のところで、

 ???さんが、DPIを取得するコードを書いてくれました。
 詳細は確認してませんが…。コピペして下に貼り付けます。
 すべてのPCでDPIを確認してみてください。
 96dpiが、標準だと思いますが…。

 Sub test()
    Dim OBJ As Object
    With CreateObject("WbemScripting.SWbemLocator")
        For Each OBJ In .ConnectServer.ExecQuery("Select * From Win32_DisplayConfiguration")
            MsgBox OBJ.LogPixels & " DPI", vbInformation, "画面解像度"
        Next OBJ
    End With
 End Sub

(マリオ) 2017/03/04(土) 03:23


 >βさん
 >PointsToScreenPixelsX/Y 、名前がいかにも ポイントをピクセルに変換するような印象ですけど

 ↓教えて頂いた、コチラで確認いたしました。
https://msdn.microsoft.com/ja-jp/library/cc390345.aspx 
 expression.PointsToScreenPixelsX(Points)
 Points   長整数型 (Long) の値。ピクセル数を指定します。

 あらら、カッコ内は、ポイント数の値ではなく、
 ピクセル数の値だったのですね…。誤解してました
(マリオ) 2017/03/04(土) 05:01

 >βさん
 DPIとPPIをネットで調べると、
 DPI(dots per inch)
 PPI(pixel per inch)
 とヒットするのですが、
 >PPI Points Per Inchi
 は、一般的な略語なのでしょうか?
 *****************************************************************
[[20170302072133]] のサイトからの抜粋です

    |[A]     |[B]    |[C]    |[D]   |[E]     |[F]    |[G]    
 [1]|-       |pixcel |point  |inch  |HIMETRIC|mm     |cm     
 [2]|pixcel  |-      |72/96  |1/96  |2540/96 |25.4/96|2.54/96
 [3]|point   |96/72  |-      |1/72  |2540/72 |25.4/72|2.54/72
 [4]|inch    |     96|     72|-     |    2540|   25.4|   2.54
 [5]|HIMETRIC|96/2540|72/2540|1/2540|-       |   0.01|  0.001
 [6]|mm      |96/25.4|72/25.4|1/25.4|     100|-      |    0.1
 [7]|cm      |96/2.54|72/2.54|1/2.54|    1000|     10|-    

 上記の「長さの変換表」を見ると、
 1 inch = 96 pixcel
 1 inch = 72 point
 で、これは決まっています。
 *************************************************************
 DPI(dots per inch)
 1インチ(=2.54cm)の中にどれだけのドットがあるかを示す
 現状のPCでは、96dpiが標準だと思います。
 より高精細な画面では、96より大きな値になります。
 ドットとはPC画面の『点』のことです。
 *************************************************************
 PPI(pixel per inch)
 1インチ(=2.54cm)の中に、どれだけのピクセルがあるか示す

(マリオ) 2017/03/04(土) 05:02


 >PPI

 まぎらわしいですね。βの造語?(でもないんです。後述)

 単純に Points Per Inch の頭文字をつなげたつもりでしたが、そうか、Pixcels Per Inch も PPI ですね。

 じゃぁ、これからは Application.InchesToPoints の頭文字をつなげて ITP と呼ぼうかな?

 以下は余談です。

 エクセル上のポイント値によるスクリーン座標をピクセル値によるWindow座標に変換するために
 かなり昔、エキスパートさん達がいろいろ苦労しおられ、私も(別板ですけど)
 エキスパートさんたちの指導を受けながら、あれこれ、トライしていた時期がありました。
 エクセル画面そのものの移動、表示倍率、スクロール あたりまでは、割合と素直なコードで実現できるんですが
 枠固定が入ると、もう、どうしようもなくなる。

 最終的には試行錯誤の結果、あるコードにたどり着きましたが、できあがった後、
 さらにネットを検索していましたら、角田御大のページに、処理方式が提示されていました。
 私のものと、同じようなアプローチで値取得をしておられて、こちらを先にみればよかったなぁと
 そう思ったことを思い出します。

 まぁ、1つのポイントは、PointsToScreenPixelsX/Y に対して 枠固定の場合は
 Window ではなく Pane を与える必要があったわけですが、そのPane の取得方法が
 私のものと角田さんのものとは、ちょっと違っており、(どちらがいいということではなく)
 そこが、私のオリジナリティかなと。(天下の角田御大に対して不遜な自己満足ですが)

 私のコードは

[[20150717220505]] 『特定のセル横にフォームを表示させる方法は?』(やっぱり初歩)

 で紹介した

 http://www.moug.net/faq/viewtopic.php?t=72229&highlight= 

 に掲載したんですが、今は閲覧期限が過ぎて見れません。

 角田さんのコードは、ご自身のページにもありますし、MOUGのアーカイブ

https://web.archive.org/web/20140710093810/http://www.moug.net/faq/viewtopic.php?t=69717

 ここでも見ることができます。

 で、この角田さんのコード内 でも PPI を Points Per Inch をあらわす変数名として
 つかっておられます。

 確か、当時、皆さん、いろいろ苦労しておられたときに、ふつうに【PPI】を
 そういった意味で使っておられたように記憶しています。

(β) 2017/03/04(土) 07:53


 ↑ あぁ、このあたりは マリオさんの

[[20170128150724]] 『Excel_VBAのForm1の現在位置取得(TopとLeft)』(マリオ) 

 で、紹介してましたね。すっかり忘れていました。

 マリオさんのトピで紹介した

http://www.moug.net/faq/viewtopic.php?t=75159&sid=ada62619f27949af2900dcfa77aa05ff

 これは、まだ閲覧期限内なので見ることができました。

(β) 2017/03/04(土) 09:05


 >かぼ さん

 2017/03/03(金) 23:33 の記事を修正しました。
 [--- 追加 ---]と[--- ★印の行だけ追加 ---]のところです。
 ◆訂正が、2箇所で、
 ●追加が、4箇所です。
 (★印は、2箇所から4箇所になりました)

 **********************************************************************************
 訂正は、βさんの2017/03/04(土) 00:38 で説明のあった箇所の訂正
 追加は、【画像のオブジェクト名】と【オブジェクトのタイプ】に関するものです。

 Sheet2のF列の10行目以降が、
 13なら、オブジェクトのタイプは、msoPicture(画像)です。
 11なら、オブジェクトのタイプは、msoLinkedPicture(リンクしている画像)です。

 その他の番号なら、次のURL先の[msoShapeTypeのメンバーの定数と値]を参照してください。
http://www4.synapse.ne.jp/yone/excel2010/excel2010_zu_obje_del.html
(マリオ) 2017/03/06(月) 02:37

遅ればせながら、私からの見解なぞ。

まず1つ目の、画像位置の違いですが、ディスプレイのDPIの問題かと思われます。高解像なディスプレイの場合、文字が小さくて読み辛いため、以前はフォントサイズを変えていましたが、最近のWINDOWSならばディスプレイの設定で文字を大きくできますよね。これを設定していると、ディスプレイのDPIが変わるのです。フォントだけ変えると、メニュー等のサイズが変わらずに見た目が崩れるのですが、ディスプレイ設定の変更ならば、メニューも一緒に拡大される(画面DPIを考慮しないアプリは崩れますが)ので、都合が良いのです。自分で設定しなくとも、例えばメーカー製のノートPCで2560*1440のものは、出荷時から高DPIに設定されていたりします。
マリオさんがリンクしてくれましたが、画像サイズに関する詳しい情報は別トピに書きましたので、[[20170302072133]]を参照してください。

2つ目のパワポのバージョン違いの対策ですが、「参照設定」を止めて、CreateObject("PowerPoint.Application") を利用してみてはいかがでしょうか。レイトバインドならば、インストールされているアプリを利用するので、バージョン違いを吸収できるかと思います。
(???) 2017/03/06(月) 09:44


 >βさん
 2017/03/04(土) 07:53     2017/03/04(土) 09:05 
 のリンク先ですが…、話が高度すぎます。
 気軽には、読めない内容ですね…(+_+)

(マリオ) 2017/03/06(月) 13:29


 >β さん

 かぼ さんの質問内容とは、関係ないことですが、…。
 (β)さんの 2017/03/04(土) 09:05 の記事にある
http://www.moug.net/faq/viewtopic.php?t=75159&sid=ada62619f27949af2900dcfa77aa05ff
 でやりたいことは、
 >選択したセルの直下にユーザーフォームを出したいのですが 
 >(◆シートのダブルクリックイベント) ですね。

 >行の頭をウィンドウ枠の固定状態にしでスクロールさせてしまうと 
  とありますが、これを無視すると…。

 βさんは、ここで、
 ・★枠固定
 ・★Windowの分割
 ・★表示倍率の変更
 の3点を考慮して、コードを記述していますが、

 βさんのコードでも、表示倍率を、例えば、60%とかにしたら、
 微妙にずれますね…。

 ★この3点を考えなければ、
 シートのコード記述欄に、下記を記載で済みますね(※Form1を作成しておく)。

  Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Not (Target.Rows.Count = 1 And Target.Columns.Count = 1) Then Exit Sub
     Cancel = True
     With UserForm1
         .Show vbModeless
         .StartUpPosition = 0
         .Left = ActiveWindow.PointsToScreenPixelsX(0) * (72 / 96) + ActiveCell.Left
         .Top = ActiveWindow.PointsToScreenPixelsY(0) * (72 / 96) + ActiveCell.Offset(1).Top
     End With
 End Sub
(マリオ) 2017/03/06(月) 14:17

 >βさんのコードでも、表示倍率を、例えば、60%とかにしたら、
 >微妙にずれますね…。

 たぶん、そこは、わかっているところです。
 xl2007以降、ユーザーフォームの外枠の線が少し太くなったので、4pixほどずれます。
 倍率が小さくなるとめだちますね。

 ★★ それより、なんだか、質問者さんの質問テーマから、どんどん、離れていってません?
    私も悪いんですが。
    そろそろ、打ち止めにしましょう。

(β) 2017/03/06(月) 19:45


お世話になります。
ご報告が遅れてしまい申し訳ありません。

追加でデータを収集しましたのでご報告いたします。
PCを1台追加した10台で検証しております。(DPIは全て96でした ※???様のコード利用)

■前提
・検証ファイルは上書き状態にない同一ファイルです
・前回とは別ファイルにて検証しているため画像の位置が変わっています
・シートの倍率は100%です
・検証ファイルの作成は下記PC#6にて行っていますので、#6のデータを基準値といたします(データ末尾に★を記載)
・画像B〜Dは画像Aをコピーペーストしたものです(その際サイズは変更しておりません)
・オブジェクトのタイプはいずれもmsoPictureでした(画像AがmsoPictureのため当たり前ですが)
・拡張モニターの使用は制限を掛けておりません(業務中に協力いただいているため制限ができません)

■PCデータ(エクセルver. / Windows ver.(bit) / Office bit / 解像度 / DPI
1. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*900 / 96
2. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*900 / 96
3. Excel2010 / Windows7(64 ビット) / Windows 32-bit NT 6.01 / 1600*1200 / 96
4. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1280*1024 / 96
5. Excel2016 / Windows10(64 ビット) / Windows 32-bit NT 10.00 / 1920*1080 / 96
6. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080 / 96 ★
7. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080 / 96
8. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080 / 96
9. Excel2010 / Windows8.1(64 ビット) / Windows 32-bit NT 6.02 / 1920*1080 / 96
10. Excel2016 / Windows10(64 ビット) / Windows 32-bit NT 10.00 / 1920*1080 / 96 ←追加

■ExcelアプリのLeft, Top / A1セルのLeft, Top
1. -4.43396226415094, -5.43396226415094 / 0, 0
2. -5, -6 / 0, 0
3. -5, -6 / 0, 0
4. -5, -6 / 0, 0
5. -5, -6 / 19.5, 104.25
6. -4.4, -5.4 / 0, 0 ★
7. -4.4, -5.4 / 0, 0
8. -4.4, -5.4 / 0, 0
9. 418.6, 49.8 / 0, 0
10. -4.5, -5.5 / 30, 243.75

■画像A位置データ(Left, Top, Width, Height)※A1セルに直接貼り付け
1. 0, 0, 27.4439516934482, 27.4874739213423
2. 0, 0, 27.4439516934482, 27.4874739213423
3. 0, 0, 27.4439516934482, 27.4874739213423
4. 0, 0, 27.4439516934482, 27.4874739213423
5. 0, 0, 27.4439516934482, 27.4874739213423
6. 0, 0, 27.4439516934482, 27.4874739213423 ★
7. 0, 0, 27.4439516934482, 27.4874739213423
8. 0, 0, 27.4439516934482, 27.4874739213423
9. 0, 0, 27.4439516934482, 27.4874739213423
10. 0, 0, 27.4439516934482, 27.4874739213423

■画像Bデータ ※C5セルに貼り付け
1. 97.8113403320312, 51.6226768493652, 27.4439516934482, 27.4874739213423
2. 96, 48, 27.4439516934482, 27.4874739213423
3. 96, 48, 27.4439516934482, 27.4874739213423
4. 96, 48, 27.4439516934482, 27.4874739213423
5. 102, 48, 27.4439516934482, 27.4874739213423
6. 96, 50.4000015258789, 27.4439516934482, 27.4874739213423 ★
7. 96, 50.4000015258789, 27.4439516934482, 27.4874739213423
8. 96, 50.4000015258789, 27.4439516934482, 27.4874739213423
9. 96, 50.4000015258789, 27.4439516934482, 27.4874739213423
10. 96, 50, 27.4439516934482, 27.4874739213423

■画像Cデータ ※手で移動させたもの
1. 164.117004394531, 77.4339370727539, 27.4439516934482, 27.4874739213423
2. 161.399993896484, 72, 27.4439516934482, 27.4874739213423
3. 161.399993896484, 72, 27.4439516934482, 27.4874739213423
4. 161.399993896484, 72, 27.4439516934482, 27.4874739213423
5. 167.399993896484, 72, 27.4439516934482, 27.4874739213423
6. 161.399993896484, 75.599998474121, 27.4439516934482, 27.4874739213423 ★
7. 161.399993896484, 75.599998474121, 27.4439516934482, 27.4874739213423
8. 161.399993896484, 75.599998474121, 27.4439516934482, 27.4874739213423
9. 161.399993896484, 75.599998474121, 27.4439516934482, 27.4874739213423
10. 161.399993896484, 75, 27.4439516934482, 27.4874739213423

■画像Dデータ ※手で移動させたもの
1. 204.022674560546, 105.045272827148, 27.4439516934482, 28.2284892689098
2. 200.399993896484, 97.8000030517578, 27.4439516934482, 26.0329275420218
3. 200.399993896484, 97.8000030517578, 27.4439516934482, 26.0329275420218
4. 200.399993896484, 97.8000030517578, 27.4439516934482, 26.0329275420218
5. 206.399993896484, 97.8000030517578, 27.4439516934482, 26.0329275420218
6. 200.399993896484, 102.599998474121, 27.4439516934482, 27.4874739213423 ★
7. 200.399993896484, 102.599998474121, 27.4439516934482, 27.4874739213423
8. 200.399993896484, 102.599998474121, 27.4439516934482, 27.4874739213423
9. 200.399993896484, 102.599998474121, 27.4439516934482, 27.4874739213423
10. 200.399993896484, 101.800003051757, 27.4439516934482, 27.245048754143

■J30の座標/PPI(β様のコード実行結果)
1. 440.150939941406, 374.26416015625 / 72
2. 432, 348 / 72
3. 432, 348 / 72
4. 432, 348 / 72
5. 438, 348 / 72
6. 432, 365.399993896484 / 72 ★
7. 432, 365.399993896484 / 72
8. 432, 365.399993896484 / 72
9. 432, 365.399993896484 / 72
10. 432, 362.5 / 72

セルの座標までPCによってばらつきが出てしまうようです。。
また、ものさしが違う(というより歪んでいる?)せいか、画像Dのサイズデータにまで違いが現れてしまいました。
画像Dは画像Aのコピーのはずで、同一サイズであるべきなのですが…。

以上の結果に対し、「何故違いが生じるか」という疑問を解決するのは難しいでしょうか…。

???様
パワポの件、ご教示いただきましてありがとうございます。
「CreateObject("PowerPoint.Application")」 を利用したところ、
無事Excel2016、2010両方で正しく動かすことが出来ました。
(かぼ) 2017/03/07(火) 19:43


 >かぼ さん

 データ収集、お疲れ様です。
 検証難しそうですね…。まだ、収集したデータ、全部見てないです。

 単なる、思い付きで発言します! 
 Excel2013では、画像上で右クリックして、コンテキストメニューの
 [サイズとプロパティ]→[図の書式設定]→[プロパティ]の初期設定が、
 【セルに合わせて移動するがサイズ変更はしない】になっていますが、
 すべての図を【セルに合わせて移動やサイズ変更をしない】に変更してますか?

 セル幅の変更がなくても、図が移動してしまうことがあるかも…??

(マリオ) 2017/03/07(火) 20:44


 お疲れ様です。

 マリオさんと同じく、なんとなく、ブックを開いたときに、図形が わずかに動いてしまうような印象を
 持っています。原因はわかりませんが。

 Points Per Inch は すべて標準の72でしたね。(ある意味、残念?)

 ちょっと信じられない数値が ExcelアプリのLeft, Top / A1セルのLeft, Top の 5 と 10。
 A1 の Top も Left も 0 であるべきなんですが、これは、本当に、こういう値だったんですか?
 たまたま、この 2 つは xl2016 で、当方、環境がないので確認できませんが、ちょっと信じられない気持ちです。

(β) 2017/03/07(火) 22:46


マリオ様、β様

コメントありがとうございます。
まとめてのレスで失礼いたします。

■図のプロパティについて
今確認は出来かねますが、おそらく2010のデフォルト状態の
【セルに合わせて移動するがサイズ変更はしない】になっているように思います。
明日確認し、【セルに合わせて移動やサイズ変更をしない】に変更した上で再度検証マクロを動かしてみたいと思います。

■ExcelアプリのLeft, Top / A1セルのLeft, Top(PC#5,PC#10について)
出力した結果実際に上記の値でした。
#5に関しては最初に拡張モニターのせいかと思い、
ノートPCのディスプレイに全画面表示するようお願いして取得しなおしたデータですが上記のようになってしまいました。
ただ、A1セル(=A1の左上端)に張り付けた画像Aの座標は#5も#10も0,0なので、数値として矛盾していますよね…。

明日、もう一度挑戦してみたいと思います。
また、他の2016ユーザーの協力を仰げないかトライしてみます。
(かぼ) 2017/03/07(火) 23:39


 >かぼ さん

 検証ファイルに取り込んだ元画像の
 ★拡張子、★横幅(ピクセル)、★高さ(ピクセル)
(ビットの深さ、サイズ)
 を教えてください。

 また、シートへの画像の取り込み方は、手作業で、挿入tab→図→画像ですか?
 (Excel2013では、この手順ですが)
 それとも、マクロを使用して画像を取り込んだりしてますか?

 **************************************************************
 画像A位置データのWidthとHeightが、それぞれ、
 27.4439516934482
 27.4874739213423
 で、LeftとTopが、それぞれ、0,0で全一致ですね。

 こちらの環境((Excel2013 32bit,OS Windows10 64 bit,解像度 1366×768)
 では、取り込んだ画像の拡張子が、★jpgの場合、
 WidthとHeightの値は、元画像のピクセル値(1920px×1080px)と一致しますよ。
 元画像(水平方向の解像度96dpi、垂直方向の解像度96dpi、ビットの深さ24)

 ***************************************************************
 一方、取り込んだ画像の拡張子が★BMPの場合、
 元画像:横幅が829(ピクセル)、高さが314(ピクセル)
 ビットの深さ:24、サイズ:762KB
 で、結果は次のようになりました。
 (元画像のピクセル値と一致しない。しかも、小数点11桁目まで数値がある。)
 Width= 1507.08436908144
 Height= 570.83769827178

(マリオ) 2017/03/08(水) 07:17


 >かぼ さん

 2017/03/07(火) 19:43の
 ■ExcelアプリのLeft, Top / A1セルのLeft, Top
 で、「5と10」のA1セルのLeft, Topが、0,0になっていないのは、おかしいですね。

 確認ですが、A1セルのLeft, Topを求めるコードは、

 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96
  Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 ではなく、
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  Ws.Cells(5, 5) = Ws.Range("A1").Left
  Ws.Cells(5, 6) = Ws.Range("A1").Top
 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 ですよね? Ws.Cells(1,1).Leftでもいいですが。

 次回、表を貼り付けるときは、
 下記のトピック先の一番下に置いてあるファイルを使用してみてください。
 比較しやすいように、掲示板に貼り付ける表の列数を増やしてみてください。
[[20170116012224]] 『momoさんのツールをいじってみました』 

(マリオ) 2017/03/08(水) 07:34


すいません、画面のDPIを得る方法ですが、私が書いたコードはデフォルト値を得てしまうようで、画面のプロパティを変更しても追従していませんでした。 以下のコードで画面DPIを確認し直してみてください。(縦横で違いは無いと思いますが、念のため)

 Sub test2()
    Dim DC As Long
    Dim DpiX As Long
    Dim DpiY As Long

    DC = GetDC(0)
    DpiX = GetDeviceCaps(DC, 88)
    DpiY = GetDeviceCaps(DC, 90)
    MsgBox DpiX & " DPI(x)" & vbLf & DpiY & " DPI(y)", vbInformation, "画面解像度"
 End Sub
(???) 2017/03/08(水) 11:11

 >??? さん

 DC = GetDC(0)
 のところで、SubまたはFunctionが定義されていません と出ます。

 Moudeleの先頭に記述する、APIを書き忘れてますよね?
 下記のAPIで動きましが、下記のAPIで問題ないですか?

 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 '指定されたデバイスに関するデバイス固有の情報を取得
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _
    ByVal nIndex As Long) As Long

 'デバイスコンテキストを得る
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

(マリオ) 2017/03/08(水) 12:25


たびたびすいません、API宣言部を貼り忘れていましたね。マリオさんありがとうございます。 一応、貼り直しておきます。

 Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
 Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

 Sub test2()
    Dim DC As Long
    Dim DpiX As Long
    Dim DpiY As Long

    DC = GetDC(0)
    DpiX = GetDeviceCaps(DC, 88)
    DpiY = GetDeviceCaps(DC, 90)
    MsgBox DpiX & " DPI(x)" & vbLf & DpiY & " DPI(y)", vbInformation, "画面解像度"
 End Sub
(13:22 OSが64bit版のようなので、64bit環境でも良いように PtrSafe 付加)
(???) 2017/03/08(水) 13:17

 >??? さん

 【32bitのエクセルで使用していた古いAPIを64bitのエクセルでも使用するための方法】については、
 詳しくないのですが、

 ★PtrSafeは、64bitの■エクエルで使用することが想定されるなら、
 APIのDeclareステートメントに付加(Declareの文字の後に、記述!)しましょうってことでしょうか?

 >■OSが64bit版のようなので
 とありましたが、「これはExcelが64bitでも対応できるよに」の意味でしょうか?
 今回は、64bitのエクセルは、ないみたいですが…。
 (No.1〜No.10のPC環境で、エクセルは、すべて32bit)

 また、64bitのエクエルで使用することが想定されるなら、
 「ポインターおよびハンドルには ★LongPtr 型を使用してください」なんて書かれたサイトがありますが、
 ポインターおよびハンドルの見分け方が分かりません。
 Long型で宣言されているものすべてをLongPtr 型にしちゃ、いけないのでしょうか?
 2017/03/08(水) 13:17で記述しているAPIのLong型が、LongPtr 型になってないのは、
 ポインターおよびハンドルがないからでしょうか??

 下記のサイトのことなんだろうけど、全部目通せていません。
http://msdn.microsoft.com/ja-jp/library/office/ee691831%28v=office.14%29.aspx

(マリオ) 2017/03/08(水) 14:32


今すぐに確認できる64bitWINDOWS環境がないため、とりあえず32bit環境でPtrSafeを付けてみてもエラーにはならないので、付けてみた程度です。
LongPtrに変える点は、うっかりしていました。

ちゃんと書こうとすると、64bitOffice対応ならば、以下になるようです。64bitWINDOWSでもOfficeが32bitなら従来通りで良かったかな? 試せると良いのですが。(参考:http://www.jkp-ads.com/articles/apideclarations.asp

 #If VBA7 Then
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function GetDC Lib "USER32" (ByVal hWnd As LongPtr) As LongPtr
 #Else
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function GetDC Lib "USER32" (ByVal hWnd As Long) As Long
 #End If

 64bitOfficeのとき、LongのままにするものとLongPtrにするものの違いは、良く判っていません。(いつも32bit環境なので、深く追っていないという…)
(???) 2017/03/08(水) 16:55

皆さま

お疲れ様です。
申し訳ありません、本日業務の余裕がなく、検証できませんでした。

A1セルの取得に関しては、2017/03/03(金) 23:33にマリオ様からいただいたコードを利用したので、

  Ws.Cells(5, 5) = Ws.Range("A1").Left
  Ws.Cells(5, 6) = Ws.Range("A1").Top
ではなく
    Ws.Cells(4, 5) = "A1セルのLeft"
    Ws.Cells(4, 6) = "A1セルのTop"
    Ws.Cells(5, 5) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96 'ポイント単位
    Ws.Cells(5, 6) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96 'ポイント単位
となっています。
明日、余裕があれば修正して再度検証してみたいと思います。

また、知識がなくすみません、???様のコードは下記でよろしいですか?

 Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
 Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

 Sub test2()
    Dim DC As Long
    Dim DpiX As Long
    Dim DpiY As Long

    DC = GetDC(0)
    DpiX = GetDeviceCaps(DC, 88)
    DpiY = GetDeviceCaps(DC, 90)
    MsgBox DpiX & " DPI(x)" & vbLf & DpiY & " DPI(y)", vbInformation, "画面解像度"
 End Sub

2017/03/08(水) 16:55にご投稿いただいた内容をどのように反映させればよいか分からず、
ご指示いただけましたら幸いです。

結果のご報告時、大変見づらく申し訳ありませんが、
エクセルファイルの持ち出しが出来ないため、テキストでデータを持ち帰らざるを得ない状況です。
申し訳ありませんがご容赦くださいませ。
(かぼ) 2017/03/08(水) 21:24


 >??? さん

 参考URL、お気に入りに登録しました(^^♪これは、いい。ありがとうございます。
 LongPtrを使うか、どうかは、当分は、これを参考にすれば、いいのですね…。
http://www.jkp-ads.com/articles/apideclarations.asp

 私のPC環境が、Windows10(64bit),Excel2013(bit)で、
 今まで、PtrSafe も LongPtr も付加せずに、半年以上APIを使用して問題が起こらなかったので、
 64bitWINDOWSでもOfficeが32bitなら従来通りで良いと思います…? パーハップス??

 #If VBA7 Then'★64bitのエクセルならってことでしたっけ?
 「#」は、何で付加してるんでしょうか??「お決まり」として覚えるしかないのかな?

 βさん、詳しそう(#^^#)
(マリオ) 2017/03/08(水) 21:33

 >かぼ さん

 検証ファイルに取り込んだ元画像の★拡張子、★横幅(ピクセル)、★高さ(ピクセル)、(ビットの深さ、サイズ)
 調べといてくださいね。
  ***************************

 Moduleの上の方、「Option Explicit」の直下に次のAPI(〓で挟まれた箇所)を記述した後に、Sub test2()のプロシージャを記述ですよ。
 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  #If VBA7 Then
    Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongPtr, ByVal nIndex As Long) As Long
    Private Declare PtrSafe Function GetDC Lib "USER32" (ByVal hWnd As LongPtr) As LongPtr
 #Else
    Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
    Private Declare Function GetDC Lib "USER32" (ByVal hWnd As Long) As Long
 #End If
 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
  Sub test2()
    Dim DC As Long
    Dim DpiX As Long
    Dim DpiY As Long

    DC = GetDC(0)
    DpiX = GetDeviceCaps(DC, 88)
    DpiY = GetDeviceCaps(DC, 90)
    MsgBox DpiX & " DPI(x)" & vbLf & DpiY & " DPI(y)", vbInformation, "画面解像度"
 End Sub

 _
 _
 *******************************
  >エクセルファイルの持ち出しが出来ないため、テキストでデータを持ち帰らざるを得ない状況です。 
 エクセルで、名前を付けて保存で、形式を「txt(タブ区切り)」で保存して、家に帰ってから、そのテキストファイルを、エクセルアプリ
 で開けば、よいのでは??(excel2013の場合は、exeは下記の場所にありますが…)
 (自宅で使用しているエクセルは、Excel2010でしたっけ??)
 C:\Program Files\Microsoft Office 15\root\office15\excel.exe

(マリオ) 2017/03/08(水) 21:54


 >#If VBA7 Then'★64bitのエクセルならってことでしたっけ?
 >#」は、何で付加してるんでしょうか??「お決まり」として覚えるしかないのかな?

 ふつうの実行コードの If と、コンパイラーに対するコンパイル条件を指定する If を、コンパイラーが区別するためです。

https://msdn.microsoft.com/ja-jp/library/tx6yas69.aspx

(β) 2017/03/09(木) 07:51


 >かぼ さん

 サンプルファイルを作成してみました。

 ★サンプルファイル作成手順
 (1)test.xlsmに、「Sheet1」と「Sheet2」を作成
 (2)Module1とModule2を作成して下記のコードを貼り付け
 (3)デスクトップに、「画像」フォルダを作成し、そのフォルダ内に、下記の4つのファイルを置いておく。
   ファイルは、自作してください。
 〓〓〓〓〓〓〓〓
 BMP_file.bmp
 GIF_file.gif
 JPG_file.jpg
 PNG_file.png
 〓〓〓〓〓〓〓〓

 なお、横200ピクセル×縦100ピクセルで、画像ファイルを自作したところ、
 すべてのファイルで、垂直方向の解像度:96dpi、水平方向の解像度:96dpiでした。
 また、ビットの深さは、bmpが24,gifが8,jpgが24,pngが32でした。

 (4)Module2の【ub Shapes_AddPictureでシートに画像を挿入する()】を実行して、Sheet1に画像を挿入
 (5)Module1の【Sub 画像位置情報取得()】を実行して、情報を取得

 _
 _

 ■■■■■ ↓ここから(module1) ■■■■■■■■■■■■■■■■■■■■■■■■■■■
 '2017/3/9 16:37 修正しました(☆箇所などを追加、修正)

 Option Explicit

 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
 #If VBA7 And Win64 Then '☆
     Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hdc As LongPtr, ByVal nIndex As Long) As Long
     Private Declare PtrSafe Function GetDC Lib "USER32" (ByVal hWnd As LongPtr) As LongPtr
     Private Declare PtrSafe Function GetSystemMetrics Lib "USER32" (ByVal nIndex As Long) As Long
 #Else
     Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
     Private Declare Function GetDC Lib "USER32" (ByVal hWnd As Long) As Long
     Private Declare Function GetSystemMetrics Lib "USER32" (ByVal nIndex As Long) As Long
 #End If

 Private Const SM_CXSCREEN As Long = 0
 Private Const SM_CYSCREEN As Long = 1
 Private Const LOGPIXELSX As Long = 88 '☆
 Private Const LOGPIXELSY As Long = 90 '☆
 '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

 Sub 画像位置情報取得()
     Application.ScreenUpdating = False
     Application.WindowState = xlMaximized '★Excelを最大化表示
     Dim sh1 As Worksheet, sh2 As Worksheet
     Set sh1 = ThisWorkbook.Sheets("Sheet1") '★画像を貼り付けているシート
     sh1.Activate
     Application.Goto Reference:=sh1.Range("A1"), Scroll:=True '★A1位置にスクロール
     ActiveWindow.Zoom = 100 '★倍率100%
     Set sh2 = ThisWorkbook.Sheets("Sheet2") '★データを記述するシート
     sh2.UsedRange.ClearContents
     sh2.Cells.NumberFormatLocal = "G/標準"

    '***** DPIを取得 ************************************************************
     Dim DC As Long
     Dim DpiX As Long
     Dim DpiY As Long
     DC = GetDC(0)
     DpiX = GetDeviceCaps(DC, LOGPIXELSX) '☆
     DpiY = GetDeviceCaps(DC, LOGPIXELSY) '☆

    '***** Excelのバージョンとbit数を取得 ****************************************
     Dim Excel_Version As String
     Dim Excel_bit As String

     Select Case Application.Version
      Case Is > 16#: Excel_Version = "Excel 2016以降のバージョン"
      Case "16.0": Excel_Version = "Excel 2016"
      Case "15.0": Excel_Version = "Excel 2013"
      Case "14.0": Excel_Version = "Excel 2010"
      Case "12.0": Excel_Version = "Excel 2007"
      Case "11.0": Excel_Version = "Excel 2003"
      Case "10.0": Excel_Version = "Excel 2002"
      Case "9.0": Excel_Version = "Excel 2000"
      Case "8.0": Excel_Version = "Excel 97"
      Case "7.0": Excel_Version = "Excel 95"
      Case "5.0": Excel_Version = "Excel 5.0"
      Case Else: Excel_Version = "Excel(Version?)"
     End Select

     #If VBA7 Then 'Excel2010以降なら
         #If Win64 Then 'Excelのbit数が64bitなら
             Excel_bit = "64 ビット"
         #Else
             Excel_bit = "32 ビット"
         #End If
     #Else 'Excel2007以前なら(64bitはない、32bitのみ)
             Excel_bit = "32 ビット"
     #End If

    '***** OSのシステム情報を取得 **************************************************
     Dim shp As Shape, i As Long
     Dim Locator, Service, OsSet, Os, oClassSet
     Dim osname As String, osbit As String, model As String

     Set Locator = CreateObject("WbemScripting.SWbemLocator")
     Set Service = Locator.ConnectServer
     Set OsSet = Service.ExecQuery("Select * From Win32_OperatingSystem")
     Set oClassSet = Service.ExecQuery("Select * From Win32_ComputerSystemProduct")

     For Each Os In OsSet
         osname = osname & Os.Caption
         osbit = osbit & CStr(Os.OSArchitecture)
     Next Os

     For Each Os In oClassSet
         model = model & Os.Name
     Next Os

   '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    With sh2
        .Cells(1, 1) = "ユーザー"
        .Cells(2, 1) = "モデル"
        .Cells(3, 1) = "エクセルVer."
        .Cells(4, 1) = "OS"
        .Cells(5, 1) = "OSbit数"
        .Cells(6, 1) = "Office bit数"
        .Cells(7, 1) = "解像度"
        .Cells(8, 1) = "DPI(x) - 水平方向"
        .Cells(9, 1) = "DPI(y) - 垂直方向"
        .Cells(11, 1) = "ExcelアプリのLeft(■画面左上基準)"
        .Cells(12, 1) = "ExcelアプリのTop(■画面左上基準)"
        .Cells(13, 1) = "A1セルのLeft(■画面左上基準)"
        .Cells(14, 1) = "A1セルのTop(■画面左上基準)"
        .Cells(15, 1) = "A1セルのLeft(A1セル左上基準)"
        .Cells(16, 1) = "A1セルのTop(A1セル左上基準)"

        .Cells(1, 2) = Application.UserName
        .Cells(2, 2) = model
        .Cells(3, 2) = Application.Version
        .Cells(4, 2) = osname
        .Cells(5, 2) = osbit
        .Cells(6, 2) = Application.OperatingSystem
        .Cells(7, 2) = GetSystemMetrics(SM_CXSCREEN) & "*" & GetSystemMetrics(SM_CYSCREEN)
        .Cells(8, 2) = DpiX
        .Cells(9, 2) = DpiY

        .Cells(11, 2) = Application.Left
        .Cells(12, 2) = Application.Top
        .Cells(13, 2) = ActiveWindow.PointsToScreenPixelsX(0) * 72 / 96
        .Cells(14, 2) = ActiveWindow.PointsToScreenPixelsY(0) * 72 / 96
        .Cells(15, 2) = sh2.Range("A1").Left
        .Cells(16, 2) = sh2.Range("A1").Top

        .Cells(3, 3) = Excel_Version
        .Cells(6, 3) = Excel_bit
    End With

    On Error Resume Next
    i = 0
    For Each shp In sh1.Shapes
        With sh2
            .Cells(i + 18, 1) = "■オブジェクト名"
            .Cells(i + 19, 1) = "Left"
            .Cells(i + 20, 1) = "Top"
            .Cells(i + 21, 1) = "Width"
            .Cells(i + 22, 1) = "Height"
            .Cells(i + 23, 1) = "左上セルアドレス"
            .Cells(i + 24, 1) = "右下セルアドレス"

            .Cells(i + 18, 2) = shp.Name
            .Cells(i + 19, 2) = shp.Left
            .Cells(i + 20, 2) = shp.Top
            .Cells(i + 21, 2) = (shp.Width) * (96 / 72)
            .Cells(i + 22, 2) = (shp.Height) * (96 / 72)
            .Cells(i + 23, 2) = shp.TopLeftCell.Address(0, 0)
            .Cells(i + 24, 2) = shp.BottomRightCell.Address(0, 0)
        End With
        i = i + 8
    Next
    On Error GoTo 0
   '〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

   '***** 後処理 ********************
    sh2.Activate
    sh2.Columns("A:C").AutoFit '★

    Set Service = Nothing
    Set OsSet = Nothing
    Set Locator = Nothing
    Set Os = Nothing

 End Sub
 ■■■■■ ↑ここまで(module1) ■■■■■■■■■■■■■■■■■■■■■■■■■■■

 _
 _

 ■■■■■ ↓ここから(module2) ■■■■■■■■■■■■■■■■■■■■■■■■■■■
 Option Explicit

 Sub Shapes_AddPictureでシートに画像を挿入する()

     Dim sh1 As Worksheet, sp As Shape, myArray As Variant, myPic As Shape
     Dim folder_name As String, z As String, x As String, i As Long, k As Long

     Set sh1 = ThisWorkbook.Sheets("Sheet1") '★

     folder_name = "画像" '★デスクトップに、画像フォルダ
     z = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\" & folder_name & "\"
     If Dir(z, vbDirectory) = "" Then
        MsgBox "デスクトップに、「" & folder_name & "」フォルダが存在しません", vbOKOnly, " 終了します"
        End '終了する
     End If

     myArray = Array("JPG_file.jpg", "BMP_file.bmp", "PNG_file.png", "GIF_file.gif") '★取り込みたい画像

     sh1.Cells.ColumnWidth = 1.88 'セルの幅  (20ピクセル)
     sh1.Cells.RowHeight = 15#    'セルの高さ(20ピクセル)
     sh1.UsedRange.ClearContents '値の全削除

     For Each sp In sh1.Shapes
         If sp.Type <> 8 Then sp.Delete
     Next sp

    '******************************************************************************************
     k = 1
     For i = LBound(myArray) To UBound(myArray)
         x = z & myArray(i)
         Set myPic = sh1.Shapes.AddPicture(Filename:=x, _
                                          LinkToFile:=False, _
                                          SaveWithDocument:=True, _
                                          Left:=0, _
                                          Top:=0, _
                                          Width:=0, _
                                          Height:=0) 'msoPicture(画像)をシートに取り込む
         With myPic
             .Name = myArray(i)
             .ScaleHeight 1, msoTrue
             .ScaleWidth 1, msoTrue
             .Left = sh1.Cells(1, k).Left
             .Top = sh1.Cells(1, k).Top
             .Placement = xlFreeFloating '★セルにあわせて移動やサイズ変更をしない
             sh1.Cells(7, k).Value = myArray(i)
         End With

         k = k + 12
     Next i

 End Sub
 ■■■■■ ↑ここまで(module2) ■■■■■■■■■■■■■■■■■■■■■■■■■■■

(マリオ) 2017/03/09(木) 08:33


#If文は、C言語にあった、宣言部分の条件分岐を採用したのでしょうね。 普通は宣言部分にIf文を使えないじゃないですか。 これを可能にするための構文です。 環境に応じて、どちらか一方の宣言を使用する、という場合に使われます。 C言語では、環境変数に応じて宣言を切り替える際によく利用されていました。

VBA7とは、Office2010から64bit環境のVBA判定用として用意されたものです。 32bit環境の場合はこれが定義されていないので、Else側の宣言が使われる訳ですね。

ちなみに、横着してマジックナンバーとして書いた88と90は、APIの定数ではLOGPIXELSXとLOGPIXELSYです。判りやすく書くならば、これをCONSTで定義すべきですね。(咄嗟に良い参考URLが見つからなかったので、そのまま書いてしまいました)

更に脱線すると、最初に使ったWMIを使う案の場合、グラボの名前等の情報を得る事もできます。
更に更に脱線すると、WMI案、API案の他に、レジストリを参照する案もありました。 でも、WINDOWS8とか10だと、レジストリエントリ名が違うようだったので、ボツにしました。 コードは何かに応用できそうに思えるので、書いておきますね。

 Sub test3()
    Const HKEY_CURRENT_USER = &H80000001
    Dim OBJS As Object
    Dim OBJC As Object
    Dim iw As Long

    Set OBJS = GetObject("winmgmts:\\.\root\cimv2")
    Set OBJC = OBJS.Get("StdRegProv")
    OBJC.GetDWORDValue HKEY_CURRENT_USER, "Control Panel\Desktop", "LogPixels", iw
    MsgBox iw & " DPI", vbInformation, "画面解像度"
 End Sub
(???) 2017/03/09(木) 09:37

 >β  さん、

 VBAは、インタープリタ方式の言語なので、通常の「If...Then...Else」文は、インタープリタ方式として処理される。
 一方、「#If...Then...#Else」とすると、インタープリタ方式の言語が、コンパイル方式(C言語のような方式)に変換される
 ってことでしょうか?
 「#Else」の条件に合致したコードもコンパイル方式に変換されているんですかね?

  ■インタープリタ方式とコンパイル方式について
http://www.cuc.ac.jp/~miyata/classes/prg1/02/2way.html
 インタープリタ方式の言語:BASIC や Perl
 コンパイル方式の言語:C/C++,FORTRAN,COBOL
 コンパイル方式とインタープリタ方式の中間的な方式の言語:Java

(マリオ) 2017/03/09(木) 16:43


 >???  さん

 >#If VBA7 Then
 は、「64bitのエクセルなら」じゃないですね、「excel 2010以降のバージョンなら」ですね。
 「excel 2010以降のバージョン」には、32bitと64bit、の2つのビット数が存在していますね。

 ???さんの「#If...Then...#Else」ディレクティブ構文を使用したAPIですが、
 〓〓〓〓〓〓〓〓〓〓〓〓〓
 #If VBA7 Then'★Excel2010以降以降のバージョンなら
 〓〓〓〓〓〓〓〓〓〓〓〓〓
 のところを
 〓〓〓〓〓〓〓〓〓〓〓〓〓
 #If VBA7 And Win64 Then'★Excel2010以降のバージョンで、かつ、Excelのbit数が64bitなら
 〓〓〓〓〓〓〓〓〓〓〓〓〓
 とした方が、いいのかな…???

 >ちなみに、横着してマジックナンバーとして書いた88と90は、APIの定数ではLOGPIXELSXとLOGPIXELSYです。
 2017/03/09(木) 08:33 の記事のModule1に記述するコード(Sub 画像位置情報取得()プロシージャ)
 を2017/3/9 16:37 に修正しました。(☆箇所などを追加、修正)

 >Sub test3()

 新しいモジュールに、test3を貼り付けて実行したところ、msgboxで、「0 DPI」と表示されるのですが、??
 これも、なにかしらのAPIの宣言が必要なのでしょうか??
 (私のPCの環境は、Windows10(64bit),Excel2013(32bit)です。)

(マリオ) 2017/03/09(木) 16:44


 >かぼ さん

 サンプルファイルを修正しました。(この書き込みは、後で削除します。)
http://d.kuku.lu/0d931f71c0
 シートに貼り付けた画像の位置情報を取得_OSのシステム情報なども表示02.zip
(マリオ) 2017/03/09(木) 17:14

 >VBAは、インタープリタ方式の言語なので、・・・・コンパイル方式に変換されているんですかね?

 ここでいっておられる 【コンパイル方式】というのが、ちょっとあいまいですけど、インタープリータだからということではなく
 コンパイル対象のものに2つあって、実行コード(的なもの)とコンパイラーが実行コードを生成するオプション的なものがあるということです。

 コンパイル言語だけではなく、これは アセンブリィ言語におけるアセンブラーに対しても、そういった
 実行コードとして生成されるものと、アセンブラーに対する生成オプション指定ステートメント(厳密にいえばこれがアセンブラー言語) が
 存在します。

(β) 2017/03/09(木) 17:17


test3は、windowsバージョンによってレジストリの名前が違っていたので、ボツにしたわけです。レジストリエディタで確認してみてください。WINDOWS8の場合は、LogPixelsに何かWIN8っぽい文字列が増えていた記憶があります。WIN10では未確認です。

「VBA7」による判定は、WIN64を調べなくとも良いと思います。今のExcelは、PtrSafe や LongPtr があってもエラーにならないので。(古いExcelだと、エラー停止します)
(???) 2017/03/09(木) 17:46


バージョン違いは、もしかすると「Control Panel」を「ControlPanel」にするだけかも知れません。手元に確認できるPCが無いのがもどかしい…。
あと、WIN10のデフォルトでは、このキーが削除されているらしいです。設定を変えるか、手でキーを追加(DWORD)すれば反応しそう。0ならば96とする、という事ですかね。
(???) 2017/03/09(木) 17:56

皆さま

こんばんは、お世話になります。
結論から申し上げますと、座標の差異はDPIの違いに起因するものという事が分かりました。
本日取得しましたデータは以下に記載いたします。

また、マリオ様よりファイルをアップロードいただいておりましたが、
利用している画像データが既に既存のシートに張り付けられたもののコピーのため、
フォルダから挿入等できず、また、拡張子等も分からず、申し訳ありませんが実施できませんでした。
記載いただいたコードの「Sub 画像位置情報取得」につきましては今回の検証に利用させていただきました。

通りすがり様、マリオ様、β様、???様、アドバイス等くださりましてありがとうございました。
また、数日にかけ小さな疑問にお付き合いいただき感謝しております。
何故DPIの違いで位置ずれが起きるのかは未だ分かりませんが、まずは起因するものが判明し、スッキリいたしました。

■前提
画像のプロパティより、【セルに合わせて移動やサイズ変更をしない】に変更済みです(※おそらく左記は座標ずれには関係なさそうです)
新規ファイルにて検証したため更に画像の位置が変わっています
PC#11はPC#6のディスプレイの設定を「すべての項目のサイズを変更する」⇒「大きくする」に変更したものです
PC#12はPC#6のディスプレイの設定を「すべての項目のサイズを変更する」⇒「小さくする」に変更したものです

■PC情報

 [1] |   |エクセルVer.|OS                              |OSbit数  |Office bit数|解像度   |DPI(x) - 水平方向|DPI(y) - 垂直方向|A1のTop(A1左上基準)
 [2] |  1|Excel 2010  |Microsoft Windows 7 Enterprise  |64 ビット|32 ビット   |1600*900 |              106|              106|                  0
 [3] |  2|Excel 2010  |Microsoft Windows 7 Enterprise  |64 ビット|32 ビット   |1600*900 |データ未取得     |データ未取得     |データ未取得       
 [4] |  3|Excel 2010  |Microsoft Windows 7 Enterprise  |64 ビット|32 ビット   |1600*900 |               96|               96|                  0
 [5] |  4|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1280*1024|               96|               96|                  0
 [6] |  5|Excel 2016  |Microsoft Windows 10 Enterprise |64 ビット|32 ビット   |1920*1080|               96|               96|                  0
 [7] |  6|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|              120|              120|                  0
 [8] |  7|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|              120|              120|                  0
 [9] |  8|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|              120|              120|                  0
 [10]|  9|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|              120|              120|                  0
 [11]| 10|Excel 2016  |Microsoft Windows 10 Enterprise |64 ビット|32 ビット   |1920*1080|              144|              144|                  0
 [12]| 11|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|              144|              144|                  0
 [13]| 12|Excel 2010  |Microsoft Windows 8.1 Enterprise|64 ビット|32 ビット   |1920*1080|               96|               96|                  0

 ■Excelアプリ / A1セル(画面左上基準) / A1セル(セル左上基準)のLeft, Top                    
 [1] |   |アプリのLeft|アプリのTop |   |A1のLeft(画面左上基準)|A1のTop(画面左上基準)|   |A1のLeft(A1左上基準)|A1のTop(A1左上基準)
 [2] |  1|-4.433962264|-5.433962264|   |                     0|                    0|   |                   0|                  0
 [3] |  2|データ未取得|データ未取得|   |データ未取得          |データ未取得         |   |データ未取得        |データ未取得       
 [4] |  3|          -5|          -6|   |                     0|                    0|   |                   0|                  0
 [5] |  4|          -5|          -6|   |                     0|                    0|   |                   0|                  0
 [6] |  5|          -5|          -6|   |                  19.5|                169.5|   |                   0|                  0
 [7] |  6|        -4.4|        -5.4|   |                     0|                    0|   |                   0|                  0
 [8] |  7|        -4.4|        -5.4|   |                     0|                    0|   |                   0|                  0
 [9] |  8|        -4.4|        -5.4|   |                     0|                    0|   |                   0|                  0
 [10]|  9|        -4.4|        -5.4|   |                     0|                    0|   |                   0|                  0
 [11]| 10|        -4.5|        -5.5|   |                    30|               243.75|   |                   0|                  0
 [12]| 11|        -4.5|        -5.5|   |                     0|                    0|   |                   0|                  0
 [13]| 12|          -5|          -6|   |                     0|                    0|   |                   0|                  0

■画像のLeft, Top(サイズはいずれも15.0941734313964*15.1181106567382)

 [1] |   |画像ALeft   |画像ATop    |   |画像BLeft   |画像BTop    |   |画像CLeft   |画像CTop    |   |画像DLeft   |画像DTop    
 [2] |  1|           0|           0|   | 119.5471649| 62.49055099|   | 589.1901855| 96.03173065|   | 657.7939453| 174.1449585
 [3] |  2|データ未取得|データ未取得|   |データ未取得|データ未取得|   |データ未取得|データ未取得|   |データ未取得|データ未取得
 [4] |  3|           0|           0|   |       115.5|          63|   | 569.4354248| 96.79590607|   | 636.1854248| 175.5458984
 [5] |  4|           0|           0|   |       115.5|          63|   | 569.4354248| 96.79590607|   | 636.1854248| 175.5458984
 [6] |  5|           0|           0|   |       115.5|          63|   | 569.4354248| 96.79590607|   | 636.1854248| 175.5458984
 [7] |  6|           0|           0|   | 118.8000031| 64.80000305|   |  585.635437| 99.49590302|   | 654.0354614| 180.4959106
 [8] |  7|           0|           0|   | 118.8000031| 64.80000305|   |  585.635437| 99.49590302|   | 654.0354614| 180.4959106
 [9] |  8|           0|           0|   | 118.8000031| 64.80000305|   |  585.635437| 99.49590302|   | 654.0354614| 180.4959106
 [10]|  9|           0|           0|   | 118.8000031| 64.80000305|   |  585.635437| 99.49590302|   | 654.0354614| 180.4959106
 [11]| 10|           0|           0|   |         121|          64|   | 596.4354248| 98.29590607|   | 665.9354248| 178.2958984
 [12]| 11|           0|           0|   |         121|          64|   | 596.4354248| 98.29590607|   | 665.9354248| 178.2958984
 [13]| 12|           0|           0|   |       115.5|          63|   | 569.4354248| 96.79590607|   | 636.1854248| 175.5458984

※前回、画像のサイズに差異が生じた原因は、シートの倍率を100%にしていなかった事が考えられます。
⇒自PCにて倍率70%の時にシート非表示→表示で差異発生、倍率100%で同じことを行った際はデータに差異が見られなかったため。

元々所定の位置に貼り付けるために、
『位置データをシートに予め記載しておき、記載された画像の位置に貼り付ける』というロジックで組んでいましたが、
DPIの違いで数値に差異が生じる(=ツール制作者側での制御が難しい)という事が分かったため、
所定の位置に既に画像が貼り付けられたお手本シートを用意し、
『お手本シートの画像位置を読み込み、位置データシートに記載、記載された画像の位置を貼り付ける』というロジックに変更いたしました。
少し遠回りのように感じますが、知識のない私に出来る対処法は上記が精いっぱいでした。

皆さま本当にありがとうございました。
もし、何故DPIの差異により座標データに違いが生じるのか、ご存知の方がいらっしゃいましたら是非ご教示いただけましたらと思います。
(かぼ) 2017/03/09(木) 20:28


 抜粋すると、こういう結果なのね

 |No.|画像ALeft   |画像ATop    |画像BLeft   |画像BTop    |DPI(x) - 水平方向|DPI(y) - 垂直方向|
 |  1|           0|           0| 119.5471649| 62.49055099|              106|              106|
 |  2|データ未取得|データ未取得|データ未取得|データ未取得|データ未取得     |データ未取得     |
 |  3|           0|           0|       115.5|          63|               96|               96|
 |  4|           0|           0|       115.5|          63|               96|               96|
 |  5|           0|           0|       115.5|          63|               96|               96|
 |  6|           0|           0| 118.8000031| 64.80000305|              120|              120|
 |  7|           0|           0| 118.8000031| 64.80000305|              120|              120|
 |  8|           0|           0| 118.8000031| 64.80000305|              120|              120|
 |  9|           0|           0| 118.8000031| 64.80000305|              120|              120|
 | 10|           0|           0|         121|          64|              144|              144|
 | 11|           0|           0|         121|          64|              144|              144|
 | 12|           0|           0|       115.5|          63|               96|               96|

(マリオ) 2017/03/09(木) 20:58


すみません、サマリにして貼ればよかったですね。
見易くまとめていただきありがとうございます。
(かぼ) 2017/03/09(木) 21:20

 関連した内容かな?

 エクセルに挿入した画像が小さく表示される
http://sakuraxren.blog103.fc2.com/blog-entry-1264.html

 ■上記サイトより抜粋
 画像の大きさ(ピクセル数)は同じでも、
「解像度(dpi)」の大きな画像をエクセルに挿入すると小さく表示され、
「解像度(dpi)」の小さな画像を挿入すると大きく表示されるということがわかりました。

(マリオ) 2017/03/09(木) 21:41


画像サイズ指定は画面のDPIで変わってしまうので難しいから、セルのサイズ(範囲のサイズでもOK)を基準にして、これに合わせる方法ではいかがでしょうか。
シートを見る人は、見た目のミリメートルよりも、セルの枠線を基準にすると思うので、同じサイズで貼ったように見えますよ。これなら簡単。
(???) 2017/03/10(金) 11:42

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.