- ベストアンサー
【エクセルVBA】シェイプのサイズとセルの縦横
- マクロのインプット部分として、四角い図形を置けばそのサイズに合わせてセルの高さと幅を決めてくれるような処理を作りたいと思っています
- testSheetのB2セルが、もともとのシートの四角いシェイプの置いてあった位置と同じ位置、同じ大きさの四角になるつもりなのですが、なぜかかなり横に長い平たい四角になってしまいます
- シェイプの位置と大きさをセルの幅に変換する方法がわかる方がいらっしゃったらご指導をお願いいたします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 セル範囲の列幅は、 ピクセル単位の .Width プロパティ(取得のみ可)で設定することは出来ず、 .ColumnWidth プロパティ(取得・設定可)で設定するしかありません。 この.ColumnWidth プロパティがなかなかの曲者で、 1)Excelのオプション・基本設定で規定のフォント・フォントサイズ で決められている半角一文字のピクセル幅 を参照して、列幅の算出方法が変わります。 2)比較的大きな単位(フォントサイズ由来)でサイズを丸めてしまいます。 ' ' 列幅が丸められる例(デフォルトのフォントサイズ:11の場合) Sub check() With Columns(2) .ColumnWidth = 8.31 Debug.Print .ColumnWidth ' → 8.25 .ColumnWidth = 8.32 Debug.Print .ColumnWidth ' → 8.38 End With End Sub なので、残念ながら、そもそものExcelに備わった仕様として、 任意の座標やサイズを正確に、セル範囲にトレースすることは出来ません。 列幅値を計算で求めることはAPIを組み合わせれば可能ですが、 列幅を設定する時に大まかな丸めがあるので、 やるにしても、簡易に近似値を求めるのが妥当、ということです。 もし精度を求めるのであれば、セル範囲の座標とサイズで再現するのではなく、 何らかのシェープを使うのが現実的です。(その場合は変換する必要もないですね) 元々、Excel Worksheet に代表される SpreadSheet は、 細かなレイアウトを実現させるような目的で開発されていないのです。残念ながら。 大まかでもいいから、シェープからセル範囲へ座標とサイズをトレースしたい ということで良ければと、 サンプルコードを(ご提示のコードを補完する形で)挙げておきます。 下記コード中 (PixelX * 4 / 3 - 5) / 8 という計算の内、 " * 4 / 3" は、不変、 " - 5" や " / 8" は、フォントサイズ由来(フォントサイズ:11の場合)です。 Sub Re8728939() Dim targetTop As Single Dim targetLeft As Single Dim targetRowHeight As Single Dim targetColumnWidth As Single If TypeName(Selection) = "Range" Then MsgBox "四角い図形を選択後に実行": Exit Sub On Error GoTo ErrOut_ With Selection targetTop = .Top targetLeft = (.Left * 4 / 3 - 5) / 8 targetRowHeight = .Height targetColumnWidth = (.Width * 4 / 3 - 5) / 8 End With On Error GoTo 0 Workbooks.Add Rows(1).RowHeight = targetTop Columns(1).ColumnWidth = targetLeft Rows(2).RowHeight = targetRowHeight Columns(2).ColumnWidth = targetColumnWidth Exit Sub ErrOut_: MsgBox Err & vbLf & Err.Description End Sub #参考URLは.ColumnWidthをテーマにした質問に以前お応えしたものです。
その他の回答 (1)
- xls88
- ベストアンサー率56% (669/1189)
下記で試してください。 targetAreaLeft = Selection.Left / 54 * 8.38
お礼
一番の回答ありがとうございます 上の通りほかの方法でやってみることになってしまいました またお世話になることがありましたらよろしくお願いします
お礼
詳しい回答ありがとうございます、できない仕様だとは思いませんでした 入力部分をこれで行おうと思っていたんですが、数値がきちんと取ってこれないと困るので、おっしゃる通りシェープでやってみるなど根本から考え直してみようと思います