「シートをコピーして新たなブックを作成したらサイズが変わる」事件(未解決)

先日 Excel について、ある調査を依頼されました。カメラ機能で作成した図を含むシートについて、同シートをコピーして新たなブックを作成したところ、この図のサイズが勝手に変わってしまうというのです。

この問題について、オブジェクトの固定などで解決を試みましたが上手くいかず、提出期限を考えると時間切れの状態に。

そこで、真の解決方法には至らないまま、とりあえず以下の方法でお茶を濁すことにしました。

  1. シートのコピーをマクロで行う。
  2. コピー前に、シート内の Shape 全てについて位置とサイズ情報を記録。
  3. コピー後に、記録した情報を同 Shape に反映する。

まず、クラスモジュールを二つ準備します。

↓ ShapeSizeClass

Option Explicit

Public myTop As Double
Public myLeft As Double
Public myHeight As Double
Public myWidth As Double

↓ ShapeClass

Option Explicit
Dim myShapes() As Variant

Private Sub Class_Initialize()
    Dim iMax As Long
        iMax = ActiveSheet.Shapes.Count
    ReDim myShapes(1 To iMax)
    Dim i As Long
    Dim myShape As Shape
        i = 1
        For Each myShape In ActiveSheet.Shapes
            Set myShapes(i) = New ShapeSizeClass
            With myShapes(i)
                .myTop = myShape.Top
                .myLeft = myShape.Left
                .myHeight = myShape.Height
                .myWidth = myShape.Width
                i = i + 1
            End With
        Next
End Sub

Private Sub Class_Terminate()
    Dim i As Long
    Dim myShape As Shape
        i = 1
        For Each myShape In ActiveSheet.Shapes
            With myShapes(i)
                myShape.Top = .myTop
                myShape.Left = .myLeft
                myShape.Height = .myHeight
                myShape.Width = .myWidth
                i = i + 1
            End With
        Next
End Sub

あとは標準モジュールで、シートをコピーするマクロの先頭に、この2行を追加します。

    Dim cl As ShapeClass
    Set cl = New ShapeClass

クラス初期化時に各情報を取得し、最後に同情報でサイズと位置を調整するわけです。

ただしこの方式には、以下の問題があると考えます。
thom.hateblo.jp

実際は、「正しい相手に情報が返っているか」を確認しながら行う必要がありますね。その場しのぎの即席マクロだったし、とりあえず結果が正しかったので良しとしてしまいましたが。

参考まで。