現象

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.Activate
    End 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 With
    End 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% 以外の場合に誤差が生じるような状況を指します。

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

翻訳品質にどの程度満足していますか?

どのような要因がお客様の操作性に影響しましたか?

その他にご意見はありますか?(省略可能)

フィードバックをお送りいただきありがとうございます!

×