Excel 2010 以降のバージョンでシートの倍率が 100% 以外のとき ActiveX コントロールの位置やサイズを VBA から設定すると誤差が生じる

現象
Microsoft Excel 2010 以降のバージョンで、ActiveX コントロールが貼り付けられたシートの倍率が 100% ではない状態で VBA から ActiveX コントロールの Height / Left / Top / Width プロパティを変更すると、VBA に記述した値と異なる値が設定される場合があります。現象の発生状況は、倍率や設定値等によって異なります。

この現象は、シートの倍率以外に以下のような条件を満たす場合に発生します。
  • ActiveX コントロールを貼り付けたシートと異なるシートがアクティブな状態でプロパティを変更する
  • OLEObject.ShapeRange コレクションの Height / Left / Top / Width プロパティを変更する
この現象は、フォーム コントロールや図形でも生じます。
回避策
ActiveX コントロールに Height / Left / Top / Width プロパティを設定するときに、ActiveX コントロールが貼り付けられたシートの倍率を 100% に変更します。
この回避策は、Excel 2010、Excel 2013、Excel 2016 で共通です。
なお、[詳細] セクション [Note] で後述する状況では、この回避策によって現象を回避することはできません。
  • 手動で変更する場合
    1. 対象の Excel ブックを開き、ActiveX コントロールが貼り付けられたシートを表示します。
    2. Excel の [表示] タブ – [ズーム] – [100%] ボタンをクリックします。
  • VBA で変更する場合
    ActiveWindow.Zoom プロパティを使用して ActiveX コントロールが貼り付けられたシートの倍率を変更します。
    以下は VBA からプロパティを変更するときに一時的にシートの倍率を変更するサンプル コードです。
    Sub setProperty()    Dim orgZm As Integer    Dim orgSht As Worksheet    Set orgSht = ActiveSheet    Worksheets(1).Activate    orgZm = ActiveWindow.Zoom    ActiveWindow.Zoom = 100    With ActiveSheet.OLEObjects("CommandButton1")        .Height = 28.5        .Left = 30        .Top = 14.25        .Width = 81.75    End With    ActiveWindow.Zoom = orgZm    orgSht.ActivateEnd Sub
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
詳細
問題の再現手順
以下は Excel 2010 での再現手順です。
  1. Excel 2010 を起動します。
  2. [ファイル] タブ - [新規作成] - [空白のブック] をクリックし、新しいブックを作成します。
  3. [開発] タブ - [挿入] - [ActiveX コントロール] セクションの左上に表示される [コマンド ボタン] をクリックします。[開発] タブが表示されない場合は、[ファイル] タブ - [オプション] - [リボンのユーザー設定] の [メイン タブ] で [開発] のチェックを有効にします。
  4. Sheet1 シートの任意の場所でクリックし、コマンド ボタン コントロールを貼り付けます。
  5. [表示] タブ - [ズーム] をクリックし、25% を選択して [OK] をクリックします。
  6. Sheet2 シートを選択し、アクティブにします。
  7. [開発] タブ - [Visual Basic] をクリックし、Microsoft Visual Basic Editor を開きます。
  8. [VBAProject] 上で右クリックし、[挿入] - [標準モジュール] をクリックします。
  9. 挿入された Module1 をダブルクリックし、以下のコードを記載します。以下のコードは、再現のための一例です。
    Sub setProperty()    With Worksheets(1).OLEObjects("CommandButton1")        .Height = 28.5        .Left = 30        .Top = 14.25        .Width = 81.75    End WithEnd Sub
  10. [開発] タブ - [マクロ] をクリックし、マクロ ウィンドウに表示されるマクロ名 setProperty を選択し、[実行] をクリックします。
結果
[開発] タブ - [デザイン モード] をクリックしてデザイン モードに切り替え、CommandButton1 の右クリック メニュー [プロパティ] で設定された値を確認すると、VBA コードで設定した値と異なる値が設定されています。

Note
回避策を実行しても、いかなる値も Height / Left / Top / Width プロパティに設定できるものではありません。
Height / Left / Top / Width プロパティは、ポイント単位で ActiveX コントロールの位置やサイズを指定しますが、Excel では cm 単位で取り扱うため内部的に変換されることや、これらのプロパティの値は浮動小数点型の値であることなどから、値によっては倍率が 100% であっても誤差が生じます。これは、Excel の仕様です。

本資料では、このような誤差が生じない適切な値を設定する場合においても、シートの倍率が 100% 以外のときに誤差が生じる現象について説明しています。例えば、ActiveX コントロールをマウス ドラッグにより任意の位置・サイズに設定した状態で Height / Left / Top / Width プロパティの値を参照し、この値をそのまま VBA コードから設定しているにも関わらず、シートの倍率が 100% 以外の場合に誤差が生じるような状況を指します。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
Rekvizīti

Raksta ID: 3126737. Pēdējo reizi pārskatīts: 09/29/2016 12:40:00. Pārskatījums: 5.0

Excel 2016, Microsoft Excel 2010, Microsoft Excel 2013

  • kbtshoot kbexpertiseinter kbexpertiseadvanced KB3126737
Atsauksmes