• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【エクセルVBA】シェイプのサイズとセルの縦横)

【エクセルVBA】シェイプのサイズとセルの縦横

このQ&Aのポイント
  • マクロのインプット部分として、四角い図形を置けばそのサイズに合わせてセルの高さと幅を決めてくれるような処理を作りたいと思っています
  • testSheetのB2セルが、もともとのシートの四角いシェイプの置いてあった位置と同じ位置、同じ大きさの四角になるつもりなのですが、なぜかかなり横に長い平たい四角になってしまいます
  • シェイプの位置と大きさをセルの幅に変換する方法がわかる方がいらっしゃったらご指導をお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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をテーマにした質問に以前お応えしたものです。

参考URL:
http://okwave.jp/qa/q8490019.html
WatchGoo
質問者

お礼

詳しい回答ありがとうございます、できない仕様だとは思いませんでした 入力部分をこれで行おうと思っていたんですが、数値がきちんと取ってこれないと困るので、おっしゃる通りシェープでやってみるなど根本から考え直してみようと思います

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

下記で試してください。 targetAreaLeft = Selection.Left / 54 * 8.38

WatchGoo
質問者

お礼

一番の回答ありがとうございます 上の通りほかの方法でやってみることになってしまいました またお世話になることがありましたらよろしくお願いします

関連するQ&A